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

20
我看过很多博客文章和堆栈溢出的帖子说,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行实际上没有任何更改,但它们被标记为冲突/已更改,与diff的方式完全不同。

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

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)


手册中对 -s 选项的说明如下:使用给定的合并策略;可以多次提供以指定它们应尝试的顺序。如果没有 -s 选项,则使用内置的策略列表(在合并单个头时使用 git merge-recursive,在合并八爪鱼时使用 git merge-octopus)。 这听起来似乎不太可能将其作为默认行为。 - Chris Hayes
也许通过git config是不可能的,但是有没有其他的解决方法呢? - KevinL
可能是如何将耐心设置为默认的git diff算法的重复问题。 - notbad.jpeg
3个回答

9

像Appleman1234一样对git进行打补丁并不理想。我希望这个功能能在未来的版本中实现。

目前,我想只能使用别名代替。

git config --global alias.pmerge "merge -X patience --"

这使我能够做到

git pmerge origin/patience-merge-2

代替
git merge origin/patience-merge-2 -X patience

在我之前给出的例子中。

2

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);
>                       }

请注意,我认为如果像这样的补丁被包含在git中,可能还需要额外的工作来添加一个配置值,以启用和禁用此行为,因为文档明确指出更改该值仅会更改差异算法。另一种选择是添加一个配置变量merge.algorithm,如果未设置,则执行默认逻辑,如果设置了merge.algorithm,则执行该算法。
另一种不需要代码更改的选择是通过shell别名git命令。

代码更改并不理想。我想我将不得不使用别名 git config --global alias.pmerge "merge -X patience --" - KevinL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接