默认的git diff工具(和合并工具)是什么?
我在哪里(以及如何)可以找到它?
我从来没有为git difftool(也没有mergetool)显式设置过任何配置,
所以git config --get difftool
什么也不显示。
git文档说明(https://git-scm.com/docs/git-difftool):
如果未设置配置变量diff.tool
,则git difftool
将选择合适的默认值。
我怎么知道它选了哪一个?
“suitable”的算法是如何工作的?
让我分享一下为什么我试图找出我的git当前选择的diff工具的原因:
我在执行git diff
时遇到了一些奇怪diff结果(我怀疑是BOM处理问题)。
我想就此问题询问供应商(例如p4merge
),
但不确定它是p4merge
、vimdiff
还是其他任何东西。
我希望可能会有类似git difftool --current
的命令。
2条答案
按热度按时间d4so4syb1#
git difftool
将告诉您它要尝试什么。我们可以在
guess_merge_tool
函数中找到该过程。list_merge_tool_candidates
设置$tools
的列表。它假设如果未设置DISPLAY,则您没有在MacOS上不正确的GUI。然后,它简单地遍历它们,并选择第一个找到的可执行文件,以使用
type
。更新
我在执行git diff的时候遇到了一些奇怪的diff结果(我怀疑是BOM处理问题)。我想问一下供应商(例如p4 merge),但不确定是p4 merge,vimdiff还是其他什么。
如果你对
git diff
有问题,那就是git diff
,而不是git difftool
。我认为对git difftool
的功能有些困惑,所以这里有一个快速的概述。git diff
不使用git-difftool。git difftool
不为git diff
选择diff工具。git diff
有自己的内部diff实现。它也可以通过提供--ext-diff
来使用外部diff程序,如GNU diff。当你运行
git difftool
时,它会选择一个外部diff程序,并使用三个环境变量运行它:$LOCAL、$REMOTE和$MERGED。$LOCAL是旧版本文件的路径,$REMOTE是新版本文件的路径,$MERGED是文件名,这样就可以显示它。仅此而已。它与git diff
没有关系。我们可以通过在.gitconfig中添加自定义的difftools来了解
git difftool
的功能:git difftool -t echo
将显示环境变量。git difftool -t less
将查看less
分页器中文件的旧版本和新版本的内容。如果你遇到
git diff
的问题,git difftool
与此无关,p4 merge和vimdiff也不应该。4uqofj5v2#
我将补充一个在Schwern的回答中没有提到的附加评论。
如果您的本地Git仓库处于“冲突检测状态”,“git difftool”将使用默认的git difftool。换句话说,在这种状态下,“git difftool”的工作方式与“git diff”完全相同。我不确定这是Git bug,还是它本来应该这样工作。所以,当您处于“冲突检测状态”时,git difftool的配置被忽略了。这是我在2.37.x或2.38.x版本的“Git for Window”中看到的行为。一旦你解决了git冲突,“git difftool”会返回到使用配置好的difftool。
这里有一个例子,当你的本地git仓库被置于“冲突检测状态”时,你会看到什么。
C:\Temp\user2\core>git pull remote: Enumerating objects: 58, done. remote: Counting objects: 100% (58/58), done. remote: Compressing objects: 100% (32/32), done. remote: Total 40 (delta 12), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (40/40), 3.13 KiB | 46.00 KiB/s, done. From c:\Temp\clone\core a7b9b22..6cce36f main -> origin/main Auto-merging CoreInterfaces/src/main/java/com/phinneyridge/core/Core.java CONFLICT (content): Merge conflict in CoreInterfaces/src/main/java/com/phinneyridge/core/Core.java Automatic merge failed; fix conflicts and then commit the result.
我猜,如果您在冲突状态下尝试Schwern的调试配置建议,您不会看到它起作用。
我已经就这个问题向Git社区提交了一个bug,我们会看看他们是否认为这个行为是bug,或者它是按预期工作的。