Git无关分支变基问题:变基后仅保留单个分支提交
我明白你遇到的问题了——你想把孤立分支FEATURE的提交追加到master分支末尾,形成一条线性的A A A A A B B提交链,但执行普通的git rebase master后,FEATURE的提交居然不见了,只剩下master的提交。咱们先还原你的操作步骤,再一步步分析原因和解决办法。
你的操作复现
$ git init && git ci -m "MASTER branch" --allow-empty [master (root-commit) 05abfe5] MASTER branch $ git co --orphan FEATURE && git ci -m "FEATURE branch" --allow-empty Switched to a new branch 'FEATURE' [FEATURE (root-commit) 122671d] FEATURE branch $ git rebase master First, rewinding head to replay your work on top of it...
问题原因
核心问题在于FEATURE是用--orphan创建的孤立分支,它和master没有任何共同的提交历史。Git的变基操作本质是找到两个分支的共同祖先,然后把当前分支在祖先之后的提交“复制”到目标分支的末尾。但对于完全无关的分支,Git找不到这个共同祖先,所以它会直接丢弃FEATURE的所有提交,把FEATURE的HEAD指向master的最新提交——这就是你看不到FEATURE提交的原因。
解决办法
要实现把FEATURE的提交追加到master后面的需求,咱们需要用更明确的变基命令,告诉Git该如何处理这两个无关联的分支:
方法1:用git rebase --onto指定基准
首先,如果你刚执行完错误的变基,还没做其他操作,先通过git reflog找回FEATURE原来的提交哈希(比如你这里的122671d),然后恢复FEATURE分支:
git checkout FEATURE git reset --hard 122671d
接着执行正确的变基命令:
git rebase --onto master --root FEATURE
--root:告诉Git处理FEATURE分支从根提交开始的所有提交--onto master:指定把这些提交放到master分支的末尾
执行完后,FEATURE分支的提交就会完美追加到master的提交后面。如果想把这些提交合并到master,只需要切换到master执行git merge FEATURE即可。
方法2:用git cherry-pick逐个复制提交
如果FEATURE分支的提交不多,也可以直接把这些提交“复制”到master上:
git checkout master git cherry-pick 122671d # 如果有多个提交,依次替换为对应的提交哈希即可
总结
处理完全无关的分支时,普通的git rebase会因为找不到共同祖先而丢失当前分支的提交。必须通过--onto明确指定目标基准,配合--root包含分支的所有根提交,才能实现把一个分支的提交线性追加到另一个分支的需求。
内容的提问来源于stack exchange,提问作者Niklas R

