主题解决方案
回答发布的问题的正确命令可以是以下任意命令(假设分支topic
已经签出):
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>]]
<Branch>
是可选的,它所做的就是在执行其余命令之前检出指定的分支。如果您已经签出要重新设置基准的分支,则不需要此分支。请注意,您必须已指定<Upstream>
才能指定,<Branch>
否则git会认为您正在指定<Upstream>
。
<Target>
是将附加我们的提交字符串的提交。提供分支名称时,您只需指定该分支的头提交即可。<Target>
可以是将不包含在要移动的提交字符串中的任何提交。例如:
A --- B --- C --- D master
\
\-- X --- Y --- Z feature
移动整个特性分支,你不能选择X
,Y
,Z
,或feature
作为<Target>
,因为这些都是组内提交移动。
<Upstream>
之所以特别是因为它可以表示两种不同的含义。如果提交是签出分支的祖先,那么它将用作切入点。在我提供的例子,这将是任何不是C
,D
或master
。<Upstream>
直到已检出分支的头部为止的所有提交都是将被移动的提交。
但是,如果<Upstream>
不是祖先,那么git会从指定的提交中备份链,直到找到带有已签出分支的公共祖先为止(如果找不到祖先,则中止)。在我们的例子中,一<Upstream>
中B
,C
,D
,或master
都将导致提交B
作为切点。<Upstream>
本身是一个可选命令,如果未指定,则git会查看已签出分支的父级,等效于enter master
。
现在git已经选择了要剪切和移动的提交,它将它们应用到<Target>
,跳过已应用于目标的任何提交。
有趣的例子和结果
使用此起点:
A --- B --- C --- D --- E master
\
\-- X --- Y --- Z feature
git checkout B
跑步前您尝试过做git rebase
吗?