如何在 Github 上规范的提交 PR(图文详解)

3,856 阅读5分钟

之前写过一篇文章,总结了2021年自己参与过的开源项目和经验总结。但只是记了一些流水账,没有整理过具体的操作流程。正巧,最近在看一个 Github 项目 (github.com/leerob/leer…),在里面发现了一个小问题。遵循 GitHub 官方推荐的基本协作流程,给项目提交了 issue 和 PR (Pull Request)。过了两天,作者给了我反馈,并合并 (merge) 了我的提交请求 (PR)。借这个机会,根据 GitHub Docs 提供的开源项目协作流程,并结合本次实践经历,总结了一下通过 GitHub 进行项目协作的完整流程。这个流程不只适用于个人提交开源贡献,也适用于公司或团队内部之间的 Git 项目协作。

GitHub 官方项目协作流程整理

1. 找项目 (Finding projects)

这个很简单,确定目标项目,这里是:

友情提示: 1. 做开源贡献之前,可以先看看有没有人在 issue 和 PR 中,有没有人已经提出过与你观点相同和相近的反馈意见或修改提交。注意作者是怎么回复的,避免浪费自己时间。

如果是一些小问题,而且自己时间有限,可以先提一个 issue,提醒作者本人或者其他人解决,如果没有人回应,再尝试自己提交 PR。这里我先提了一个 issue,github.com/leerob/leer…

2. 派生一个存储库 (Forking a repository)

进入 github.com/leerob/leer… 项目主页,点击 Fork 按钮,创建一个新的派生项目(Create a new fork)

再点击 Create fork 按钮,创建派生项目到自己的工作区。

3. 克隆一个派生 (Cloning a fork)

进入自己的 Github 工作区,将派生项目克隆到本地(或者远端服务器),详见 docs.github.com/en/get-star…

# 克隆项目到本地(注意是派生项目的链接,不是原始项目)
git clone git@github.com:shenlu89/leerob.io.git

4. 创建一个分支 (Creating a branch)

# 创建并切换到本地新分支,分支的命名尽量简洁,并与解决的问题相关
git checkout -b delete-unused-link

5. 做出修改 (Make changes)

删除一行无用的代码,import Link from 'next/link'

6. 提交修改 (Pushing changes)

这步需要注意一下,有些项目更新的会比较频繁。当你做出修改和提交 PR 之前,可能有作者新的提交和 PR 被合并到原项目。如果有这种情况发生,在你工作区的派生项目会显示原项目有更新。例如:

点击 Update branch 之后,将原项目(github.com/leerob/leer…)更新同步到派生项目(github.com/shenlu89/le…)。再进入本地项目文件夹

# 当前文件夹位置 leerob.io
# 保存本地修改并将工作目录还原到当前HEAD提交状态
git stash

# 从远程拉取最新的项目代码,将派生项目更新同步到本地
git pull

# 将保存的修改还原回当前工作目录
git stash pop

查看更新后的内容是否和本地修改有冲突,如果有就解决冲突,完成后就可以提交修改了

# 当前文件夹位置 leerob.io
# 保存本地修改并将工作目录还原到当前HEAD提交状态
git commit -am 'Delete unused Link declaration'  

# 推到派生项目远端仓库,因为之前项目分支是在本地创建的,需要带上 '--set-upstream'
git push --set-upstream origin delete-unused-link

7. 创建合并请求 (Create a pull request)

回到线上派生项目的工作区,会看到新分支和修改的合并提交信息,点击Compare & pull request

选择你想并入的原项目分支,标题和描述信息。如果有对应的 issue,就通过键入 # 添加(Github 会自动展示 issues 列表)

点击 Create pull request ,就行了。结果如下:

8. 发表评论 (Address review comments)

这部分是原项目作者需要遵循的规范,Lee Robinson 也给了一个礼貌性的回复

9. 合并你的请求 (Merge your pull request)

这是原项目作者要做的,已经展示过了,不再赘述。

10. 删除你的分支 (Delete your branch)

最后一步不是必须的,只是保持一个规范的开源协作习惯,减少意外提交错误项目分支的情况发生。

来到原项目 Github 主页,找到之前已经合并的提交请求(在关闭的 PR 列表中),点击 Delete branch

# 删除本地分支
git branch -d delete-unused-link

注意:下次在已有的派生项目创建新分支前,要先将原项目的更新同步到派生项目,并将更新后的派生项目拉到(git pull)本地,再重新建立分支(git checkout -b new-branch-name ),再重复上述过程即可。

Github 官网对协作流程方面写很清楚,但阐述逻辑上有点混乱,而且没有中文版。有人可能会问,GitHub Docs 提供多语言访问,而且是开源的,为什么中文版有些部分没有翻译完整?详见github.com/github/docs… 如下:

所以,GitHub Docs 其他语言的官方翻译会滞后于英文版,因为其他语言版本不接受内容贡献(这是 Github 官方在准确度和效率之间做的一个平衡)。如果 GitHub Docs 中没有提供符合你阅读习惯的语言版本,只能发信催 Github 官方尽快提供相关语言版本。

避坑提醒: 1. 给 GitHub Docs 提交内容翻译 PR 通常是不会通过的。这里官方说的很清楚了,不接受翻译内容贡献。 2. 如果发现英文原文内容有问题(语法,语义,词法),这个是可以提交修改意见 (Issue) 和合并请求 (Pull Request) 的(其他语言的版本也都是通过英文版本翻译过来的)。但也要基于原文内容修改,自己独立创作的内容合并请求很难被 Github 官方通过。

下面是参考的相关 Github 官方文档: