当我键入gitdiff时,我想用我选择的可视化diff工具(Windows上的SourceGear“diffmerge”)查看输出。如何配置git以执行此操作?


当前回答

如果您不熟悉命令行,那么如果您安装了TortoiseGit,您可以右键单击一个文件以获得带有“Diff later”选项的TortoiseGit子菜单。

当您在第一个文件上选择此选项时,您可以右键单击第二个文件,转到TortoiseGit子菜单并选择“Diffwith==yourfilehere==”。这将为结果提供TortoiseGit合并GUI。

其他回答

从Git 1.6.3版开始,有了“gitdifftool”,您可以将其配置为使用您最喜欢的图形diff工具。

目前(在撰写此答案时)开箱即用支持KDiff3、Kompare、tkdiff、Meld、xxdiff、emerge、vimdiff、gvimdiff、ecmerge、Diffuse和opendiff;如果您要使用的工具不在此列表中,您可以始终使用difftool<tool>.cmd'配置选项。

“gitdifftool”接受与“gitdiff”相同的选项。

从Git1.6.3开始,您可以使用gitdifftool脚本:参见下面的答案。


也许这篇文章会对你有所帮助。以下是最好的部分:

有两种不同的方法来指定外部差异工具。

第一种是您使用的方法,通过设置GIT_EXTERNAL_DIFF变量。但是,该变量应该指向可执行文件的完整路径。此外,GIT_EXTERNAL_DIFF指定的可执行文件将使用固定的7个参数集调用:

path old-file old-hex old-mode new-file new-hex new-mode

由于大多数diff工具将需要不同的参数顺序(并且只有一些),因此您很可能需要指定一个包装脚本,而包装脚本反过来调用真正的diff工具。

第二种方法(我更喜欢)是通过“git”配置外部diff工具config“。下面是我所做的:

1) 创建一个包装脚本“gitdiffwrapper.sh”,其中包含如下内容

-->8-(snip)--
#!/bin/sh

# diff is called by git with 7 parameters:
# path old-file old-hex old-mode new-file new-hex new-mode

"<path_to_diff_executable>" "$2" "$5" | cat
--8<-(snap)--

如您所见,只有第二个(“旧文件”)和第五个(“新文件”)参数传递给diff工具。

2) 类型

$ git config --global diff.external <path_to_wrapper_script>

在命令提示符下,替换为“gitdiffwrapper.sh”的路径,因此~/.gitconfig包含

-->8-(snip)--
[diff]
    external = <path_to_wrapper_script>
--8<-(snap)--

确保使用正确的语法指定包装脚本和diff的路径工具,即使用前斜杠而不是反斜杠。就我而言,我有

[diff]
    external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"

在.gitconfig和

"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat

在包装脚本中。当心后面的“猫”!

(我想,“|cat”仅适用于某些可能无法返回正确或一致返回状态的程序。如果diff工具具有显式返回状态,您可能希望尝试不使用尾随cat)

(Diomidis Spinellis在评论中补充道:

cat命令是必需的,因为如果文件不同,diff(1)默认退出时会显示错误代码。Git期望外部diff程序仅在发生实际错误时(例如,内存用完时)退出并返回错误代码。通过将git的输出管道到cat,非零错误代码被屏蔽。更有效的方法是,程序只需在参数为0的情况下运行exit。)


这(上面引用的文章)是通过配置文件(而不是通过环境变量)定义的外部工具的理论。在实践中(对于外部工具的配置文件定义),您可以参考:

如何使用msysgit/gitk设置DiffMerge?它说明了MsysGit和gitk的DiffMerge和WinMerge的具体设置我如何设置一个编辑器来在Windows上使用Git?将Notepad++定义为外部编辑器。

使用新的gitdifftool,只需将其添加到.gitconfig文件中即可:

[diff]
    tool = any-name
[difftool "any-name"]
    cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""

也可以选择添加:

[difftool]
    prompt = false

还可以查看diffall,这是我编写的一个简单脚本,用于扩展串行打开每个文件的烦人(IMO)默认diff行为。

Windows上的全局.gitconfig位于%USERPROFILE%\.gitconfig中

对以前的伟大答案的简短总结:

git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.prompt false

然后通过键入(也可以选择指定文件名)使用它:

git difftool

如果您通过Cygwin执行此操作,则可能需要使用cygpath:

$ git config difftool.bc3.cmd "git-diff-bcomp-wrapper.sh \$LOCAL \$REMOTE"
$ cat git-diff-bcomp-wrapper.sh
#!/bin/sh
"c:/Program Files (x86)/Beyond Compare 3/BComp.exe" `cygpath -w $1` `cygpath -w $2`