如何使用Git交互式变基调整合并提交与其他提交的顺序?
让Git变基时将合并提交视为单个普通提交的方法
你遇到的问题是因为Git默认的变基行为会线性化提交历史,自动展开合并提交,把第二父分支的所有提交都拆出来显示,而不是保留合并提交本身。要解决这个问题,有两种可靠的方法:
方法一:使用--rebase-merges参数(推荐,Git 2.18+支持)
直接在变基命令中添加--rebase-merges参数,它会保留合并提交的结构,不会将其拆分为单个父分支提交:
git rebase -i --rebase-merges <sha-of-merge-commit>^
执行后,你会在TODO缓冲区中看到类似这样的合并提交条目:
merge -C <合并提交SHA> <分支名> # Merge branch '<分支名>'
你可以直接调整这条目和后续本地提交的顺序,完成后保存退出即可,Git会按照你调整的顺序重新生成提交历史,同时保留合并提交的完整性。
方法二:将合并提交转换为普通提交(兼容旧版Git)
如果你的Git版本低于2.18,或者不想保留合并结构,也可以先把合并提交转成一个普通提交,再进行变基:
- 先将HEAD回退到合并提交的父节点,保留工作区和暂存区的修改:
git reset --soft <sha-of-merge-commit>^ - 用原合并提交的信息创建一个新的普通提交:
git commit -C <sha-of-merge-commit> - 现在原合并提交已经被替换成一个普通提交,执行常规的交互式变基:
此时TODO缓冲区中会显示这个普通提交的git rebase -i <sha-of-merge-commit>^pick条目,你可以自由调整它和后续本地提交的顺序。
注意事项
因为你的提交都是未发布的,变基不会影响其他协作开发者,但操作前建议先备份当前分支,防止意外:
git branch backup-<你的分支名>
内容的提问来源于stack exchange,提问作者Kaz
相关产品推荐
相关产品推荐

