本文主要是根据自己在摸索提交pr (pull-request)过程程的一些总结。

为了方便描述,约定本文需要fork的项目为test-project,源仓库地址regionUser/test-project,你(提pr的用户)的用户名为userA

fork原项目

登入自己的github账号,进入你需要提pr的那个项目下,点击左上角的fork

然后进入你的Repositories列表,你会发现名为test-project仓库。

clone 这个 fork项目

打开userA/test-project(即你fork的项目下),clone到本地。

git clone https://github.com/userA/test-project.git

建立upstream上游链接

这里上游指的是一开始fork的那个项目源。

git remote add upstream https://github.com/regionUser/test-project.git

查看远程仓库信息:

git remote -v

一定确定origin是你自己的地址,upstream是远程的地址。

新增、提交变动

这里修改的是你clone下来的项目,列举了两种方式。

main分支修改

我这里为了测试,选择就在main上修改,且模拟了源项目main变更,以及userA的多次提交。

git add .
git commit -m 'userA的第一次提交'
git commit -m 'userA的第二次提交'
git push origin main

基于新的分支

创建了一个新的fix/fs-fix

git checkout -b fix/fs-fix
git add .
git commit -m 'userA的第一次提交'
git add .
git commit -m 'userA的第二次提交'
git push origin fix/fs-fix

写完后合并到主分支main

git merge fix/fs-fix
git push origin main

新建pull-request

github打开你fork的项目。userA/test-project,点击Pull requests -> New pul request新建pr,会自动跳转至regionUser/test-project下的compare,出现下面界面:

github-create-pr-p1

base repositories源项目仓库,head repositoriesfork的项目仓库(userA).

我这里创建的时候出现check不通过的提示(如果你没有遇到,就跳过):

Can’t automatically merge. Don’t worry, you can still create the pull request.

可以预料到,因为原项目的作者在我们之前fork以后,又新增了功能提交。 虽然仍然可以创建成功,但不建议,也不一定会被采纳

此时,需要我们对fork的项目源码做代码同步。如下:

# 拉取 upstream 最新代码
git fetch upstream

# (这里不一定是使用 rebase,merge 同样可以,只是一个同步最新代码的一个方式而已)
# 再 rebase,main 是分支名,我这偷了个懒
# 此过程可能会遇到冲突,解决冲突
git rebase upstream/main

# 当然直接使用 git pull upstream branch 也是可以的 === fetch + merge

# 此过程可能会遇到冲突,解决冲突再次 rebase
git status
git add .
git rebase --continue

# rebase (变基)是合并的另外一种方式,不同于merge的是,不会产生旁支和冗余的提交记录。
# 执行后会在 terminal 中打开编辑器交互,完成变基操作(不知道怎么在这个界面操作的,可以看我的另外一篇文章'vi 编辑器学习')
# 在界面上方列出了需要编辑的所有提交,在每个commit id前的是指令类型(pick),在Commands中有相关的指令说明。
# p, pick = 保留该commit
# r, reword = 保留该commit,但修改它的提交信息
# e, edit = 保留该commit,在合并该请求时暂停
# s, squash = 保留该commit,合并到前一个提交中
# f, fixup = 类似于squash,但抛弃提交它的提交信息
# x, exec = 执行shell命令
# d, drop = 丢弃该commit

# 解决掉所有冲突 推送此次合并,添加 -f 强制推送
git push -f origin main

按上面流程操作完了以后,重新创建pull-requestcheck错误已经消失:

github-create-pr-p2

填写pull-request 的 title,你也可以添加 comment,完成后,你可以在regionUser/test-projectPull requests下看到你新提交的pr.效果如下:

github-create-pr-p3

至此,pr创建就完成了,等待原项目作者审核后合并。

原仓库作者视角

github-create-pr-p4

选择合并的方式,再次点击确认即可完成合并。

更新fork项目

当你的提交被采纳以后,原项目regionUser/test-project会新增一个合并的提交记录,为了保持一致,需要在fork的本地仓库进行更新:

git pull --rebase upstream [branch]
# 或者
git fetch upstream
git merge upstream/main

# 更新推送至远程
git push origin main

其他问题

如何再次提交pr?

answer:重复上面新建pull-request的流程,值得注意的是:记得先同步主分支代码,保证与fork的原项目代码一致,否则你会继续遇到冲突。

提交pr后,我fork的仓库可以删除吗?

answer:在pr被采纳前,不能删除,否则该pr会自动关闭;在采纳后是可以删除掉的,因为代码已经被合并至主项目里了(存在于主仓库的Pull requests记录也会被删除)。

世事千帆过,前方终会是温柔和月光。