git rebase --rebase-merges中“ cousins”选项的行为是什么?

时间:2019-06-10 15:37:00

标签: git

对于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参数的行为吗?

1 个答案:

答案 0 :(得分:3)

这可能是最好的例子。

假设您有:

...--o--*--o--o   <-- main
         \
          \      C--D
           \    /    \
            A--B      G--H   <-- branch
                \    /
                 E--F

您想使用branchmain改成--rebase-mergesmain..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 CD中的任何一个,则无论您选择哪个选项,都不会移动它们。