前提条件
想通过 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
[...]
Impossible de charger les données du jeu.
Vérifiez votre connexion et réessayez.