主题的解决方案
回答已发布问题的正确命令可能是以下任何一个(假设分支主题已经签出):
git rebase --onto B master
git rebase --onto master~1 master
git rebase --onto B A
git rebase --onto B C
git rebase --onto B
如果topic没有签出,你只需将topic附加到命令(除了最后一个),如下所示:
git rebase --onto B master topic
或者,先用以下方法检出分支:
git checkout topic
将提交的任何字符串改为目标提交
我们所需要的命令的基本形式,摘自文档,是:
git rebase --onto <Target> [<Upstream> [<Branch>]]
<分支>是可选的,它所做的只是在执行其余命令之前检出指定的分支。如果您已经签出了想要重基的分支,那么您不需要这个。注意,你必须指定<Upstream>才能指定<Branch>,否则git会认为你指定了<Upstream>。
<Target>是我们要附加提交字符串的提交。在提供分支名称时,您只是指定了该分支的头提交。<目标>可以是任何不包含在被移动的提交字符串中的提交。例如:
A --- B --- C --- D master
\
\-- X --- Y --- Z feature
要移动整个特性分支,您不能选择X、Y、Z或<Target>的特性,因为这些都是在被移动的组内提交的。
<Upstream>是特殊的,因为它可以表示两种不同的东西。如果它是检出分支的祖先提交,则它作为切点。在我提供的示例中,这将是任何不是C、D或master的东西。所有在<Upstream>之后直到检出分支头部的提交都将被移动。
但是,如果<Upstream>不是一个祖先,那么git将从指定的提交开始备份链,直到if与签出的分支找到一个共同的祖先(如果找不到,则中止)。在我们的例子中,B、C、D或master的<Upstream>都将导致提交B作为切点。<Upstream>本身是一个可选命令,如果没有指定它,那么git会查看签出分支的父类,这相当于输入master。
现在git已经选择了它将切割和移动的提交,它将应用它们以<Target>,跳过任何已经应用到Target的提交。
有趣的例子和结果
以此为出发点:
A --- B --- C --- D --- E master
\
\-- X --- Y --- Z feature
git rebase - to D A特性
将应用提交B, C, X, Y, Z来提交D,并最终跳过B和C,因为它们已经被应用了。
git rebase - to C X特性
是否应用提交Y和Z来提交C,有效地删除提交X