tl; dr
在您的情况下B
基于A
使用的正确语法git rebase --onto
是:
git checkout B
git rebase --onto A B^
或底垫B
的顶部A
从起始提交即父B
与引用的B^
或B~1
。
如果您对git rebase <branch>
和之间的差异感兴趣,请继续git rebase --onto <branch>
阅读。
快速:git rebase
git rebase <branch>
是要重订当前已签出的分支,通过引用HEAD
,在上面的最新承诺是可达的距离<branch>
,但不从HEAD
。
这是重新部署的最常见情况,并且可以说是需要较少的预先计划的情况。
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E (HEAD) D---E (HEAD)
在这个例子中 F
and G
是可从branch
但无法访问的提交HEAD
。说git rebase branch
将采取D
,那是分支点后的第一个承诺,和重订它(即改变其母公司)上的最新顶级提交从可达branch
但不从HEAD
,即G
。
精确:git rebase --onto有2个参数
git rebase --onto
允许您从特定的提交开始进行基础调整。它使您可以精确控制要重新设置的内容和位置。这适用于需要精确的情况。
例如,让我们假设我们需要从开始HEAD
精确地重新建立基础。我们只想加入我们的工作分支,而与此同时,我们不想保留它,因为它包含一些不兼容的更改。F
E
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
。这表示:
重新确定HEAD
其父级D
位于之上的可达的提交F
。
换一种说法, 将的父项E
从更改D
为F
。git rebase --onto
然后是的语法git rebase --onto <newparent> <oldparent>
。
方便使用的另一种情况是,您想从当前分支中快速删除一些提交而不必进行交互式变基:
Before After
A---B---C---E---F (HEAD) A---B---F (HEAD)
在此示例中,为了删除C
和E
来自顺序,你会说git rebase --onto B E
,或重订HEAD
之上B
的老父母在何处E
。
外科医生:git rebase --onto有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)
在这种情况下,我们要变基的确切范围E---H
之上F
,忽略了其中HEAD
目前是指向。我们可以这样说git rebase --onto F D H
,这意味着:
调整基线提交的,其父母为范围D
达H
之上F
。
然后,git rebase --onto
带有一定范围的提交的语法变为git rebase --onto <newparent> <oldparent> <until>
。这里的窍门是要记住,引用的提交<until>
已包含在范围内,并且在完成基准调整后将成为新的提交HEAD
。