简单地说,给定:
Before rebase After rebase
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \ \
D---E---H---I (HEAD) \ E'---H' (HEAD)
\
D---E---H---I
git rebase --onto F D H
这和(因为——onto只有一个参数)是一样的:
git rebase D H --onto F
表示在f的顶部的范围(D, H)上重新赋值提交。注意,该范围是左排他的。它是排他性的,因为它更容易指定第一次提交,例如输入分支,让git找到第一次从分支分流提交,即D,导致H。
在案例
o---o (A)
\
o (B)(HEAD)
git checkout B
git rebase --onto B A
可以更改为单个命令:
git rebase --onto B A B
这里看起来像错误的是B的位置,这意味着“将一些导致分支B的提交移动到B的顶部”。问题是什么是“一些提交”。如果你添加了-i标志,你会看到它是由HEAD指向的单一提交。提交被跳过,因为它已经应用到目标B,所以什么都没有发生。
在任何情况下,如果分支名称像这样重复,该命令都是毫无意义的。这是因为提交的范围将是一些已经在该分支中的提交,在重基期间,所有这些都将被跳过。
git rebase <upstream> <branch>—onto <newbase>的进一步解释和适用用法。
git 变基默认值。
git rebase master
扩展为:
git rebase --onto master master HEAD
git rebase --onto master master current_branch
更换底座后自动结账。
当以标准方式使用时,例如:
git checkout branch
git rebase master
你不会注意到,在重基之后,git将分支移动到最近的重基提交,并执行git checkout分支(参见git reflog历史)。有趣的是,当第二个参数是提交哈希,而不是分支名称rebase仍然有效,但没有分支移动,所以你最终在“分离HEAD”,而不是被检出到移动的分支。
省略主发散提交。
in -onto的主参数取自第一个git rebase参数。
git rebase master
/ \
git rebase --onto master master
所以实际上它可以是任何其他提交或分支。通过这种方式,您可以通过接受最新的提交并保留主要的分散提交来限制rebase提交的数量。
git rebase --onto master HEAD~
git rebase --onto master HEAD~ HEAD # Expanded.
将HEAD指向master的单个提交重新赋基,并在“分离HEAD”中结束。
避免显式签出。
默认的HEAD或current_branch参数上下文取自您所处的位置。这就是为什么大多数人结帐到他们想要改变基数的分支。但是当第二个rebase参数显式给出时,你不必在rebase之前签出以隐式方式传递它。
(branch) $ git rebase master
(branch) $ git rebase master branch # Expanded.
(branch) $ git rebase master $(git rev-parse --abbrev-ref HEAD) # Kind of what git does.
这意味着您可以从任何地方重设提交和分支的基。
因此,与自动结帐后,改基。你不必在重基之前或之后分别签出重基分支。
(master) $ git rebase master branch
(branch) $ # Rebased. Notice checkout.