如何使用git rebase --onto对分支变基时保留原有合并记录
问题原因定位
你执行的git rebase -r --onto C3 master不符合预期,核心问题是对git rebase的upstream参数逻辑理解有误:
git rebase <upstream>的默认逻辑是提取当前分支中所有不在upstream分支上的提交进行重放。你指定upstream为master,而C4、C5本身属于master分支的提交,合并提交M1中来自master的内容被识别为上游已有内容,所以M1的双亲结构被破坏,C4、C5的关联记录被丢弃。- 你没有明确指定需要重放的提交范围是feature分支的原始分叉点C2到feature末端,导致git默认只重放了和master分叉后的非公共提交。
正确操作方案
- 先给当前feature分支打备份标签,避免操作失误丢失内容:
git tag feature_backup feature
- 执行带正确参数的变基命令:
git rebase -r --onto C3 C2 feature
参数解释:
-r(即--rebase-merges):保留并重建提交路径中的合并结构--onto C3:指定新的基提交为C3,所有重放的提交都会接到C3之后C2:指定原始分叉点为旧基提交,告诉git需要提取C2..feature范围内的所有提交(包含合并提交M1)进行重放feature:指定要操作的分支为feature
如果重放过程中出现合并冲突,且你需要保证变基后的文件内容和原feature完全一致,可以在冲突出现时执行:
git restore --source=feature_backup -- . git add . git rebase --continue
结果验证
变基完成后,先检查提交结构是否符合预期:
git log --graph --oneline --decorate
再验证文件内容和原feature完全一致:
git diff feature_backup feature
如果没有差异说明操作成功,可以删除备份标签:
git tag -d feature_backup
内容的提问来源于stack exchange,提问作者Shriram V
相关产品推荐
相关产品推荐

