如何使用交互式变基(Interactive Rebase)合并最近两个Pull Request并将PR2整合至PR1
别着急,这种不小心开了重复PR的情况我见太多了,用交互式变基完全能搞定!我来一步步给你讲清楚怎么把PR2的改动合并到PR1里,顺便也说下合并最近两个PR的通用流程:
假设你的PR1对应本地分支是pr1-branch(比如feature/add-checkout),PR2是从这个分支拉出来的新分支,只有那一个你本该用git commit --amend修改的改动commit:
1. 先把本地仓库同步到最新状态
- 切换到PR1分支:
git checkout pr1-branch - 拉取远程最新代码:
git pull origin pr1-branch
2. 用交互式变基合并PR2的commit
- 切换到PR2分支:
git checkout pr2-branch - 启动交互式变基,目标是PR1的分支:
git rebase -i pr1-branch
执行完这个命令会弹出文本编辑器,里面只会显示PR2比PR1多的那个commit(就是你后来加的改动)。
3. 修改变基指令合并commit
在编辑器里,把那个commit前面的pick改成squash(或者缩写s也行),比如:
squash abc1234 修复了表单验证的bug(这是PR2的commit信息)
保存并关闭编辑器就行。
4. 编辑合并后的最终commit信息
接下来会弹出另一个编辑器,让你整合两个commit的信息。你可以保留PR1的原始信息,或者把PR2的改动说明加进去,编辑完保存关闭就好。
5. 把合并后的内容同步到PR1分支
- 切回PR1分支:
git checkout pr1-branch - 合并PR2分支的内容:
git merge pr2-branch - 强制推送到远程(因为修改了commit历史,必须用强制推送,但
--force-with-lease更安全,不会覆盖别人的改动):git push origin pr1-branch --force-with-lease
6. 收尾:关闭PR2
现在PR1已经包含了PR2的所有改动,直接在代码托管平台(GitHub/GitLab之类)上关闭PR2就行,顺便可以加个说明:“改动已合并到PR1”。
如果你是在PR1的分支上直接提交了新commit,然后不小心又开了PR2,那流程更简单:
1. 切换到这个分支,启动交互式变基
git checkout your-branch git rebase -i HEAD~2
这里HEAD~2表示选中最近的两个commit(就是PR1和PR2对应的那两个)。
2. 合并两个commit
在弹出的编辑器里,把第二个commit(PR2的)前面的pick改成squash,比如:
pick def5678 新增购物车功能(PR1的commit信息) squash abc1234 修复购物车数量计算错误(PR2的commit信息)
保存关闭后,编辑合并后的commit信息,确认后保存。
3. 强制推送到远程
git push origin your-branch --force-with-lease
这样PR1会自动更新为合并后的commit,然后去关闭PR2就搞定了。
以后不管遇到什么情况,要合并最近两个有依赖关系的PR,都可以按这个通用步骤来:
- 先确保目标分支(要合并到的那个PR的分支)是最新的:
git checkout target-branch && git pull - 切换到要被合并的PR分支:
git checkout source-branch - 启动交互式变基:
git rebase -i target-branch - 在编辑器里把source-branch的commit标记为
squash(保留commit信息)或fixup(直接丢弃该commit的信息,用目标分支的commit信息) - 保存后编辑合并信息,完成变基
- 合并到目标分支并强制推送,最后关闭多余的PR
小提醒:如果你的PR已经被团队成员review过,修改commit历史前最好和大家打个招呼,避免影响别人的工作哦!
内容的提问来源于stack exchange,提问作者user5965026

