如何向开源项目提交PR

我在前段时间给 CaddyGitHub CLI 分别提交了一个 PR 并被 Merge,初次体验了参与开源社区贡献的流程,本文我将总结一些经验。

总览

本文假设读者有一定的 Git 基础

当你觉得项目需要改进时:

  • 修复 BUG
  • 增加功能
  • 完善文档
  • 或者其他合理修改目的

你可以在 GitHub 向项目发起 Pull Request 来申请项目合并你修改过的部分。

有一定规模的开源项目都会有完整的贡献流程,你可以在项目中找到CONTRIBUTING.md之类的文件,详细阅读其贡献要求。

对于大多数项目来说,提交 PR 无非如下几步:

  1. Fork 该项目
  2. 在你的 Fork 中新开一个分支
  3. 在新分支中进行修改
  4. 向原项目发起 Pull Request

当然,实际操作流程会根据不同项目变化,比如有的项目会要求提交的 PR 一定要有对应的 Issue,那么在必要的情况下我们需要先开一个 Issue 再发起 PR

发现问题

你需要先有一个问题,然后才能解决问题

一般来说,问题来源有两种方式:

  • 自己在使用的过程中发现 BUG 或者需要改进的地方
  • 在仓库的 Issues 中浏览,寻找自己可以解决的问题

对于第一种情况,发现问题后需要反复测试,确保可复现,并上报官方仓库,在 Issue 中讨论,并表示自己可以尝试解决该问题

对于第二种情况,大部分仓库都会对 Issue 打标签,你可以使用help wanted, pr welcome等标签过滤,帮助你快速找到 Issue

解决问题

修改代码

毫无疑问的是,你需要先 Fork 原来的仓库。

对于大部分情况,我的建议是将 Fork 后的仓库 Clone 到本地,或者在 Code Spaces 中修改。如果你的修改粒度很小,比如修正拼写等,那你可以在网页中直接进行操作。

在本地操作的过程:

  1. git clone
  2. git checkout -b <your-branch-name
  3. 使用自己喜欢的编辑器修改代码

如果你的修改量特别大,建议拆分为多个 commit 以增加可阅读性

通过测试

写完的代码当然要先测试通过了再推送咯。

  • 一般来说,项目的测试流程会通过贡献文档说明,按照其描述来即可完成本地测试。

  • 许多开源项目已经配置了 GitHub Actions CI/CD 流程,只要你将代码推送到个人 Fork 仓库,并且确保仓库的 Actions 是开启状态,那么就可以通过 GitHub Actions 来进行自动化测试,你只需要等结果就好了。

推送代码到个人 Fork

使用git push即可将完成的修改推送到 GitHub。

发起 Pull Request

推荐在 Issue/Pull Request 中使用 #ID 的形式进行相互引用

Linking a pull request to an issue - GitHub Docs

现在,你可以准备发起一次 Pull Request。

有的项目建议发起 Issue,随后再发起 PR。例如我在 Caddy 中的一次贡献,我首先发起了PR,随后发起 Issue (其实我搞反了,不过没人在这种事情上较真,对吧?)。

有的项目,你可以直接发起 PR,如果有,则最好链接到相关的 Issue,比如我在 cli/cli 中的 这个 PR

在你发完之后,就可以等待相关人员对你的 PR 进行回应了。

Review

如果你的 PR 是合理的,将会有一个或者多个人对你的代码进行 Review。

如果所有 Reviewer 都 Approve 了你的代码,那么不久后将进行 Merge 操作。

当然,如果 Reviewer 对你的代码有问题,他们会在对应代码下进行留言讨论,如果他们觉得你的代码需要修改,就会发起一次修改请求,详见下节

Requested changes

现在,你需要根据要求修改你的代码。

正确的流程是:

  1. 直接打开本地 Fork 仓库,在之前的分支上继续进行修改
  2. 使用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 流程,希望对你有所帮助。

Author

BakaFT

Posted on

2022-11-11

Updated on

2025-11-17

Licensed under

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×