我看过很多博客帖子和堆栈溢出帖子都说
git config --global diff.algorithm patience
将允许差异和合并使用耐心策略选项和默认的递归算法。
我发现情况并非如此,我提出以下演示来说明原因。
git config --global diff.algorithm patience //mythical config statement
git clone https://github.com/kjlubick/PracticingGit.git
cd PracticingGit
git checkout origin/patience-merge-1 -t
git checkout -b merge_test //temp branch for merging
git diff origin/patience-merge-2
这个差异(图片由meld提供看起来非常好。让我们尝试将其合并。
git merge origin/patience-merge-2
咦?合并看起来很难看。尽管第9-19行没有实际改变,但它们被标记为冲突/改变的方式与差异完全不同。
如果我们强制合并使用耐心策略选项:
git merge --abort
git merge origin/patience-merge-2 -X patience
那好多了。冲突与我们之前制作的差异相匹配,并且在语义上是正确的。
如何让合并实际上使用耐心设置,而不仅仅是差异?
我在黑暗中尝试了其他镜头(未成功):
git config --global merge.algorithm patience
git config --global merge.diff.algorithm patience
系统信息:
Windows 8.1
git版本1.8.4.msysgit.0(通过GitHub for Windows 2.0)
答案 0 :(得分:4)
修补git,就像Appleman1234一样不理想。我希望这个功能在未来版本中出现。
目前,我认为我不得不接受别名
git config --global alias.pmerge "merge -X patience --"
允许我这样做
git pmerge origin/patience-merge-2
而不是
git merge origin/patience-merge-2 -X patience
在我之前给出的例子中。
答案 1 :(得分:2)
There is a config item for branch-specific merge options,
git config branch.master.mergeoptions "-X patience"
但不是全局默认设置。
答案 2 :(得分:0)
一种方法是修补git以添加您要求的功能。
<{3}}的未经测试,未编译的补丁示例
diff -Nar merge.c merge.c-new
77c77
< static const char *pull_twohead, *pull_octopus;
---
> static const char *pull_twohead, *pull_octopus,*diff_algorithm;
586a587,588
> else if (!strcmp(k, "diff.algorithm"))
> return git_config_string(&diff_algorithm, k, v);
1305a1308,1311
> int diff_algorithm_mask = 0;
> if (diff_algorithm != null){
> diff_algorithm_mask = parse_algorithm_value(diff_algorithm);
> }
1308a1315,1317
> if (diff_algorithm != null){
> add_strategies(diff_algorithm,diff_algorithm_mask);
> }
1310a1320,1322
> if (diff_algorithm != null){
> add_strategies(diff_algorithm,diff_algorithm_mask);
> }
请注意,我相信如果要将这样的补丁包含在git中,则可能需要额外的工作来添加配置值,以启用和禁用此行为,因为builtin/merge.c明确指出更改该值只会更改diff算法。另一种方法是添加一个配置变量merge.algorithm并让它在未设置时执行默认逻辑,并在merge.algorithm中设置算法(如果已设置)。
另一个不需要更改代码的替代方法是shell别名git命令。