git 使用 --onto 变基
git rebase using --onto
以上是我的树,这是我用来创建它的代码,虽然我会说代码对我的问题来说无关紧要,但以防万一你想尝试一下,给你.
目前我在 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
:
时会发生这种情况
- Git 标识在当前分支中但不在
<upstream>
中的所有提交。在这种情况下,您的上游是 master,与您当前的分支相同,因此没有提交不同。
- Git 有效
git reset --hard <newbase>
。 Newbase 是用 --onto
指定的提交,在本例中是 m2
。这会将主分支移动到 m2
。
- Git 重新应用它在步骤 1 中找到的提交。由于在这种情况下有 none,因此变基完成。
在此过程中唯一发生的事情是您的 master 分支被移动到 C9。
听起来你想做的是将 master 分支(包括 C8)移到 C9 之上。为此,您只需检查 master,然后 运行 git rebase m2
。让我们再做一遍这个过程。
- Git 在 master 中找到提交,但在 m2 中找不到。有一个提交,C8。 Git 留着以后用。
- Git
git reset --hard <newbase>
。由于我们没有指定 --onto
,因此默认为 <upstream>
,即 m2。所以master移动到m2.
- 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
来完成此操作。现在发生这种情况:
- Git 在 master 中找到提交,但在上游 C7 中找不到。它找到 C8。
- Git 重置为
<newbase>
:git reset --hard C5
- 重新应用第 1 步中的提交。(C8)
以上是我的树,这是我用来创建它的代码,虽然我会说代码对我的问题来说无关紧要,但以防万一你想尝试一下,给你.
目前我在 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
:
- Git 标识在当前分支中但不在
<upstream>
中的所有提交。在这种情况下,您的上游是 master,与您当前的分支相同,因此没有提交不同。 - Git 有效
git reset --hard <newbase>
。 Newbase 是用--onto
指定的提交,在本例中是m2
。这会将主分支移动到m2
。 - Git 重新应用它在步骤 1 中找到的提交。由于在这种情况下有 none,因此变基完成。
在此过程中唯一发生的事情是您的 master 分支被移动到 C9。
听起来你想做的是将 master 分支(包括 C8)移到 C9 之上。为此,您只需检查 master,然后 运行 git rebase m2
。让我们再做一遍这个过程。
- Git 在 master 中找到提交,但在 m2 中找不到。有一个提交,C8。 Git 留着以后用。
- Git
git reset --hard <newbase>
。由于我们没有指定--onto
,因此默认为<upstream>
,即 m2。所以master移动到m2. - 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
来完成此操作。现在发生这种情况:
- Git 在 master 中找到提交,但在上游 C7 中找不到。它找到 C8。
- Git 重置为
<newbase>
:git reset --hard C5
- 重新应用第 1 步中的提交。(C8)