git rebase使用--onto

时间:2015-02-28 21:06:00

标签: git version-control rebase

enter image description here

上面是我的树,这里是我用来创建它的代码,虽然我会说代码对我的问题无关紧要,但是如果你想尝试一下,这里你去

http://pastebin.com/gdy0cPb8

目前我已在master结帐并执行git rebase --onto <any commit> master。这会将master的指针移动到<any commit>。例如,git rebase --onto client master会将主控指针移至C4,但不会进行任何其他更改。

我认为这将是默认行为,因为master是要比较的[upstream],因为它是同一个分支,我理解master只是移动到那里。 [Reference git-scm.org]

但是,即使我执行git rebase --onto m2 master(没有先将主人移动到C4)也会发生同样的情况,指针只是移到C9

我只想知道,为什么会这样?

2 个答案:

答案 0 :(得分:3)

运行git rebase --onto m2 master时会发生这种情况:

  1. Git标识当前分支中但不在<upstream>中的所有提交。在这种情况下,您的上游是master,与当前分支相同,因此没有不同的提交。
  2. Git有效地git reset --hard <newbase>。 Newbase是--onto指定的提交,在本例中为m2。这会将主分支移动到m2
  3. Git重新应用它在步骤1中找到的提交。由于在这种情况下没有,因此rebase已完成。
  4. 此过程中唯一发生的事情是您的主分支已移至C9。

    听起来你想要做的就是将主分支(包括C8)移到C9之上。为此,您可以只签出master,然后运行git rebase m2。让我们再次完成这个过程。

    1. Git在master中找到提交但在m2中找不到。有一个提交,C8。 Git将此保存以供日后使用。
    2. Git做git reset --hard <newbase>。由于我们未指定--onto,因此默认为<upstream>,即m2。所以主人搬到m2。
    3. Git重新应用步骤1中的提交.C8将在C9之上重新应用。
    4. 你最终得到了

      ... C7 - C9 - C8' master m2
      

      注意我写了C8'而不是C8。这是因为C8现在将有一个新的提交哈希。

      为了论证,我们假设你想要下面的图表:

             C8' master
            /
      C4 - C5 - C6 - C7 - C9 m2
      

      您可以通过签出master并运行git rebase --onto C5 C7来完成此操作。现在发生这种情况:

      1. Git在master中找到提交但在上游C7中找不到。它找到了C8。
      2. Git重置为<newbase>git reset --hard C5
      3. 重新申请第1步的提交。(C8)

答案 1 :(得分:2)

git rebase --onto X Y Y之后的提交合并到当前分支HEAD到X,然后移动当前分支HEAD。

如果当前分支实际为Y,则 Y之后没有提交移动。
Y HEAD只会移至X

git rebase --onto m2 master

会发生这种情况

C8到C9的适用范围是:

git checkout master
git rebase --onto m2 C7

或者,更简单:

git checkout master
git rebase m2

此处不需要--onto:您正在master之上重新定位m2分支。这将在C8之上应用C9