git - 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-cousins
或rebase-cousins
选项的任何示例--rebase-merges
。我也不太熟悉git log --ancestry-path
(我从不使用它),所以这个例子根本无助于我的理解。
有人可以通过示例解释选项rebase-cousins
参数的行为吗?--rebase-merges
解决方案
这可能最好通过示例来完成。
假设你有:
...--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
,则无论您选择哪个选项,它们都不会被移动。D
E
推荐阅读
- java - Java 中的正则表达式模式匹配单个字母而不是完整的单词。
- python - 比较列表中的文件
- admin - 覆盆子 [Errno 13] 权限被拒绝打开文件 txt
- teradata - 数字之间的日期范围如何在 teradata 中工作
- sas - SAS 编程 - 删除重复项
- python - 如何获得所有预测类标签的准确性
- jquery - 如何在高图中显示 x 轴和 y 轴的网格线?
- reporting-services - SSRS 页脚计数器
- javascript - 函数名以'$'开头是什么意思?
- docker - `docker-compose build` 和 `docker build` 有什么区别?