1. 如何寻找一个合适的开源项目

2. 寻找贡献点

  1. 在Issues里面,可以找到带有good firest issue标签标记的issue
  2. 找到合适的issue之后,在下面留言,等待项目管理员回复,将该issue分配给你
  3. 在正式开工之前,需要过一遍该项目的CONTRIBUTING.md文档,明晰该项目的贡献规范

3. 开工

  1. Fork项目仓库
  2. 将项目仓库克隆到本地
  3. 配置git remote,注意git remote的pull配置为云端仓库,而push则配置为garbege,注意本地的代码变更永远只提交到origin,然后通过 origin 以提交 Pull Request 的形式请求与upstream合并
1
2
git remote add upstream https://github.com/${USER}/${PROJECT}.git # 运行完这一步remote的 push和 pull url 均被设置为https://github.com/${USER}/${PROJECT}.git
git remote set-url --push upstream no_push
  1. 不太建议直接在main分支上进行开发,可以先创建一个更可读的分支来完成开发,一般命名为feat-xxx
1
git checkout -b feat-xxx
  1. 在本地进行开发,更新本地分支的代码,注意每次开工之前都需要先将云端最新的更新同步下来
1
2
3
git fetch upstream
git checkout main
git rebase upstream/main
  1. 正常流程add,commit,注意commit的时候一般要加上-s参数,用来标记证书审查。另外有的项目对commit的message格式有要求
  2. 将代码push到之前fork的云端仓库中
1
git push origin feat-xxx

4. 在github中操作,提出一个PR

一般完成push之后,如果这个仓库是你fork来的,那么github会在repo头部提示让你开一个Pull Request image.png 如果没有的话,也可以切换到feat-xxx分支,然后点击下方的“Contribute”按钮开启一个PR,或者直接点Issuses边上的Pull Request按钮进入对应页面 一般来说,提交的PR都有项目管理员预设的文档模板,需要根据文档格式编写提交PR的文档,使得管理员可以明晰你所做的工作,解决的问题,以及通过测试的情况,一般的模板需要包含以下内容:

  1. Pre-Checklist:这里列了3个前置检查项,提醒 PR 提交者要先阅读 Contributing 文档,然后代码要有完善的注释或者文档,尽可能添加测试用例等;
  2. Description:这里填写的是 PR 的描述信息,也就是介绍你的 PR 内容的,你可以在这里描述这个 PR 解决了什么问题等;
  3. Related Issues:记得吗?我们在开始写代码之前其实是需要认领 issue 的,这里要填写的也就是对应 issue 的 id,假如你领的 issue 链接是 https://github.com/devstream-io/devstream/issues/796,并且这个 issue 通过你这个 PR 的修改后就完成了,可以关闭了,这时候可以在 Related Issues 下面写“close #796”;
  4. New Behavior:代码修改后绝大多数情况下是需要进行测试的,这时候我们可以在这里粘贴测试结果截图,这样 reviewers 就能够知道你的代码已经通过测试,功能符合预期,这样可以减少 review 工作量,快速合入。

提交完成之后,可能会执行预设的CI,检查提交的代码,如果有的测试样例没有通过,则需要修复,直至通过所有的样例。 后续有新的变更(例如根据Reviewers的意见修改或者自行作出的变更),可以直接git push origin feat-xxx来进行提交,github会帮你把新增的commits全部追加到一个未合入的PR里面去。

5. 合并commit

  • git命令行方式合并
1
2
# 合并HEAD和HEAD指向的前一个,共两个commit,这里也可以给出commit list(版本号表示)
git rebase -i HEAD~2

这样根据流程先后配置需要保留和舍弃的commit、解决冲突以及修改commit message等,就可以合并若干个commit,生成简洁有效的变更信息了。注意,这样合并完之后再向云端push的时候,需要加入-f参数强制执行,冲掉之前的变更信息

6. 解决PR产生的冲突

  • 在线解决冲突,可以直接在github里面查看并修改冲突的文件,需要删掉所有的 ''<<<<<<<''、''>>>>>>>'' 和 ''======='' 标记,只保留最终想要的内容,以这种方式解决的冲突会在github上产生一条变更记录
  • 本地解决冲突
1
2
3
4
5
6
# 先切回到 main 分支
git checkout main
# 拉取上游代码(实际场景肯定是和上游冲突,我们这里的演示环境其实是 origin)
git fetch upstream
# 更新本地 main(这里也可以用 rebase,但是 reset 不管有没有冲突总是会成功)
git reset --hard upstream/main

然后我们要将 main 分支的代码合入自己的特性分支,同时解决冲突。

1
2
git checkout feat-1
git rebase main

7. 修改commit信息

用下面的命令可以修改commit信息

1
git commit --amend

如果是在commit的时候忘记了-s参数,则可以使用下面的命令自动加上

1
git commit --amend -s