设置默认差异算法不会转换为默认合并算法(耐心)

时间:2014-07-31 15:28:34

标签: git algorithm git-merge git-diff git-config

我看过很多博客帖子和堆栈溢出帖子都说 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

image 这个差异(图片由meld提供看起来非常好。让我们尝试将其合并。

git merge origin/patience-merge-2

image

咦?合并看起来很难看。尽管第9-19行没有实际改变,但它们被标记为冲突/改变的方式与差异完全不同。

如果我们强制合并使用耐心策略选项:

git merge --abort
git merge origin/patience-merge-2 -X patience

image

那好多了。冲突与我们之前制作的差异相匹配,并且在语义上是正确的。

如何让合并实际上使用耐心设置,而不仅仅是差异?

我在黑暗中尝试了其他镜头(未成功):

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)

3 个答案:

答案 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命令。