对于Git v2.22,可以在git rebase文档页面上找到有关--rebase-merges
选项的以下信息:
默认情况下,或者当指定no-rebase-cousins时,没有
<upstream>
作为直接祖先的提交将保留其原始分支点,即git-log的--ancestry-排除的提交默认情况下,path选项将保留其原始血统。如果启用了rebase-cousins模式,则将此类提交重新基于<upstream>
(或<onto>
,如果指定)。
不幸的是,该页面底部的详细文档部分未显示no-rebase-cousins
的{{1}}或rebase-cousins
选项的任何示例。我对--rebase-merges
也不太熟悉(我从未使用过),因此该示例完全无法帮助我理解。
有人可以举例说明git log --ancestry-path
选项的rebase-cousins
参数的行为吗?
答案 0 :(得分:3)
这可能是最好的例子。
假设您有:
...--o--*--o--o <-- main
\
\ C--D
\ / \
A--B G--H <-- branch
\ /
E--F
您想使用branch
将main
改成--rebase-merges
。 main..branch
列表的枚举通过A
提交H
。好的,目标很明显:Git应该将提交A-B-(C-D/E-F)
复制到新的提交中以制作A'
,B'
等,然后运行新的git merge
来制作{{1 }},最后复制G'
制成H
,所有这些都在main的尖端之后而不是在提交H'
之后。您最终得到:
*
但是假设您有:
C'-D'
/ \
A'-B' G'-H' <-- branch
/ \ /
/ E'-F'
/
...--o--*--o--o <-- main
\
\ C--D
\ / \
A--B G--H [abandoned]
\ /
E--F
您运行...--o--*--o---o <-- main
\ \
\ A--B---F--G <-- branch
\ /
C--D--E
。枚举git checkout branch; git rebase --rebase-merges main
还列出了提交main..branch
和 A-B-F-G
。
您要复制哪些提交?您是要保留C-D-E
还是复制它们?您要做要重新执行产生C-D-E
的合并,将您的新副本F
与某些内容合并,但与B'
合并,还是与E
,是E'
的新副本?
该选项允许您避免复制E
,该复制不在从C-D-E
到*
的祖先路径中,H
排除它们-或无论如何复制这些“表兄弟”提交。默认设置是将它们从复制过程中排除,给出:
git log --ancestry-path main..branch
A'-B'---------F'-G' <-- branch
/ /
...--o--*--o---o <-- main /
\ \ /
\ A--B---F--G / [abandoned]
\ /_________/
C--D--E
选项将它们包括在复制过程中,并将rebase-cousins
的副本C'
放在C
之后,给出:
main
请注意,如果分支名称指向 C'-D'-E'
/ \
/ \
/ A'-B'-----F'-G' <-- branch
|/
...--o--*--o---o <-- main
\ \
\ A--B---F--G [abandoned]
\ /
C--D--E
,C
或D
中的任何一个,则无论您选择哪个选项,都不会移动它们。