这可能最好通过示例来完成。
假设你有:
...--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)到新的提交到 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