You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不线性化整个Git提交历史的情况下合并两个历史提交?

解决方法

要合并dev分支上的c、d提交同时保留原分支结构,不能用全局变基,得针对dev分支的局部历史处理,步骤如下:

  1. 重建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。
  2. 重新合并到主分支

    • 切回主分支,回退到合并dev之前的状态(也就是提交b的位置):
      git checkout main
      git reset --hard <commit-b的哈希值>
      
    • 合并修改后的新dev分支:
      git merge new-dev
      

    这时候主分支的历史就会和你期望的一致:保留a、b提交,合并后的历史里dev分支是c+d和e,没有线性化。

注意:如果原合并提交已经推送到远程仓库,修改历史后需要强制推送(git push -f),但务必提前和团队成员沟通,避免冲突。

内容的提问来源于stack exchange,提问作者SUSY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:15:18