Git rebase操作丢失提交D的原因咨询
Git变基丢失合并提交变更的原因解析
初始提交历史
A-B---C---D-H-I \ / E-F-G
注:其中D是合并提交,用于将E-F-G分支合并到B-C分支上。
问题1:为什么rebase -i <SHA of A>看不到提交D?
Git的交互式变基(rebase -i)默认会自动忽略合并提交。它的核心逻辑是将当前分支相对于基提交(这里是A)的所有提交进行线性化展开,合并提交被视为“整合变更的节点”而非独立的修改提交,因此会被跳过。
在你的场景中,提交D是合并B-C与E-F-G的节点,Git会直接将两条分支上的非合并提交(B、C、E、F、G、H、I)按顺序展示,相当于把合并过程“扁平化”,所以你看不到D出现在变基指令列表里。
问题2:为什么变基后丢失了D的变更?
提交D的实际内容是B-C与E-F-G分支合并后的完整代码状态,它包含了E-F-G分支的所有变更。当你在变基指令中移除E、F、G三个提交时,相当于告诉Git:不要将E-F-G分支的变更应用到新分支上。
而原来的H、I提交是基于合并后的D提交创建的,它们的修改是基于包含E-F-G变更的代码。但这次变基中,你只保留了B、C、H、I,Git会先应用B并 squash C,此时代码基是B+C的状态(没有E-F-G的变更),再尝试应用H、I时,这两个提交的修改无法带上D中包含的E-F-G部分变更,最终导致这部分内容丢失。
为什么git reset --soft <SHA of A>能解决问题?
git reset --soft只会修改分支的HEAD指针到指定提交(A),但会保留工作区和暂存区的所有内容。此时你的暂存区里包含了从B到I的所有变更(包括D合并进来的E-F-G内容),重新提交就相当于把这些内容一次性打包成一个新提交,自然不会丢失任何变更。
内容的提问来源于stack exchange,提问作者Denis Sivtsov
相关产品推荐
相关产品推荐

