如何为Github开源项目提交PR完整版
1. Fork代码到自己的repository
打开https://github.com/Repo-Name/Project-Name
登录Github账号
点击右上角的Fork
稍等片刻,即可fork一个分支到自己的repository
之后再本地运行
git clone https://github.com/Your-Repo-Name/Project-Name.git
即可将fork出来的repostitory clone到本地
但若你自己的repository还保留有之前fork过的版本,则需要你手工更新fork的版本,才能与原来的版本保持同步
2. 更新Fork版本与最新版同步
这里引用的是来自[1]的回答
git remote add upstream https://github.com/whoever/whatever.git
# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:
git fetch upstream
# Make sure that you're on your master branch:
git checkout master
# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:
git rebase upstream/master
git push -f origin master
3. 本地更改代码并提交
一般分六步:
创建分支;修改代码;git add;git commit;git push;发起PR
- git checkout -b 分支名
- 修改代码
- git add .
- git commit -a -m “问题描述”
- git push
此时,git会自动给出提示,告诉你向哪里push,复制粘贴就好 - 到Github自己的repository中,点击PR按钮就可以了。其实如果是刚提交,屏幕中会有提示PR的链接,点击该链接就可以了
最后,按要求填写PR的相关信息,提交PR,之后就是等待测试通过和开发者的confirm和merge了
注意:提交代码一定要遵循开源项目提供的规范,无论是代码格式、分支/commit信息、还是PR或issue的格式,一定不能少。
比如,
- 在修改代码后按规范的要求,在本地测试、代码format等都完成后,再提交。除此之外,要仿照项目 之前的代码风格和注释,不要另搞一套。
- 有的开源项目要求commit名是“目录名: 解决问题的描述”,甚至对branch名也有一定要求
- 有的开源项目要求签上您的大名,git commit -s “commit message”,如果忘记,bot会提醒你;有的网站会明确表示不要签名,一定要看清楚
- 有的网站还会要求先签署协议,一般按照bot提示来做就好
- 即使没有明确说明,一个PR最好也只用来解决一个/一类明确的问题,有的项目会限制一个PR中最好只保留一个commit,下面我们来看下怎么合并commit
4. 提交出错了怎么办
即使在线测试出错,不要慌张,点击查看日志,很多其实与你提交的代码无关,只是不过是测试系统或其他代码的bug,开发者那边也会检查确认的。
如果真的是自己的错误,或者开发者有其他要求,需要你修改代码,那么此时本地可能会产生两个甚至更多commit,最好将其合并起来。
git rebase -i HEAD~2
以上命令可以合并最近两个commit
然后在交互式文本编辑器中,
把不想保留的commit从pickup改为squash,然后修改下commit message就可以了
如果仅仅是commit message需要修改,那只要git commit --amend
最后不要忘记
git push -f
强制提交,这样PR就会收到新的commit,然后开始重新测试
5. 大多数开发者是友好的,要始终保持积极的态度
多数开发者会积极回复、沟通。但开发者也有很多难处,可能很久都没能答复,这时请不要着急,耐心等待几周。
比如,开发者刚冻结代码准备发布新版本之类的。越是大的项目,review的时间就越久。当然也有可能是项目年久失修或人手不足,实在等不及的话,再直接向开发者询问。
最后,祝愿大家在为开源项目做贡献的过程中,能够找到自己的乐趣。
[1] https://stackoverflow.com/questions/7244321/how-do-i-update-a-github-forked-repository