2021年9月更新:
下文提到的2016选项已经过时,被新的合并策略ORT(“Ostensibly Recursive's Twin”)所取代,它在处理重命名检测方面做得更好。
这里明显的主要区别是工作树和索引的更新不是与合并算法同时进行的,而是一个单独的后处理步骤。
新的API的设计使得可以进行重复的合并(例如在rebase或cherry-pick期间),并且只在最后一次更新索引和工作树,而不是在每个中间结果中都更新它们。
此外,可以在两个分支之间执行合并,而这两个分支都不匹配索引或工作树,而不会覆盖索引或工作树。
“ort”后端在内存中完成完整的合并,然后只将索引和工作副本作为后处理步骤进行更新。
从Git 2.34(2021年第四季度)开始,这将成为默认设置。
在此期间:
git merge -s ort MyBranch-to-merge
^^^^^^
2016年:
随着Git 2.8(2016年3月)的发布,你将有另一个选项(作为递归合并策略的选项)。
git merge -Srecursive -Xno-renames
请查看 提交44c74ec, 提交2307211, 提交63651e1 (2016年2月24日), 提交2307211, 提交63651e1 (2016年2月24日), 提交87892f6, 提交83837ec (2016年2月21日) 以及 提交1b47ad1, 提交d2b11ec (2016年2月17日),作者为 Felipe Gonçalves Assis (asiz
)。
(已由Junio C Hamano -- gitster
--在提交4ce064d中合并,于2016年2月26日)
merge-recursive
:禁用重命名选项
递归策略默认启用重命名检测。
新增一个策略选项,即使对于完全相同的重命名也可以禁用重命名检测。
man git-merge
将包括:
no-renames
Turn off rename detection.
See git diff --no-renames
.
(注意,如
commit 1b47ad1 中所示,使用
git diff
接口的
find-renames
合并策略使得选项
rename-threshold
在 git 2.8 版本之后变得多余。)
在Git 2.18(2018年第二季度)中,您有一个额外的设置:如果将
merge.renames
配置设置为false,则可以告诉递归合并策略不要花费时间尝试查找重命名路径并相应地合并它们。
请查看提交 6f10a09, 提交 85b4603, 提交 a7152e9 (2018年5月2日) 由Ben Peart (benpeart
)提交。
(由Junio C Hamano -- gitster
--合并于提交 6e2ba77, 2018年5月30日)
merge
: 添加merge.renames
配置设置
通过配置设置添加控制合并时重命名检测的能力。
此设置与diff.renames
相同且默认值相同,但仅适用于合并。
bar.txt
的结果,该文件在branch_A
中被跟踪但在master
中未被跟踪,假设它存在于您的工作目录中。 - Chris Frederickgit merge --no-renames
的选项。请参见下面的我的答案。 - VonCgit config merge.renames false
。请参见下面更新的答案。 - VonC