首页 > 解决方案 > git rebase --rebase-merges 中的“堂兄弟”选项的行为是什么?

问题描述

--rebase-merges对于 Git v2.22,可以在git rebase文档页面上找到有关该选项的以下信息:

默认情况下,或者指定 no-rebase-cousins 时,没有<upstream>直接祖先的提交将保留其原始分支点,即被 git-log 的 --ancestry-path 选项排除的提交将保留其原始祖先默认。如果打开了 rebase-cousins 模式,则此类提交将改为 rebase 到<upstream>(或<onto>,如果指定)。

不幸的是,该页面底部的详细文档部分没有显示.no-rebase-cousinsrebase-cousins选项的任何示例--rebase-merges。我也不太熟悉git log --ancestry-path(我从不使用它),所以这个例子根本无助于我的理解。

有人可以通过示例解释选项rebase-cousins参数的行为吗?--rebase-merges

标签: git

解决方案


这可能最好通过示例来完成。

假设你有:

...--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)到新的提交到 make A'B'等等,然后运行一个新git merge的 to make G',最后复制H到 make H',所有这些都在 main 的提示之后而不是在 commit 之后*。你最终得到:

                       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-<code>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选项将它们包括在复制过程中,并 puts C'、副本C、 after main,给出:

                  C'-D'-E'
                 /       \
                /         \
               / A'-B'-----F'-G'  <-- branch
               |/
...--o--*--o---o   <-- main
      \  \
       \  A--B---F--G   [abandoned]
        \       /
         C--D--E

请注意,如果有分支名称指向、 或中的任何一个C,则无论您选择哪个选项,它们都不会被移动。DE


推荐阅读