原文连接:如何使用 GitHub Flow 给开源项目贡献代码html
GitHub 是什么?git
GitHub 是经过 Git 进行版本控制的软件源代码托管服务。
截止到 2015年,GitHub 已经有超过 2800 万注册用户和 7900 万代码库。事实上已经成为了世界上最大的代码存放网站和开源社区。
因此,若是你想要给开源项目贡献代码或者翻译文档,学会如何使用 GitHub 来正确地贡献代码是必不可少的。github
https://github.com/golang/go
记录在某处。yourname
。打开示例仓库的 URL,在右上角点击 Fork
按钮后,开始等待完成。golang
等待的时间视仓库的大小而定。shell
在 fork
完成后,你应该能够在你本身的 GitHub 仓库看到同名的一个项目。并发
它的 URL 应该为:https://github.com/yourname/go
。post
发现了吗?这里 URL 的变化只不过是将本来的 golang
替换成了 yourname
。fetch
这个 fork
后的项目是你本身能够随意修改而不会影响到真正的 go
项目的。下面咱们把它称之为副本仓库。网站
在没有示例仓库的 push
权限的状况下,想要作出的修改可以反映到示例仓库,也就是原始仓库,还须要作接下来的一些操做。spa
把你 fork
后的副本仓库 clone
到本地。
git clone https://github.com/yourname/go go # clone 到本地的 go 目录
进入仓库目录后,可使用以下命令建立并切换到 test
分支。
git checkout -b test # 建立并切换到 test 分支
在这个 test
分支下通过一些修改后,你须要提交这些修改到本地仓库。
可使用相关命令:
git add -A # 添加全部文件 git commit -m 'Add test' # 提交 commit
先别急着 push
,咱们还有个大问题要解决。
前面已经说过,在副本仓库作的修改是不会影响到原始仓库的。一样,在原始仓库的更新也不会反映到副本仓库来。
在 GitHub,若是你副本仓库的进度落后于原始仓库还坚持发起 Pull Request
,后果只会是被拒绝。
那么问题来了,咱们应该如何同步原始仓库的更新呢?
答案是:区别于 origin
,它是用来向副本仓库提交更新的远程仓库;咱们添加一个 upstream
,也被称为 上游
是专门用来同步原始仓库更新的远程仓库。
在默认状况下,在你 clone
后的仓库目录里,git
已经自动将 origin
和你的副本仓库关联在一块儿了,也就是 https://github.com/yourname/go
。
你能够经过以下命令查看。
git remote -vv # 两个 verbose 参数查看远程仓库
而后,经过以下命令添加这个 upstream
,使用这个名字只是约定俗成,你能够用你以为更好的名字来替换它。
git remote add upstream git@github.com:golang/go.git # 添加 upstream 远程仓库
如今,咱们假设在作出修改后,上游(upstream)已经更新了不少提交。
此时若是对上游的变化视而不见,强行 push
并发起 Pull Request
仍是会被拒绝。
能够经过以下命令拉取并合并上游的更新:
git checkout master # 切换到默认存在的 master 分支 git pull --rebase upstream master:master # 使用 rebase 模式拉取 upstream/master 上的更新 # 且与本地的 master 合并。第一个 master 是远程分支,第二个是本地分支。 git checkout test # 切换到前面创建的 test 分支 git rebase master # 使用 rebase 模式合并本地的 test 和 master 分支
也能够经过另外一种方式:
git checkout master # 切换到 master 分支 git fetch upstream master # 获取 upstream 上的 master 分支 git checkout test git rebase upstream/master # 使用 rebase 模式合并本地的 test 和 upstream/master 分支
总的来讲,能够把本地的 master
分支看成一个只负责从上游获取更新的分支,全部本地的改动都不会直接在 master
上面进行。
而是先将上游的 master
和本地的 master
合并,此时,本地的 master
是上游的最新版本;
再经过合并 test
和本地的 master
来完成本地改动的更新。整个过程在未开始合并以前,你的代码更新应该只会出如今 test
分支上。
注意:在使用 git rebase
相关的命令时,须要谨慎应用在已经提交的更新或远程仓库上。
如今,咱们已经完成代码的修改、上游的同步更新而且完成了合并。
接下来应该将代码 push
到副本仓库。
git push origin test # 将本地 test 分支的代码 push 到 origin 的 test 分支 # 若是该分支不存在则会建立
这个 push
只会更新副本仓库,并不会影响到原始仓库。
要将代码贡献到原始仓库,还要发起 Pull Request
。
现代的 GitHub 网站已经为咱们发起 Pull Request
作了大多数的幕后工做。下面分别说明两种方法:
push
代码后,直接登陆到 GitHub 网站,它会智能识别并弹出按钮 Compare & pull request
,点击后填写一些信息便可发起。 New pull Request
。出现以下界面:
再点击 Create pull request
后填写一些信息便可。
接下来,原始项目的相关负责人就会审查(review)你的提交,并决定是经过仍是拒绝。
Pull Request
后无人理会,作了许多无谓的工做。发生这种状况多是负责人已经放弃了这个项目。 至此,咱们已经完成使用 GitHub Flow 向开源项目贡献代码的所有步骤。