如何向开源项目提交PR
我在前段时间给 Caddy 和 GitHub CLI 分别提交了一个 PR 并被 Merge,初次体验了参与开源社区贡献的流程,本文我将总结一些经验。
总览
本文假设读者有一定的 Git 基础
当你觉得项目需要改进时:
- 修复 BUG
- 增加功能
- 完善文档
- 或者其他合理修改目的
你可以在 GitHub 向项目发起 Pull Request 来申请项目合并你修改过的部分。
有一定规模的开源项目都会有完整的贡献流程,你可以在项目中找到CONTRIBUTING.md之类的文件,详细阅读其贡献要求。
对于大多数项目来说,提交 PR 无非如下几步:
- Fork 该项目
- 在你的 Fork 中新开一个分支
- 在新分支中进行修改
- 向原项目发起 Pull Request
当然,实际操作流程会根据不同项目变化,比如有的项目会要求提交的 PR 一定要有对应的 Issue,那么在必要的情况下我们需要先开一个 Issue 再发起 PR
发现问题
你需要先有一个问题,然后才能解决问题
一般来说,问题来源有两种方式:
- 自己在使用的过程中发现 BUG 或者需要改进的地方
- 在仓库的 Issues 中浏览,寻找自己可以解决的问题
对于第一种情况,发现问题后需要反复测试,确保可复现,并上报官方仓库,在 Issue 中讨论,并表示自己可以尝试解决该问题
对于第二种情况,大部分仓库都会对 Issue 打标签,你可以使用help wanted, pr welcome等标签过滤,帮助你快速找到 Issue
解决问题
修改代码
毫无疑问的是,你需要先 Fork 原来的仓库。
对于大部分情况,我的建议是将 Fork 后的仓库 Clone 到本地,或者在 Code Spaces 中修改。如果你的修改粒度很小,比如修正拼写等,那你可以在网页中直接进行操作。
在本地操作的过程:
git clonegit checkout -b <your-branch-name- 使用自己喜欢的编辑器修改代码
如果你的修改量特别大,建议拆分为多个 commit 以增加可阅读性
通过测试
写完的代码当然要先测试通过了再推送咯。
一般来说,项目的测试流程会通过贡献文档说明,按照其描述来即可完成本地测试。
许多开源项目已经配置了 GitHub Actions CI/CD 流程,只要你将代码推送到个人 Fork 仓库,并且确保仓库的 Actions 是开启状态,那么就可以通过 GitHub Actions 来进行自动化测试,你只需要等结果就好了。
推送代码到个人 Fork
使用git push即可将完成的修改推送到 GitHub。
发起 Pull Request
推荐在 Issue/Pull Request 中使用 #ID 的形式进行相互引用
现在,你可以准备发起一次 Pull Request。
有的项目建议发起 Issue,随后再发起 PR。例如我在 Caddy 中的一次贡献,我首先发起了PR,随后发起 Issue (其实我搞反了,不过没人在这种事情上较真,对吧?)。
有的项目,你可以直接发起 PR,如果有,则最好链接到相关的 Issue,比如我在 cli/cli 中的 这个 PR。
在你发完之后,就可以等待相关人员对你的 PR 进行回应了。
Review
如果你的 PR 是合理的,将会有一个或者多个人对你的代码进行 Review。
如果所有 Reviewer 都 Approve 了你的代码,那么不久后将进行 Merge 操作。
当然,如果 Reviewer 对你的代码有问题,他们会在对应代码下进行留言讨论,如果他们觉得你的代码需要修改,就会发起一次修改请求,详见下节
Requested changes
现在,你需要根据要求修改你的代码。
正确的流程是:
- 直接打开本地 Fork 仓库,在之前的分支上继续进行修改
- 使用
git push推送到远程 Fork 仓库
在这一系列操作之后,你可以查看你的 Pull Request 页面,它已经根据你的操作,自动修改了 PR 中的提交内容。
也就是说,一次 PR 是以两个分支之间的差异为单位的,你可以任意增加 Commit,也可以删除(会显示为 Outdated,但是已经在 GitHub 保存),所以要熟悉运用git rebase进行操作。
你可以看看 这个 PR, 我在被要求更改之后,一通操作删除了之前被评论的 Commit,并且新增了一些 Commits。
Merge
如果所有 Reviewer 都 Approve 你的代码,那么你的代码就会被 手动/自动/推迟计划到某个版本 进行 Merge,这取决于不同仓库的配置和规划。比如我的第一个 PR 是被手动 Merge 的,而第二个是在所有 Reviewer 审核 Approved 之后,由机器人自动 Merge。
结束
以上就是常见的 Pull Request 流程,希望对你有所帮助。