1. 首先 “Fork” 他人的 repository(代码仓库)
“Fork” 的名词是 “叉子” 的意思,不过这里取的是动词 “分叉,建一个分支” 的意思。进入你想参与合作开发的仓库界面,点击右上角的 “Fork” 图标,此时你已经复制了一个副本在你的 GitHub 仓库中了,或者是说一个新的代码仓库被创建了,可以打开你的 GitHub 主页看一看。
注意,这个远程仓库是属于你自己的。这里 “Fork” 不同于 “Clone”,“Clone” 是发生在你的本地机器中,相当于你复制了一个完全相同的副本在你的终端上,但该副本的远程仓库连接的仍然是原作者的仓库,所以你并不是这个项目仓库的拥有者,没有更新它的权限。
因此,“Fork” 正是我们所需要的。
点击之后可以看到,自己帐号内有一个新的代码仓库被创建了。
然后将这个代码仓库 “Clone”(克隆)到你的本地机器中,可以使用命令行或者 IDE(比如 Intellij IDEA)的 VCS 功能来实现。“Clone” 成功之后你就可以自主修改里面的内容,然后 “Push” 到远程仓库中,注意,这是你自己的远程仓库。但是不使用 “Fork”,而是直接 “Clone”(克隆)原作者的仓库的话,你会得到一个 “fatal: unable to access” 的提示,无法访问。
在这一环节,所有的修改只发生在你的远程仓库中,原作者的代码仓库内容是不会发生任何改变的。这里最需要理解的是,“Clone” 下来的本地仓库连接的是你 GitHub 上的远程仓库。
2. 开始参与开发前的一些准备
(1)在你做任何开发前,最好先详细阅读该项目的 CONTRIBUTING.md 文件。
(2)浏览该项目的 Issues(问题)公告,甚至可以自己创建一个 Issue。
(3)一般不要将自己做的修改提交到 master branch(主分支)上,而是应该提交到某个明确的 topic branch(主题分支,解决某个bug或者添加某一功能的分支)上。注意,我们应该自己建一个 topic branch,然后在上面作修改,而不在 master 分支直接修改,因为这样更具有直观性。
(4)最好每次只提交较小的修改,并写好清晰明确的 Commit Messages(提交说明).
(5)如果有需要,请更新 README 文件。
3. 创建一个 Pull Request
按自己的需要去修改项目内容,然后将所做的修改提交(Add+Commit)到自己的代码仓库,接着到仓库页面,点击 New pull request 按钮。
点击去之后可以看到,左边红框是你 “Fork” 的原项目仓库和分支,右边红框是你当前选择的项目仓库和分支。其实这里就是将两个红框内的内容作对比,并把不相同的地方显示出来。因为此时两个仓库和分支的内容是完全一样的,所有没有什么信息显示出来(我没有做修改)。不太理解的话,可以自由去尝试四个下拉框里不同的选项,很快你就会知道是怎么回事了。
我这里任意选择了原项目的另一个分支,因为这两个分支不完全相同,所以可以看到出现了一个 “Create pull request” 的按钮,点击它。
填写你的请求信息,说明你做了些什么之类的。这个请求是发给该项目的维护者(拥有者)的,完成之后点击 “Create pull request” 按钮即可。
之后项目的维护者会受到你的请求,只要他/她通过了你的请求,你所做的修改就会被整合到原项目的仓库里了。
左边是你的本地仓库,中间是你在 GitHub 上 Fork 建立的仓库,右边是项目的原仓库。
4. 与原仓库保持同步更新
说到合作开发就会有一个问题,如何与他人的代码保持同步?在自己做开发的过程中,难免会遇到你 “Fork” 的项目已经有了新的更新,这时当然是希望自己仓库中的代码也能同步进行更新。可是,你本地仓库所连接的远程仓库的是你自己的 GitHub 仓库,而不是原作者的仓库。解决方法其实很简单,为你的本地仓库再添加一个远程仓库源。
查看当前项目所连接的远程仓库
打开终端,进入到项目的 Git 仓库所在目录,一般就是项目目录,输入:
git remote -v
可以看到目前只连接了我自己的远程仓库。
添加原作者的远程仓库连接
git remote add upstream https://github.com/GoogleChrome/lighthouse.git
(注意替换原仓库的 http 链接)
如图,现在已经成功添加原项目的远程仓库了。
还差一点就大功告成了
(1)从原仓库获取最新版本到本地
git fetch upstream master
(2)保证当前位于 master 分支上
git checkout master
(3)将最新版本整合到本地 master 分支上
git merge upstream/master
(4)将更新发送到自己的 GitHub 仓库里
git push origin master
(1)(2)(3)步可以用
git pull upstream master
这条命令替代,可以这样不太安全,因为你 fetch(获取)之后可以通过
gitlog--oneline --graph --decorate --all
来查看更新的情况,再决定是否 merge(整合)到一起。