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

Kev*_*inL 14 git algorithm git-diff git-merge 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
Run Code Online (Sandbox Code Playgroud)

图片 这种差异(图片由meld看起来很漂亮.让我们尝试合并它.

git merge origin/patience-merge-2
Run Code Online (Sandbox Code Playgroud)

图片

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

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

git merge --abort
git merge origin/patience-merge-2 -X patience
Run Code Online (Sandbox Code Playgroud)

图片

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

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

在黑暗中我尝试了额外的镜头(失败):

git config --global merge.algorithm patience
git config --global merge.diff.algorithm patience
Run Code Online (Sandbox Code Playgroud)

系统信息:
Windows 8.1
git版本1.8.4.msysgit.0(通过GitHub for Windows 2.0)

Kev*_*inL 9

修补 git,如 Appleman1234 并不理想。我希望这个功能在未来的版本中出现。

现在,我想我必须适应别名

git config --global alias.pmerge "merge -X patience --"
Run Code Online (Sandbox Code Playgroud)

这让我可以做

git pmerge origin/patience-merge-2
Run Code Online (Sandbox Code Playgroud)

代替

git merge origin/patience-merge-2 -X patience
Run Code Online (Sandbox Code Playgroud)

在我之前给出的例子中。


App*_*234 0

一种方法是修补 git 以添加您所需的功能。

一个未经测试、未编译的builtin/merge.c补丁示例是

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);
>                       }
Run Code Online (Sandbox Code Playgroud)

请注意,我相信如果像这样的补丁要包含在 git 中,可能需要额外的工作来添加启用和禁用此行为的配置值,因为文档明确指出更改该值只会更改差异算法。另一种方法是添加一个配置变量 merge.algorithm ,如果未设置则执行默认逻辑,如果设置则执行 merge.algorithm 中的算法。

另一种不需要更改代码的替代方案是 shell 别名 git 命令。