如何解决Git Revert合并冲突,构建排除错误提交的目标分支
解决Git回滚错误提交时的冲突并保留后续变更
方法一:处理Revert冲突时直接保留当前HEAD内容
当执行git revert <F的提交ID>遇到大量冲突时,要保留当前分支(包含C、D变更)的内容、排除F的变更,按以下步骤操作:
- 对所有冲突文件,执行
git checkout --ours <文件名>,--ours代表当前分支(你基于master创建的新分支)的版本,即保留C、D的修改,忽略F的变更 - 所有冲突文件处理完成后,执行
git add . - 最后执行
git revert --continue完成撤销操作
完成后你的分支提交链会变成A->B->F->C->D->Revert F,后续将这个分支合并到master后,就能达到排除F提交的效果。
方法二:用Rebase重构提交链(得到你期望的A->B->C->D结构)
如果你想要直接得到不含F的干净提交链,推荐用git rebase改写历史:
- 基于B提交创建新分支:
git checkout -b fix-branch <B的提交ID> - 将C、D提交移植到新分支:
git cherry-pick <C的提交ID> <D的提交ID>,若遇到冲突,解决后执行git add .再git cherry-pick --continue - 更高效的方式:直接在你已创建的分支上执行交互式rebase:
- 切换到目标分支:
git checkout your-branch - 执行
git rebase -i <B的提交ID>,在弹出的编辑器中删除F对应的那一行,保存退出 - 若过程中出现冲突,解决冲突后执行
git add .再git rebase --continue
- 切换到目标分支:
完成后你的fix-branch提交链就是A->B->C->D,后续合并到master即可完全排除F提交。
两种方法的选择
- 若master是公共协作分支,优先用方法一:
git revert不会改写历史,只是添加反向提交,对其他开发者更友好 - 若你需要干净的提交链且分支仅自己使用,可选择方法二:
git rebase能直接得到你期望的提交结构,但会改写历史,不建议在公共分支上操作
内容的提问来源于stack exchange,提问作者nkhalid
相关产品推荐
相关产品推荐

