承接上文,人傻就要多学习系列,在记录完git
的常用方法后,又学习了github
的灵魂功能pull request
,是团队开发和开源必不可少的工具。
同样,本文没有任何截图,都是文字阐述,更像是我的个人笔记。对纯小白不是很友好,若不喜欢这类形式可以选择性关闭。
Pull Request
Pull Request
(以下简称pr
)是自己修改源代码后,请求对方仓库采纳该修改方式时的一种行为,能更好的实现多人开发。
如发现了一个软件的BUG
并修改后,在github
上发送了pr
,接收方的仓库会创建一个附带源代码的issue
,在这个issue
里详细记录内容。发送过去的pr
是否被采纳,要由接收方的管理者进行判断。如果被接收,pr
的发起者就会变成这个项目的contributor
,也就变成了开源软件的贡献者。
发送pr
发送前的准备
fork
:在对方的仓库中点击fork
按钮,然后会发现自己的仓库中也有了对应的仓库。(当然也可以不用进行fork
,假设团队的成员对仓库都有编辑的权限时,可以免去fork
这一步骤)clone
:复制自己fork
仓库的URL
,建议以SSH
协议将仓库克隆到本地仓库中。此时修改仓库内容并push
,只会修改自己的仓库,不会修改他人的仓库,这也是github
的一大优势。branch
:创建特性分支然后在分支中修改代码,这是个好习惯。因为在给对方仓库pr
时都是发送特性分支,这样对方仓库就能根据分支来更好的理解代码的意图。如修改错别字分支,那么就git branch typo
。git branch -a
查看分支,开头带有remotes/origin/
的是github
端仓库的分支。- 在修改完代码后,提交修改。
git add filename
还有git commit -m "comment"
。 - 要从
github
发送pr
,github
仓库端必须有一个包含了修改代码后的分支,所以就创建本地typo
分支的远程分支,git push origin typo
即可。
发送期间
登录github
并切换到typo
分支,确认发送的内容准确无误后,点击create pull request
,然后在表单中填写本次pr
的理由和改进即可。
再次确认无误后,点击send pull request
,这样,pr
的目标仓库就会新建pr
和issue
,至于对方仓库接收与否,还得看仓库原作者的想法了。
注意事项
在程序的开发过程中,pr
是对软件实现和功能探讨的好方法。当然更建议的是不要写完代码在pr
,而是可以尽早的pr
获得反馈,统一大家的开发思路,提高代码质量。否则一声不吭的写完并pr
后,会导致一个功能开发完毕后才能得到修正,甚至要大幅度改变代码,很浪费经历。
所以,只想要发起讨论的时候pr
即可,不必等代码有所实现。即使对某个正在开发的功能提供简短的伪代码让大家有个印象,也能获得不少反馈。如被他人指正自己没注意到的小错误,或功能的修改意见,或已经有他人实现的代码等,能让自己避免浪费不必要的精力。这种边审查边开发的过程,比开发完在审查高效的多。
但需要注意的是,在发送的一个pr
或者issue
中,不要讨论无关的东西,当需要讨论另外的内容时,重新开一个pr
即可。
仓库的维护
当然在fork
和clone
后想修改代码,但因某些不可避免的原因搁置了。而远程仓库一直在开发,则此时本地的仓库和远程的最新仓库难免有很多不同之处,所以要让本地的仓库保持最新的状态:
- 首先给目标仓库设置一个名称,这里叫上游
upstream
,git remote add upstream git://github.com/user/repo.git
作为远程仓库。 - 然后
git fetch upstream
就能从远程仓库获取最新的代码,将upstream/master
分支与当前分支合并,以此来获取远程仓库的最新状态。
接收pr
接收到他人发送的pr
后,点击即可查看详细内容,在检测完他人发送pr
的代码准确无误后,点击merge pull request
按钮就会将内容自动合并到仓库的主分支。
接收前的准备
- 审查代码,对代码作出必要的注释和评论,点击代码左侧的
+
号即可。 - 将
pr
接收方的仓库clone
到本地(不要操作原有的仓库),如果已经克隆,可以git pull
获取最新状态。 - 然后获取
pr
发送方的仓库,设置为本地仓库的远程仓库:git remote add pr-sender git@github.com:pr-sender/repo.git
,并git fetch
合并。 - 创建用于检测的分支
test
,将fetch
完的分支和test
分支合并,这样test
分支就捕获了他人发送pr
的分支。 - 检查代码无误后
git branch -D test
删除此分支即可。 - 确认无误后,进入浏览器,点击
merge pull request
即可,自动合并仓库,仓库的pr
会自动从open
变为close
。
注意事项
- 无法运行的代码不要合并到仓库;
- 不要发布错误的不能运行的代码;