如何在不线性化整个Git提交历史的情况下合并两个历史提交?
解决方法
要合并dev分支上的c、d提交同时保留原分支结构,不能用全局变基,得针对dev分支的局部历史处理,步骤如下:
重建dev分支的修改历史
- 先检出到dev分支最后一个提交e的位置,创建临时分支:
git checkout <commit-e的哈希值> -b new-dev - 针对dev分支从a之后的提交做交互式变基,只修改dev分支的历史:
git rebase -i <commit-a的哈希值> - 在弹出的交互编辑界面中,找到提交d的那一行,把开头的
pick改成fixup(如果想自定义合并后的提交信息,就改成squash),提交c和e保持pick不变。示例如下:pick <c的哈希> c fixup <d的哈希> d pick <e的哈希> e - 保存退出后,Git会自动把d的修改合并到c,生成新的
c + d提交,dev分支的历史就变成a -> c+d -> e。
- 先检出到dev分支最后一个提交e的位置,创建临时分支:
重新合并到主分支
- 切回主分支,回退到合并dev之前的状态(也就是提交b的位置):
git checkout main git reset --hard <commit-b的哈希值> - 合并修改后的新dev分支:
git merge new-dev
这时候主分支的历史就会和你期望的一致:保留a、b提交,合并后的历史里dev分支是
c+d和e,没有线性化。- 切回主分支,回退到合并dev之前的状态(也就是提交b的位置):
注意:如果原合并提交已经推送到远程仓库,修改历史后需要强制推送(
git push -f),但务必提前和团队成员沟通,避免冲突。
内容的提问来源于stack exchange,提问作者SUSY
相关产品推荐
相关产品推荐

