1. 如何寻找一个合适的开源项目
- 可以选择知名的开源软件基金会的孵化项目,比如Apache基金会、Linux基金会、CNCF等寻找一个不那么成熟,但是又形成了代码规范、协作流程规范的入门项目
2. 寻找贡献点
- 在Issues里面,可以找到带有good firest
issue标签标记的issue
- 找到合适的issue之后,在下面留言,等待项目管理员回复,将该issue分配给你
- 在正式开工之前,需要过一遍该项目的CONTRIBUTING.md文档,明晰该项目的贡献规范
3. 开工
- Fork项目仓库
- 将项目仓库克隆到本地
- 配置git remote,注意git
remote的pull配置为云端仓库,而push则配置为garbege,注意本地的代码变更永远只提交到origin,然后通过
origin 以提交 Pull Request 的形式请求与upstream合并
1 2
| git remote add upstream https://github.com/${USER}/${PROJECT}.git git remote set-url --push upstream no_push
|
- 不太建议直接在main分支上进行开发,可以先创建一个更可读的分支来完成开发,一般命名为feat-xxx
1
| git checkout -b feat-xxx
|
- 在本地进行开发,更新本地分支的代码,注意每次开工之前都需要先将云端最新的更新同步下来
1 2 3
| git fetch upstream git checkout main git rebase upstream/main
|
- 正常流程add,commit,注意commit的时候一般要加上
-s
参数,用来标记证书审查。另外有的项目对commit的message格式有要求
- 将代码push到之前fork的云端仓库中
1
| git push origin feat-xxx
|
4. 在github中操作,提出一个PR
一般完成push之后,如果这个仓库是你fork来的,那么github会在repo头部提示让你开一个Pull
Request
如果没有的话,也可以切换到feat-xxx分支,然后点击下方的“Contribute”按钮开启一个PR,或者直接点Issuses边上的Pull
Request按钮进入对应页面
一般来说,提交的PR都有项目管理员预设的文档模板,需要根据文档格式编写提交PR的文档,使得管理员可以明晰你所做的工作,解决的问题,以及通过测试的情况,一般的模板需要包含以下内容:
- Pre-Checklist:这里列了3个前置检查项,提醒 PR
提交者要先阅读 Contributing
文档,然后代码要有完善的注释或者文档,尽可能添加测试用例等;
- Description:这里填写的是 PR
的描述信息,也就是介绍你的 PR 内容的,你可以在这里描述这个 PR
解决了什么问题等;
- Related
Issues:记得吗?我们在开始写代码之前其实是需要认领 issue
的,这里要填写的也就是对应 issue 的 id,假如你领的 issue 链接是 https://github.com/devstream-io/devstream/issues/796,并且这个
issue 通过你这个 PR 的修改后就完成了,可以关闭了,这时候可以在 Related
Issues 下面写“close #796”;
- New
Behavior:代码修改后绝大多数情况下是需要进行测试的,这时候我们可以在这里粘贴测试结果截图,这样
reviewers 就能够知道你的代码已经通过测试,功能符合预期,这样可以减少
review 工作量,快速合入。
提交完成之后,可能会执行预设的CI,检查提交的代码,如果有的测试样例没有通过,则需要修复,直至通过所有的样例。
后续有新的变更(例如根据Reviewers的意见修改或者自行作出的变更),可以直接git push origin feat-xxx
来进行提交,github会帮你把新增的commits全部追加到一个未合入的PR里面去。
5. 合并commit
这样根据流程先后配置需要保留和舍弃的commit、解决冲突以及修改commit
message等,就可以合并若干个commit,生成简洁有效的变更信息了。注意,这样合并完之后再向云端push的时候,需要加入-f
参数强制执行,冲掉之前的变更信息
6. 解决PR产生的冲突
- 在线解决冲突,可以直接在github里面查看并修改冲突的文件,需要删掉所有的 ''<<<<<<<''、''>>>>>>>'' 和 ''======='' 标记,只保留最终想要的内容,以这种方式解决的冲突会在github上产生一条变更记录
- 本地解决冲突
1 2 3 4 5 6
| git checkout main
git fetch upstream
git reset --hard upstream/main
|
然后我们要将 main 分支的代码合入自己的特性分支,同时解决冲突。
1 2
| git checkout feat-1 git rebase main
|
7. 修改commit信息
用下面的命令可以修改commit信息
如果是在commit的时候忘记了-s
参数,则可以使用下面的命令自动加上
License:
Copyright (c) 2023 CC-BY-NC-4.0 LICENSE