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

ALi*_*iff 7 git default git-config difftool

默认的 git diff 工具(和合并工具)是什么?
我在哪里(以及如何)可以找到它?

我从未明确为 git difftool(也没有 mergetool)设置任何配置,
因此git config --get difftool没有显示任何内容。

git 文档说(https://git-scm.com/docs/git-difftool):

diff.tool如果未设置配置变量,git difftool将选择合适的默认值。

我怎样才能知道它选择了哪一个?“合适
” 的算法是如何工作的?


让我分享一下我试图通过 git 找出当前选择的 diff 工具的原因:
我在执行时遇到了一些奇怪的 diff 结果git diff(我怀疑 BOM 处理问题)。
我想询问供应商(例如,p4merge),
但不确定是否是p4mergevimdiff或其他什么。

我预计可能会有类似的命令git difftool --current

Sch*_*ern 6

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]?
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

list_merge_tool_candidates设置 的列表$tools。如果未设置 DISPLAY,则假定您没有 GUI,这在 MacOS 上是不正确的。

然后它只是循环遍历它们并选择第一个找到的可执行文件以供使用type


更新

当我执行 git diff 时,我遇到了一些奇怪的 diff 结果(我怀疑 BOM 处理问题)。我想向供应商(例如 p4merge)询问,但不确定它是 p4merge、vimdiff 还是其他任何东西。

如果您有问题,git diff那就是git diffnot git difftool。我认为人们对它的作用有些困惑git difftool,所以这里有一个快速概述。

git diff不使用 git-difftoolgit difftool不选择 diff 工具git diffgit diff有自己的内部 diff 实现。它还可以通过提供 .diff 来使用外部 diff 程序,例如 GNU diff--ext-diff

当您运行时,git difftool它会选择一个外部 diff 程序并使用三个环境变量运行它:$LOCAL、$REMOTE 和 $MERGED。$LOCAL 是旧版本文件的路径,$REMOTE 是新版本的路径,$MERGED 是文件的名称,以便可以显示该文件。就是这样。与 没有任何关系git diff

我们可以git difftool通过将自定义 difftools 添加到 .gitconfig 来看看会发生什么:

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

[difftool "less"]
    cmd = less "$LOCAL" "$REMOTE"
Run Code Online (Sandbox Code Playgroud)

git difftool -t echo将显示环境变量。git difftool -t less将查看寻呼机中文件的旧版本和新版本的内容less


如果您遇到问题git diffgit difftool则与此无关。p4merge 和 vimdiff 也不应该。