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)
修补 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)
在我之前给出的例子中。
一种方法是修补 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 命令。
| 归档时间: |
|
| 查看次数: |
1098 次 |
| 最近记录: |