上面是我的树,这里是我用来创建它的代码,虽然我会说代码对我的问题无关紧要,但是如果你想尝试一下,这里你去
目前我已在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
我只想知道,为什么会这样?
答案 0 :(得分:3)
运行git rebase --onto m2 master
时会发生这种情况:
<upstream>
中的所有提交。在这种情况下,您的上游是master,与当前分支相同,因此没有不同的提交。git reset --hard <newbase>
。 Newbase是--onto
指定的提交,在本例中为m2
。这会将主分支移动到m2
。 此过程中唯一发生的事情是您的主分支已移至C9。
听起来你想要做的就是将主分支(包括C8)移到C9之上。为此,您可以只签出master,然后运行git rebase m2
。让我们再次完成这个过程。
git reset --hard <newbase>
。由于我们未指定--onto
,因此默认为<upstream>
,即m2。所以主人搬到m2。你最终得到了
... C7 - C9 - C8' master m2
注意我写了C8'
而不是C8
。这是因为C8
现在将有一个新的提交哈希。
为了论证,我们假设你想要下面的图表:
C8' master
/
C4 - C5 - C6 - C7 - C9 m2
您可以通过签出master并运行git rebase --onto C5 C7
来完成此操作。现在发生这种情况:
<newbase>
:git reset --hard C5
答案 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
。