github pull request

how to use github pull request

之前在 CSDN 上写过一篇关于 RP 的笔记 github fork PR 的简单使用 ,那篇文章写的比较随意且不是用命令行操作的,大部分操作都是基于 IDE,所以想着重新整理下那篇文章,同时也复习下 git 常用命令。

pull request
pull request

公司有个项目为 xiao1996cc/git-dev ,有两个开发者,分别为 xiaobinqtlovenarcissus 对这个项目进行开发,开发的新功能都会提交 PR 请求合并。

两个开发者分别把项目 fork 项目到自己的账号下,以 xiaobinqt 为例:

forking
forking

fork 成功后
fork 成功后

xiaobinqt 现在已经 fork 了 xiao1996cc/git-dev 项目到自己的账号下 xiaobinqt/git-dev

每次开发新功能之前一定要先 fetch 下远程仓库。

xiaobinqt fork 完成后,clone 项目到本地。

clone
clone

添加远程仓库 xiao1996cc/git-dev

git

git remote add upstream git@github.com:xiao1996cc/git-dev.git

添加远程仓库
添加远程仓库

fetch 远程仓库

git

git fetch upstream

fetch 远程仓库
fetch 远程仓库

基于 upstream/main 创建新分支 dev_xiaobinqt

git

git checkout -b dev_xiaobinqt upstream/main

创建 dev_xiaobinqt 分支
创建 dev_xiaobinqt 分支

新建新文件 xiaobinqt.txt 并提交

新建文件并提交
新建文件并提交

push 成功后再 github 项目下可以看到成功提示

push 成功提示
push 成功提示

new pull request
new pull request

选择要合并的分支并创建 pull request,这里我们将 xiabinqt/git-dev 下面的 dev_xiaobinqt 分支里的代码合并到 xiao1996cc/git-dev 下的 main 分支。

创建 pull request
创建 pull request

创建 pull request 成功
创建 pull request 成功

xiao1996cc/git-dev 项目下的 PR 只有管理这个项目的用户才有权限处理。管理员看到的界面是如下这样的:

管理者看到的 PR 界面
管理者看到的 PR 界面

处理完的 PR 状态会变成 Merged

Merge PR
Merge PR

至此 xiaobinqt 开发的一个功能已经成功提交到远程 upstream 仓库,也就是 xiao1996cc/git-dev 仓库,虽然只新建了一个文件,但是一个完整的 pull request 流程。

对于 lovenarcissus 开发者来说,也是先 fork 项目再 clone 项目到本地。

可以看到 lovenarcissus fork 后的项目是有 xiaobinqt.txt 这个文件的,同时也验证了 xiaobinqt 开发者成功向远程仓库提交了代码。这里默认已经 clone 到了本地仓库。

lovenarcissus fork
lovenarcissus fork

添加远程仓库
添加远程仓库

fetch 远程仓库代码

git fetch upsteam
git fetch upsteam

基于 upstream/main 创建新分支 dev_lovenarcissus 开发分支

git

git checkout -b dev_lovenarcissus upstream/main

新建开发分支
新建开发分支

新建 lovenarcissus.txt 文件并修改 xiaobinqt.txt 文件

开发代码
开发代码

提交代码

提交代码
提交代码

新建 pull request
新建 pull request

Merge pull request
Merge pull request

现在开发者 xiaobinqt 和开发者 lovenarcissus 都提了代码到远程仓库 xiao1996cc/git-dev,仓库里文件如下:

远程代码仓库
远程代码仓库

现在开发者 xiaobinqt 需要开发一个新的功能,新增一个 xiaobinqt2.txt 文件,并且修改 xiaobinqt.txt 文件,但是这时 xiaobinqt 并没有 fetch 合并远程仓库的代码,xiaobinqt 本地仓库文件如下:

文件列表
文件列表

直接新建 xiaobinqt2.txt 文件,并且修改 xiaobinqt.txt 文件

新建并修改文件
新建并修改文件

push 代码到远程仓库,并创建 pull request

push 代码
push 代码

可以看到在创建 pull request 时出现了冲突,提示 Can’t automatically merge

PR 出现冲突
PR 出现冲突

出现冲突的原因是本地代码跟 origin 仓库的代码是一样的,但是 origin 仓库跟 upstream 仓库代码不一致。我们需要先 fetch 下 upstream 仓库的代码跟本地代码合并后再 push 到 origin 仓库,再从 origin 仓库提 pull request 到 upsteam 仓库。

由👇图可知,在 merge upstream/main 分支时出现了冲突 Automatic merge failed; fix conflicts and then commit the result.

merge conflicts
merge conflicts

vim 打开冲突文件 xiaobinqt.txt 解决冲突

冲突文件内容
冲突文件内容

解决冲突后的文件 👇

解决冲突后的文件
解决冲突后的文件

以下👇是解决这次冲突的具体步骤:

解决冲突具体步骤
解决冲突具体步骤

这时对于 xiaobinqt 开发者来说,冲突已经解决,可以重新提 pull request 👇,可以看到现在的状态是 Able to merge.

重提 PR
重提 PR

创建新的 pull request 成功

创建新的 PR 成功
创建新的 PR 成功