通过 Github 贡献

通过 Github 贡献

前提条件

想通过 pull request 参与贡献,需要满足以下几个前提:

在深入细节之前,我们先来统一一下用词。下面是使用 Git/Github 时经常会碰到的词汇:

配置

Fork

第一步是前往 Github,为你想贡献的项目创建一个 fork。

例如,想为 Leek Wars 客户端做贡献,就到这里:Leek Wars Client

然后点击右上角的“fork”按钮即可。

fork 项目之后,Github 会在你的账号下创建一个新的 repo,它是原项目的一个副本。

接着获取你这个 Github 仓库的地址:可以直接复制浏览器地址栏的 URL,也可以点击绿色的“Clone or download”按钮。

进入你想存放本地 repo 的位置,执行命令: git clone \ 别忘了把“\”替换成仓库的 URL 地址。

好了,你已经 fork 了项目,并把它拉到了本地机器上。不过,为了以后能顺畅地继续使用它,还有一件事要做。

Upstream

接下来要配置 upstream,有了它你就能根据原项目的仓库来更新自己的仓库。

命令 git remote -v 可以列出已配置的远程地址。

origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch) origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (push)

目前你应该能看到两个配置为 origin 的地址。一个是 fetch,用于从你的 remote(也就是托管在 Github 上的仓库)拉取新内容;另一个是 push,反过来用于把你本地的新内容推送到远程 repo。

现在我们要再加上 upstream。为此,先获取你刚才 fork 的那个项目的地址,同样可以通过 URL 或“Clone or download”按钮获取。

添加 upstream 的命令是:git remote add upstream \

如果再执行一次 git remote -v,你现在应该能看到四条记录:两条属于 origin,两条属于 upstream,每个都分为 fetch 和 push 两条。

origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch) origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (push) upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (fetch) upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (push)

现在你可以开始贡献了!

保持同步

(如果你刚刚才 fork,这一步可以跳过。)

你参与的项目很可能不会一成不变。维护它的人会继续开发,其他人的贡献也可能被接受。

所以你的 repo 很快就会过时,这可能会带来麻烦。

比如某个文件原本包含“A”,而你想提交一个贡献,把“A”改成“B”。可在这期间,也许已经有人把这个“A”改成了“C”。

等你提交修改时,就会出现冲突:文件里已经没有“A”了,自然也就无法把“A”改成“B”。

总之,保持 repo 同步很重要,这样才能避免意外。

别担心,既然你已经配置好了 upstream,这件事就是小菜一碟!

第一步是获取项目 repo 的最新修改。为此要使用 fetch 命令:

git fetch upstream Git 会帮你下载你还没有的修改。

然后用 checkout 命令切换到你想更新的分支。例如 master:

git checkout master

最后,用 rebase 命令让你的 master 分支以 upstream 为基础进行变基。

git rebase upstream/master

这样,Git 会以 upstream 的 master 分支(也就是被 fork 的那个 repo 的 master 分支)为基础,再把你自己的提交依次重新应用到该分支历史的末尾。

运气好的话,如果你的提交没有碰到别人改过的地方,就不会出现冲突。

搞定!你的分支现在已经和项目的分支同步了。

要更新你正在开发的其他分支,也可以在更新完 master 之后如法炮制。

切换到该分支:git checkout \,然后执行 git rebase master

开始贡献

你已经有了 fork?也配置好了 upstream?

很好!是时候准备你的 pull request 了。

第一步大概是想好要实现什么 feature(功能)。欢迎去 repo 的 issues 里找找灵感!Leek Wars 客户端的 issues

接着,你需要创建一个分支来进行修改。这样可以把你的修改隔离开来,比如还能方便地同时准备另一个 pull request。

为此,先切换到 upstream 的 master 分支:

git checkout upstream/master

如果你的 master 分支已经通过上一步与 upstream 同步,也可以直接切换到它:

git checkout master

然后创建你的分支:

git checkout -b maSuperFeature

好了,你已经基于原 repo 的历史为你的 feature 创建了一个分支。只要按上一节的方法保持 upstream 同步,你的修改就总能从 repo 的最新版本出发。

git checkout -b 命令创建了一个分支并切换了过去(可以用 git branch 命令确认:当前所在的分支前面会显示一个 *)。

现在你可以动手修改代码,把你的想法变成现实了。

请记住:一个 pull request 只做一个 feature。这样原 repo 的作者能看到清晰的历史,也可以自由地接受某个 feature 而拒绝另一个。不要把 36 件不相干的事塞进同一个 pull request。

修改完成、并确认一切正常没有 bug 之后,只剩下提交(commit)你的改动了。

方法如下:

git commit -am "Message résumant le commit"

如果你新增了文件,需要这样把它加进来:

git add \

你可以用下面的命令查看哪些文件被修改、哪些已添加或未添加:

git status

如果改动很多,可以考虑按合理的方式把它们拆分成多个提交。

把改动加入提交历史后,只需把这一切推送到 Github:

git push origin \

之后,你就能在 Github 上自己的 repo 里看到这个分支和你的改动了。

最后只剩下创建 pull request 了!

创建 pull request

[...]