git 使用 --onto 变基

git rebase using --onto

以上是我的树,这是我用来创建它的代码,虽然我会说代码对我的问题来说无关紧要,但以防万一你想尝试一下,给你.

http://pastebin.com/gdy0cPb8

目前我在 master 签出并执行 git rebase --onto <any commit> master。这会将 master 的指针移动到 <any commit>。例如,git rebase --onto client master 将 master 的指针移动到 C4 但不做任何其他更改。

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

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

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

git rebase --onto X Y 会将 after Y 的提交合并到当前分支 HEAD 到 X 上,并移动当前分支 HEAD。

如果当前分支实际上是Y,那么afterY没有提交要移动。
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 之上。这将在 C9.

之上应用 C8

当你 运行 git rebase --onto m2 master:

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

在此过程中唯一发生的事情是您的 master 分支被移动到 C9。

听起来你想做的是将 master 分支(包括 C8)移到 C9 之上。为此,您只需检查 master,然后 运行 git rebase m2。让我们再做一遍这个过程。

  1. Git 在 master 中找到提交,但在 m2 中找不到。有一个提交,C8。 Git 留着以后用。
  2. Git git reset --hard <newbase>。由于我们没有指定 --onto,因此默认为 <upstream>,即 m2。所以master移动到m2.
  3. Git 重新应用步骤 1 中的提交。现在将在 C9 之上重新应用 C8。

你最终得到

... C7 - C9 - C8' master m2

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

为了论证,假设您想要下图:

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

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

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