默认的git diff工具(和合并工具)是什么?

7xzttuei  于 2022-12-10  发布在  Git
关注(0)|答案(2)|浏览(122)

默认的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),
但不确定它是p4mergevimdiff还是其他任何东西。
我希望可能会有类似git difftool --current的命令。

d4so4syb

d4so4syb1#

git difftool将告诉您它要尝试什么。

$ git difftool

This message is displayed because 'diff.tool' is not configured.
See 'git difftool --tool-help' or 'git help config' for more details.
'git difftool' will now attempt to use one of the following tools:
kompare emerge vimdiff

Viewing (1/1): 'this'
Launch 'emerge' [Y/n]?

我们可以在guess_merge_tool函数中找到该过程。

guess_merge_tool () {
    list_merge_tool_candidates
    cat >&2 <<-EOF
    This message is displayed because '$TOOL_MODE.tool' is not configured.
    See 'git ${TOOL_MODE}tool --tool-help' or 'git help config' for more details.
    'git ${TOOL_MODE}tool' will now attempt to use one of the following tools:
    $tools
    EOF

    # Loop over each candidate and stop when a valid merge tool is found.
    IFS=' '
    for tool in $tools
    do
        is_available "$tool" && echo "$tool" && return 0
    done

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-difftoolgit 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的功能:

[difftool "echo"]
    cmd = echo "LOCAL: $LOCAL, REMOTE: $REMOTE, MERGED: $MERGED"

[difftool "less"]
    cmd = less "$LOCAL" "$REMOTE"

git difftool -t echo将显示环境变量。git difftool -t less将查看less分页器中文件的旧版本和新版本的内容。
如果你遇到git diff的问题,git difftool与此无关,p4 merge和vimdiff也不应该。

4uqofj5v

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,或者它是按预期工作的。

相关问题