如何移除Git历史中的多个合并提交,实现无冲突线性提交历史?
解决方案
你需要的最终代码内容和现有master分支的内容完全一致,只是需要调整提交历史结构,因此可以直接复用已有合并结果,无需手动解决任何冲突,步骤如下:
方案一:批量cherry-pick(推荐)
- 基于提交c创建新的主线分支
git checkout -b new_master <提交c的哈希值>
- 批量拾取两个分支的全量提交,无需逐个指定提交哈希,填范围即可:
git cherry-pick <粉色分支首提交的父提交a^>..<粉色分支末提交b> <绿色分支首提交的父提交D^>..<绿色分支末提交E>
- 执行过程中如果出现冲突,不需要手动修改任何冲突文件,直接用现有master的正确代码覆盖当前目录所有内容:
git checkout master -- . git add . git cherry-pick --continue
- 重复步骤3直到所有拾取操作完成,此时
new_master分支的代码和原master完全一致,提交历史就是无合并提交的线性结构。 - 将原master指向新的提交序列:
git checkout master git reset --hard new_master
- 确认历史符合预期后强制推送即可:
git push --force
方案二:直接rebase(无需找提交范围)
如果你不想手动查询两个分支的提交范围,可以直接用rebase实现:
- 切换到master分支执行rebase:
git checkout master git rebase c --no-merges
- 每次出现冲突时直接执行以下命令复用已有合并结果:
git checkout HEAD@{1} -- . git add . git rebase --continue
- 直到rebase完成后强制推送即可。
两种方案的核心都是复用你已经完成合并的正确代码结果,不管两个分支中间有多少提交,都只需要重复几次固定操作即可,不需要手动处理任何冲突。
内容的提问来源于stack exchange,提问作者halogenr
相关产品推荐
相关产品推荐

