执行git rebase master branch_a后引入其他分支提交,操作是否有误?
问题结论
你的操作语法完全正确,出现非预期结果是因为对git rebase的默认行为理解存在偏差。
原因说明
git rebase <上游分支> <待变基分支>的执行逻辑是:
- 自动切换到待变基分支(此处为
branch_a) - 找到该分支和上游分支(此处为
master)的最近共同祖先节点 - 把共同祖先之后所有属于待变基分支的提交,全部重放到上游分支的最新提交(你图中的I)之后
从你给出的分支状态变化可以推断,你的branch_a的提交历史本身就包含了其他分支的C、D提交(比如你此前是从包含C、D的其他分支创建的branch_a,或是之前合并过其他分支到branch_a),因此rebase时会把共同祖先之后的所有提交全部重放,自然就把不属于你预期的C、D也带了过来。
预期效果的实现方案
如果你只想把提交E单独移动到I的后面,可以用--onto参数指定变基的范围,假设E的父提交是D,执行以下命令即可:
git rebase --onto master D branch_a
该命令的含义是:将branch_a上D提交之后到最新HEAD的所有提交(也就是仅E),重放到master的最新提交之后,完全符合你最初的预期。
内容的提问来源于stack exchange,提问作者Ahmad Syarif
相关产品推荐
相关产品推荐

