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

Git 设置默认差异算法不会转换为默认合并算法(耐心),git,git-merge,git-diff,git-config,Git,Git Merge,Git Diff,Git Config,我看到很多博客帖子和堆栈溢出帖子都这么说 git-config——全局差异算法 将允许diff和merge使用耐心策略选项和默认递归算法 我发现情况并非如此,我将展示以下演示来说明原因 git config --global diff.algorithm patience //mythical config statement git clone https://github.com/kjlubick/PracticingGit.git cd PracticingGit git che

我看到很多博客帖子和堆栈溢出帖子都这么说
git-config——全局差异算法
将允许diff和merge使用耐心策略选项和默认递归算法

我发现情况并非如此,我将展示以下演示来说明原因

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
这个diff(图片)看起来很好。让我们试着把它合并进去

git merge origin/patience-merge-2

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

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

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

这样更好。冲突与我们之前所做的差异相匹配,并且在语义上是正确的

如何让合并真正使用耐心设置,而不仅仅是差异?

我尝试在黑暗中拍摄其他照片(未成功):

系统信息:
Windows 8.1

git版本1.8.4.msysgit.0(通过GitHub for Windows 2.0)

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

示例未测试、未编译的补丁

diff-Nar merge.c merge.c-new
77c77
静态常量字符*pull\u twohead,*pull\u八达通,*diff\u算法;
586A587588
>如果(!strcmp(k,“差分算法”))
>返回git_config_字符串(&diff_算法,k,v);
1305A13081311
>int diff_算法_掩码=0;
>if(diff_算法!=null){
>diff_算法_掩码=解析_算法_值(diff_算法);
>               }
1308A13151317
>if(diff_算法!=null){
>添加_策略(diff_算法、diff_算法_掩码);
>                       }
1310A13201322
>if(diff_算法!=null){
>添加_策略(diff_算法、diff_算法_掩码);
>                       }
请注意,我相信,如果像这样的补丁要包含在git中,可能需要额外的工作来添加一个配置值,该配置值启用和禁用此行为,因为更改该值只会更改diff算法。另一种方法是添加一个配置变量merge.algorithm a如果未设置,则执行默认逻辑,如果设置,则执行merge.algorithm中的算法


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

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

现在,我想我不得不接受这个别名

git config --global alias.pmerge "merge -X patience --"
这让我可以

git pmerge origin/patience-merge-2
而不是

git merge origin/patience-merge-2 -X patience
在我前面给出的示例中。


但不是全局默认设置。

手册页为
-s
选项说明了这一点:
使用给定的合并策略;可以多次提供以按尝试顺序指定它们。如果没有-s选项,则使用内置策略列表(合并单头时git merge recursive,否则git merge octopus).
这听起来像是默认行为不太可能实现。因此,通过
git config
可能不可能实现,但是解决方法呢?还有其他方法吗?可能重复的代码更改并不理想。我想我必须满足于别名
git config--global alias.pmerge“合并-X耐心--”
git pmerge origin/patience-merge-2
git merge origin/patience-merge-2 -X patience
git config branch.master.mergeoptions "-X patience"