无需rebase与额外提交,能否移除Git仓库中已合并分支的冗余提交?
移除Git合并分支提交的方法
已知仓库提交历史为:
A-B---C---D-H-I \ / E-F-G
目标是修改为:
A-B---C---H-I
且要求不使用rebase、不创建额外提交,同时已知提交C与D的工作目录内容完全一致。
操作步骤:
- 获取提交C、D、H的哈希值(可通过
git log --oneline查看)。 - 修改提交H的父节点,将其从D指向C:
在弹出的编辑器中,找到包含git replace <commit-H> --editparent <commit-D>的行,将<commit-D>替换为<commit-C>,保存后退出。 - 固化提交历史修改(让替换永久生效,而非仅本地临时引用):
git filter-repo --force - 清理无引用的旧提交(可选,Git会自动在垃圾回收时清理,也可手动触发):
git gc --prune=now
原理说明:
因为提交C和D的内容完全一致,修改H的父节点后,H的变更逻辑不受影响。git replace仅临时修改提交对象的父节点引用,git filter-repo会基于此重写后续提交(H、I)的哈希值,但提交内容保持不变,最终移除了合并分支E-F-G及提交D的历史痕迹。
内容的提问来源于stack exchange,提问作者Denis Sivtsov
相关产品推荐
相关产品推荐

