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

变基后丢失合并提交代码,如何正确执行Git变基?

如何正确执行包含合并提交的交互式变基?

首先得戳破你遇到的核心问题:普通的交互式变基会自动忽略合并提交,把它扁平化拆成单个提交,导致你在合并提交ME中手动解决的大量冲突全部丢失——这就是为什么你变基后代码编译失败、状态彻底混乱的根源。

先明确你的提交历史和目标:
你原本的提交链是这样的:

D <- 需保留的最终提交
C <- 要合并之前所有内容的提交
* ME <- 你手动解决过大量冲突的合并提交
|\
| B *
| *
| |/
A <- 功能分支初始提交
MA <- master分支

你的目标是把A、B、ME、C合并成一个新提交C',最后保留D,得到简洁的线性历史:

D
C'
MA

你之前操作的问题所在

当你运行git rebase -i master时,Git默认会跳过合并提交ME——因为rebase的默认行为是把分支历史「线性化」,它会把合并提交拆成它包含的单个提交(也就是B),但完全不会保留你在ME中手动解决冲突的结果。所以当你重新应用这些提交时,之前解决过的冲突会再次爆发,而你选择「接受传入更改」相当于直接丢弃了ME里的冲突修复,自然会导致代码彻底崩溃。

正确的解决步骤

第一步:先回到变基前的状态

如果还没完成变基,或者变基后没做新的提交,先执行回退命令:

git rebase --abort

如果已经做了后续操作,用git reflog找到变基前的分支状态(比如找类似HEAD@{2}: checkout: moving from ...的记录),然后硬重置回去:

git reset --hard HEAD@{你的变基前记录序号}

第二步:用保留合并提交的变基命令

你需要使用--rebase-merges参数,这个参数会让Git保留合并提交的结构,同时允许你修改提交历史:

git rebase -i --rebase-merges master

执行后,你会在编辑器里看到包含合并提交ME的完整历史,大致结构如下:

pick A 功能分支第一个提交
pick B 你的B提交说明
merge -C ME # 这里就是合并提交ME,-C表示保留原提交信息
pick C 你的C提交说明
pick D 你的D提交说明

第三步:调整提交指令,合并成C'

现在你要把A、B、ME、C合并成一个提交C':

  • 如果你想保留C的提交信息,就把C设为pick,把它前面的A、B、ME的指令都改成squash(或者fixup,如果不需要保留这些提交的说明文本):
    squash A 功能分支第一个提交
    squash B 你的B提交说明
    squash -C ME # 合并提交ME
    pick C 你的C提交说明
    pick D 你的D提交说明
    
  • 或者如果你想保留A的提交信息,就把A设为pick,后面的B、ME、C都改成squash。

保存退出后,Git会开始处理变基:

  1. 先把你标记为squash的提交合并成一个新的C'
  2. 然后应用D提交

这个过程中如果遇到冲突,你需要重新解决,但这次合并提交ME的内容会被完整包含进去——相当于你之前在ME中解决的冲突会被保留,不会再丢失。

额外提示:如果冲突还是出现怎么办?

如果变基时还是遇到冲突,你可以在解决完一个冲突后执行:

git add .
git rebase --continue

直到变基完成。如果中途想放弃,随时可以用git rebase --abort回到初始状态。

内容的提问来源于stack exchange,提问作者Minh Nghĩa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:05:06