Git变基提交范围咨询:交互式变基遇提交列表异常问题
为何交互式变基后出现已被Squash合并的历史提交?
核心原因1:默认变基会扁平化合并提交
git rebase的默认行为是线性化提交历史,它会自动忽略合并提交节点,转而将合并提交对应的分支中的所有原始提交重新应用为线性序列。
你之前将分支bbb合并到master时,虽然最终生成了Merge branch bbb into master这个合并提交,但该提交仍关联着bbb分支的4个原始提交。当执行git rebase -i HEAD~2时,Git会以HEAD~2(即bbb的合并提交)作为基准,重写之后的所有提交。在此过程中,默认变基不会保留合并节点,而是将bbb分支的4个原始提交全部展开,加上你原本要编辑的2个提交,最终形成6个线性提交。
核心原因2:HEAD~2的回溯规则
HEAD~n是沿着当前分支的主父链(默认是第一个父节点,即master自身的历史线)回溯n个提交节点,无论该节点是否为合并提交。
你的master分支提交顺序(从新到旧):
Merge branch aaa into master(当前HEAD)- 提交信息有误的提交(来自aaa)
Merge branch bbb into master(更早的提交)
因此HEAD~1指向“提交信息有误的提交”,HEAD~2指向Merge branch bbb into master。git rebase -i HEAD~2会重写该bbb合并提交之后的所有提交,但由于合并提交被变基展开,原本被合并的4个bbb原始提交也随之出现在新分支中。
解决办法
若想保留合并提交结构,同时编辑目标提交信息,需使用--rebase-merges选项执行变基:
git rebase -i --rebase-merges HEAD~2
该选项会让Git保留合并提交节点,不会展开原始分支的提交,你可在交互式编辑器中直接修改目标提交的信息。
内容的提问来源于stack exchange,提问作者safa
相关产品推荐
相关产品推荐

