如何回退Git中被后续PR修改文件的旧Pull Request
嘿,这个场景我太熟了!当你要回退的PR(比如PR3)之后,有其他PR(PR4、PR5)改了同一个文件,Git的自动回退就会因为内容冲突卡壳,弹出那个恼人的提示。别慌,咱们手动操作几步就能搞定,具体步骤如下:
1. 找到PR3的合并提交哈希
首先得定位到PR3合并时生成的合并提交哈希值。你可以在PR的详情页面里找到(一般在合并记录的下方),或者用命令行查看日志:
git log --oneline
在输出里找到PR3合并的那条记录,复制它的7位短哈希(比如a1b2c3d)——注意要找的是合并提交,不是PR里的单个提交哦。
2. (可选但推荐)创建新分支隔离操作
为了避免直接在主分支上操作出问题,先切一个专门用于回退的分支:
git checkout -b revert-pr3-fix
3. 发起手动回退命令
用git revert命令加上-m 1参数(合并提交有两个父节点,-m 1表示回退到合并前的主分支状态):
git revert -m 1 <PR3的合并提交哈希>
这时候Git会立刻提示冲突,因为PR4、PR5已经修改了同一文件,这是正常的,接下来咱们解决冲突就行。
4. 手动解决文件冲突
打开提示冲突的文件,你会看到类似这样的冲突标记:
<<<<<<< HEAD // 这里是PR4、PR5修改后的内容 ======= // 这里是PR3合并前的原始内容(也就是回退PR3后要保留的基础内容) >>>>>>> revert of a1b2c3d
你的目标是回退PR3的修改,同时保留PR4、PR5的有效更改,所以仔细对比两边的内容:
- 如果PR3的修改是新增/修改了某段代码,而PR4、PR5在这段代码上又做了调整,你需要保留PR4、PR5的版本,去掉PR3带来的变化;
- 如果冲突是因为PR3删除了内容,而PR4、PR5又修改了那段内容,你需要恢复PR3删除前的内容,同时整合PR4、PR5的修改。
编辑完文件后,删除所有冲突标记(<<<<<<<、=======、>>>>>>>),然后用命令标记冲突已解决:
git add <冲突文件名>
5. 完成回退提交
解决完所有冲突后,继续完成回退操作:
git revert --continue
这时候会弹出文本编辑器让你填写提交信息,默认的信息已经很清晰了,直接保存退出就行。如果中途想放弃回退,执行git revert --abort就能回到操作前的状态。
6. 推送回退分支并合并
现在你的回退分支已经包含了正确的回退提交,把它推送到远程仓库:
git push origin revert-pr3-fix
然后在你的代码托管平台上开一个新的Pull Request,把这个回退分支合并到主分支。等审核通过后,PR3的修改就被成功回退,同时PR4、PR5的更改也保留下来了。
内容的提问来源于stack exchange,提问作者vinodsaluja

