还有另外一个git rebase -onto很难理解的情况:当你rebase到一个对称差分选择器(三个点'…')导致的提交上时
Git 2.24(2019年Q4)在管理这种情况方面做得更好:
See commit 414d924, commit 4effc5b, commit c0efb4c, commit 2b318aa (27 Aug 2019), and commit 793ac7e, commit 359eceb (25 Aug 2019) by Denton Liu (Denton-L).
Helped-by: Eric Sunshine (sunshineco), Junio C Hamano (gitster), Ævar Arnfjörð Bjarmason (avar), and Johannes Schindelin (dscho).
See commit 6330209, commit c9efc21 (27 Aug 2019), and commit 4336d36 (25 Aug 2019) by Ævar Arnfjörð Bjarmason (avar).
Helped-by: Eric Sunshine (sunshineco), Junio C Hamano (gitster), Ævar Arnfjörð Bjarmason (avar), and Johannes Schindelin (dscho).
(Merged by Junio C Hamano -- gitster -- in commit 640f9cd, 30 Sep 2019)
Rebase:快进——更多情况下为上
之前,当我们有下面的图表时,
A - B - C(主)
\
D(侧)
运行'git rebase - to master…master side'将导致D总是被重基,无论如何。
在这一点上,阅读“双点之间的区别是什么?”'和三点"…"在Git diff提交范围?"
:“主人…“指的是大师……HEAD,也就是B: HEAD是侧HEAD(目前签出):您正在重新基于B。
你在改变什么基础?任何不在master中的提交,并且从side branch可以到达:只有一个提交符合描述:D…已经在B上面了!
同样,在Git 2.24之前,这样的rebase -onto会导致D总是被重基,无论发生什么。
然而,期望的行为是,rebase应该注意到这是快速前进的,并取而代之。
这类似于OP的B - A的重基,而OP什么也没做。
Add detection to can_fast_forward so that this case can be detected and a fast-forward will be performed.
First of all, rewrite the function to use gotos which simplifies the logic.
Next, since the
options.upstream &&
!oidcmp(&options.upstream->object.oid, &options.onto->object.oid)
conditions were removed in cmd_rebase, we reintroduce a substitute in
can_fast_forward.
In particular, checking the merge bases of upstream and head fixes a failing case in t3416.
The abbreviated graph for t3416 is as follows:
F---G topic
/
A---B---C---D---E master
失败的命令是
git rebase --onto master...topic F topic
在此之前,Git会看到有一个merge base (C, result of master…topic),并且merge和onto是相同的,因此它会错误地返回1
我们可以快进。这将导致重基图为“ABCFG”
当时我们在期待《ABCG》。
一个rebase—to C F topic意味着在F之后的任何提交,可以通过topic HEAD到达:这只是G,而不是F本身。
在这种情况下,快进会将F包含在重基分支中,这是错误的。
使用附加的逻辑,我们检测上游和头部的合并基
是F,因为onto不是F,这意味着我们没有重基
从master..topic提交。
因为我们排除了一些提交,所以不能执行快进,所以我们正确地返回0。
将'-f'添加到由于此更改而失败的测试用例中,因为
他们并没有料到会有这么快的进展,以至于被迫调降基数。