博士tl;
在你的例子中,使用git rebase—onto在A的基础上重基B的正确语法是:
git checkout B
git rebase --onto A B^
或者从B的父类(引用B^或B~1)的提交开始,在A的基础上重构B。
如果你对git rebase <branch>和git rebase——onto <branch>之间的区别感兴趣,请继续阅读。
快速:git改基
git rebase <branch>将在<branch>可到达但HEAD不能到达的最新提交之上,将你当前已签出的、由HEAD引用的分支重新赋值。
这是最常见的调整基础的情况,可以说是一个需要较少的预先计划。
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E (HEAD) D---E (HEAD)
在这个例子中,F和G是可以从分支到达但不能从HEAD到达的提交。假设git rebase分支将接受D,这是分支点之后的第一次提交,并在分支可到达但不能从HEAD到达的最新提交(即G)之上重基它(即更改其父)。
The Precise: git rebase -onto带有2个参数
Git rebase——onto允许你从一个特定的提交开始。它允许您准确地控制要重基的内容和位置。这适用于需要精确的场景。
例如,让我们想象一下,我们需要精确地在F的基础上从e开始重新建立HEAD。我们只对将F引入我们的工作分支感兴趣,而与此同时,我们不想保留D,因为它包含一些不兼容的更改。
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H---I (HEAD)
在这种情况下,我们会说git rebase—onto F d。这意味着:
将父级为D的HEAD可到达的提交重设为F的顶部。
换句话说,将E的父元素从D改为f。git rebase——onto的语法是git rebase——onto <newparent> <oldparent>。
当你想要快速地从当前分支中删除一些提交,而不需要做一个交互式的rebase时,这个方法就会派上用场:
Before After
A---B---C---E---F (HEAD) A---B---F (HEAD)
在这个例子中,为了从序列中移除C和E,你会说git rebase—to B E,或者rebase HEAD在B的顶部,其中旧的父元素是E。
外科医生:git rebase -on有3个参数
Git rebase -onto可以在精度方面更进一步。事实上,它允许您在另一个提交之上重新设置一个任意范围的提交。
这里有一个例子:
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H (HEAD)
在这种情况下,我们想要在F之上重新确定精确的范围E—H,忽略HEAD当前指向的位置。我们可以这样做,git rebase—onto F D H,意思是:
将父对象为D的提交的范围重设为F之上的H。
git rebase——onto的语法是一系列的提交,然后变成git rebase——onto <newparent> <oldparent> <直到>。这里的技巧是记住<until>引用的提交包含在范围中,并将在重基完成后成为新的HEAD。