繁体   English   中英

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

[英]Setting default diff algorithm does not translate to default merge algorithm (patience)

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

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

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

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

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

这让我可以做

git pmerge origin/patience-merge-2

代替

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

在我之前给出的例子中。

有一个特定于分支的合并选项的配置项

git config branch.master.mergeoptions "-X patience"

但不是全局默认设置。

一种方法是修补 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 命令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM