使用.gitconfig配置diff工具

213

如何配置Git使用不同的工具来进行.diff文件的比较?

我在我的.gitconfig文件中有这个设置:

[diff]
    tool = git-chdiff #also tried /bin/git-chdiff

它不起作用;它只是打开了普通的命令行diff。当我执行以下操作时

export GIT_EXTERNAL_DIFF=git-chdiff

然后git diff将打开外部的差异工具(所以我知道外部的差异工具脚本运行正常)。 我的.gitconfig配置中是否有关于差异工具的错误?


1
请参阅https://dev59.com/SHVC5IYBdhLWcg3wjx5d(可能会将此作为重复项关闭)。 - Stein G. Strindhaug
11个回答

229

另一种从命令行执行此操作的方法:

git config --global diff.tool tkdiff
git config --global merge.tool tkdiff
git config --global --add difftool.prompt false

前两行将difftool和mergetool设置为tkdiff- 根据您的偏好进行更改。第三行禁用了令人烦恼的提示,因此每当您按下git difftool时,它会自动启动difftool。


13
我已经执行了git config --global diff.tool diffmerge命令,但当我执行git diff myfile.txt命令时,它仍然给出了默认的unix diff。 - amphibient
也许你有一个本地配置,定义了另一个diff工具? - Omer Dagan
1
也许您需要传递正确的参数给diffmerge: 此链接说明了如何为meld执行此操作: 链接:http://nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy - Puttaraju
10
尝试使用 git difftool myfile.txt 命令来使用该工具。 - JBRWilkinson

170

Git提供了一系列预配置的差异工具 "开箱即用"(kdiff3、kompare、tkdiff、meld、xxdiff、emerge、vimdiff、gvimdiff、ecmerge、diffuse、opendiff、p4merge 和 araxis),同时也允许你指定自己的差异工具。要使用预配置的其中一个差异工具(例如 "vimdiff"),你需要将以下行添加到你的 ~/.gitconfig 文件中:

[diff]
    tool = vimdiff

现在,您可以运行 "git difftool" 并使用您选择的工具。

另一方面,指定您自己的 difftool 需要进行更多的工作,请参见 如何使用我喜欢的 diff 工具/查看器查看 'git diff' 输出?


1
预配置的“开箱即用”差异工具是什么意思?为了设置一个不在您列表中的外部差异工具“winMerge”,我必须执行与您在帖子中提到的完全相同的设置,一切都开始正常工作,无需任何其他配置。那么这是否意味着git也支持“winMerge”开箱即用,因为从您的帖子中我所理解的是,设置一个不受git开箱即用支持的差异工具需要一些额外的工作/设置/配置。 - RBT

93

其他人已经对此做出了99%的回答,但还有一步被省略了。(我的答案将来自于OS X,因此您需要相应地更改文件路径。)

您需要对~/.gitconfig进行以下更改:

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = /Applications/Diffmerge.app/Contents/MacOS/diffmerge $LOCAL $REMOTE

这将修复差异工具。你也可以在不直接编辑~/.gitconfig的情况下通过在终端输入以下命令来解决此问题:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd "/Applications/DiffMerge.appContents/MacOS/diffmerge \$LOCAL \$REMOTE"

其他人没有提到的1%是,当使用这个命令时,你不能只运行git diff myfile.txt; 你需要运行git difftool myfile.txt


27
因为最后1%的缘故,我给你点赞。没有什么比一颗完全钉入木板中的钉子更让人满意的了;) - Titou
1
有没有办法将其设置为默认工具? - math0ne
10
很好,不过你漏掉了一步 git config --global --add difftool.prompt false。 ;) - Suma

42

我从这里的问题中重现了我的答案,该问题更具体地涉及将Beyond Compare设置为Git的比较工具。 我分享的所有细节对于任何一般的diff工具同样有用,因此在这里分享。

我们运行的第一个命令如下所示:

git config --global diff.tool bc3

以上命令会在%userprofile%目录下的.gitconfig文件中创建以下条目:

[diff]
    tool = bc3

%userprofile% 是一个环境变量,你可以在运行提示符中输入并按下Enter,以打开包含.gitconfig文件的目录位置。

就这样。 这就是在设置已发布版本的任何已知比较工具(如此例中Git已知其第三版Beyond Compare)时所需的全部内容。

现在让我们深入了解一下!

此外,你可能需要运行以下命令:

git config --global difftool.bc3.path "c:/program files/beyond compare 3/bcomp.exe"

运行该命令是可选的。它仅在某些特殊情况下才需要。我们很快就会知道它的原因。

这里最重要的事情是了解关键字bc3。这是Git中一个众所周知的关键字,它映射到市场上特定版本的特定比较工具,比如在这种情况下,bc3对应于Beyond Compare工具的第三个版本。如果您想查看Git维护的关键字完整列表,则在Git Bash命令行上运行下面的命令:

git difftool --tool-help

当我们运行上述命令时,它会返回以下列表:

vimdiff
vimdiff2
vimdiff3
araxis
bc
bc3
codecompare
deltawalker
diffmerge
diffuse
ecmerge
emerge
examdiff
gvimdiff
gvimdiff2
gvimdiff3
kdiff3
kompare
meld
opendiff
p4merge
tkdiff
winmerge
xxdiff
在为Git设置比较工具时,可以根据使用的工具及其版本使用上述任何预定义键之一,例如,对于Beyond Compare v1,我们将使用键bc,对于Beyond Compare v3,我们将使用键bc3。但在某些情况下,我们可能需要定义自己的全新键,例如,假设我们正在设置一个刚刚推出市场的全新比较工具。由于明显的原因,您计算机上安装的Git当前版本不会显示任何与此新工具相对应的键。最终Git将在未来发布中展示它,但不是立即。同样,这个问题也可能发生在现有工具的新版本发布上,例如,上述列表中没有Beyond Compare v4的键。因此,您始终可以将任何工具映射到任何预定义键或自定义键中。如果您将任何工具映射到Git已知的键,则无需运行第二个命令。但请记住,这仅在工具的EXE位置在各个版本之间不变时才有效。如果Beyond Compare v3和v4在%programfiles%目录中具有不同的安装位置,则必须运行第二个命令。
[diff]
tool = bc3

但是,如果我们想要关联非默认的工具,则需要单独提及路径属性,以便Git知道从哪里启动EXE的路径。下面的条目告诉Git启动Beyond Compare v4。请注意EXE的路径:

[difftool "bc3"]
path = c:/program files/Beyond Compare 4/bcomp.exe

此外,如果我们愿意,我们可以将Beyond Compare v4映射到其他工具预定义的任何键上,例如examdiff。Git不会阻止您这样做的坏事情。虽然我们不应该这样做以避免维护上的噩梦。

最干净的方法是定义一个自定义键。我们可以为任何新的比较工具或旧工具的新版本定义全新的键。就像在我的例子中,我定义了一个相当直观的新键bc4。我也可以把它命名为foobaar

现在,当键值是全新的时候,设置过程略有不同。在这种情况下,您需要运行两个命令。但是我们的第二个命令将不会设置新工具的EXE路径。相反,我们必须像下面显示的那样为我们的新工具设置cmd属性:

git config --global diff.tool bc4

git config --global difftool.bc4.cmd "\"C:\\Program Files\\Beyond Compare 4\\bcomp.exe\" -s \"\$LOCAL\" -d \"\$REMOTE\""

运行上述命令将在您的.gitconfig文件中创建以下条目:

[diff]
tool = bc4

[difftool "bc4"]
cmd = \"C:\\Program Files\\Beyond Compare 4\\bcomp.exe\" -s \"$LOCAL\" -d \"$REMOTE\"
我强烈建议你遵循方法2,以避免将来出现任何维护问题。

37

这是我 ~/.gitconfig 文件中配置 diff 和 merge 工具的部分。我喜欢 SourceGear 的 diffmerge (事实上,我非常非常喜欢它)。

[merge]
        tool = diffmerge
[mergetool "diffmerge"]
        cmd = "diffmerge --merge --result=\"$MERGED\" \"$LOCAL\" \"$(if test -f \"$BASE\"; then echo \"$BASE\"; else echo \"$LOCAL\"; fi)\" \"$REMOTE\""
        trustExitCode = false
[diff]
        tool = diffmerge
[difftool "diffmerge"]
        cmd = diffmerge \"$LOCAL\" \"$REMOTE\"

所以,你可以看到,在[difftool "diffmerge"]行中定义了一个名为"diffmerge"的工具。然后在[diff] tool=部分中将工具"diffmerge"设置为默认值。

显然,我在路径中有"diffmerge"命令。否则,我需要给出可执行文件的完整路径。


diffmerge --merge --result="$MERGED" "$LOCAL" "$(if test -f "$BASE"; then echo "$BASE"; else echo "$LOCAL"; fi)" "$REMOTE" - Tim Lovell-Smith
1
我选择更简单的 diffmerge --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE" - Tim Lovell-Smith
它还有一个方便的“sgdm_cygwin.sh”脚本,使得Windows版本易于从Cygwin使用。 - thoni56
所以你只需要执行 ln-s <pathtodiffmerge>/sgdm_cygwin.sh /usr/local/bin/diffmerge,就可以使用上述配置了。同时,也可以在cygwin命令行中直接使用带有cygwin路径的 diffmerge - thoni56
现在应该是 sgdm.exe - kzu

19

以下任意一个方案都适用于我在Windows和Linux开发环境中使用KDiff3。它是一个不错的跨平台差异和合并工具,使用起来很一致。

Linux

[difftool "kdiff3"]
    path = /usr/bin/kdiff3
    trustExitCode = false
[difftool]
    prompt = false
[diff]
    tool = kdiff3
[mergetool "kdiff3"]
    path = /usr/bin/kdiff3
    trustExitCode = false
[mergetool]
    keepBackup = false
[merge]
    tool = kdiff3

Windows

[difftool "kdiff3"]
    path = C:/Progra~1/KDiff3/kdiff3.exe
    trustExitCode = false
[difftool]
    prompt = false
[diff]
    tool = kdiff3
[mergetool "kdiff3"]
    path = C:/Progra~1/KDiff3/kdiff3.exe
    trustExitCode = false
[mergetool]
    keepBackup = false
[merge]
    tool = kdiff3

你找到了一种方法来创建一个单一的跨平台.gitconfig文件,可以有条件地指定Linux和Windows的正确路径吗? - Jerry Asher
1
老实说,我已经在所有地方都切换到了Meld,并且它似乎很好用。 - moodboom
有没有设置 trustExitCode = false 的原因?据我理解,如果设置为 false,则 git 会忽略来自您的工具的非零退出代码。因此,如果您的工具崩溃,git 将错误地认为合并成功了。但也许设置为 false 是有原因的,请解释一下。 - apollo
我相信 trustExitCode = false 会导致 Git 询问您合并是否成功,而不是依赖于工具是否以真或假状态退出。 - moodboom

6
如果您想要使用多个不同的diff工具,可以向文件.gitconfig中添加一个别名:
[alias]
    kdiff = difftool --tool kdiff3

1
提及--tool选项,谢谢。 - itMaxence

3
请参考微软的VS Code 技巧和技巧。 只需在终端中运行以下命令即可: git config --global merge.tool code 但首先您需要将code命令添加到您的PATH环境变量中。

Enter image description here


代码命令已经在我的用户路径上了,但是这对我没有用。 - Matthew

1
在Windows中,我们需要运行git difftool --tool-help命令来查看各种选项,例如:
    'git difftool --tool=<tool>' may be set to one of the following:
                    vimdiff
                    vimdiff2
                    vimdiff3

    The following tools are valid, but not currently available:
                    araxis
                    bc
                    bc3
                    codecompare
                    deltawalker
                    diffmerge
                    diffuse
                    ecmerge
                    emerge
                    examdiff
                    gvimdiff
                    gvimdiff2
                    gvimdiff3
                    kdiff3
                    kompare
                    meld
                    opendiff
                    p4merge
                    tkdiff
                    winmerge
                    xxdiff

Some of the tools listed above only work in a windowed
environment. If run in a terminal-only session, they will fail.

我们可以添加任何一个(例如WinMerge)像这样

git difftool --tool=winmerge

配置Notepad++以在提交之前查看文件:

 git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

使用 git commit 命令会在 Notepad++ 中打开提交信息。


1
几乎所有之前回答中的解决方案都不适用于Git版本2。我的Git版本是2.28.0。解决difftool的方法是:git config --global diff.tool vimdiff。之后,您就可以毫无问题地使用它了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接