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


当前回答

在查看了其他一些外部差异工具后,我发现IntelliJ IDEA(和Android Studio)中的差异视图是我最喜欢的。

步骤1-设置IntelliJ IDEA以从命令行运行

如果要使用IntelliJ IDEA作为差异工具,应首先设置IntelliJ IDEA,以便按照以下说明从命令行运行:

在macOS或UNIX上:

确保IntelliJ IDEA正在运行。在主菜单上,选择“工具”|“创建命令行启动器”。将打开“创建启动器脚本”对话框,其中包含启动器脚本的建议路径和名称。您可以接受默认值,也可以指定自己的路径。注意它,因为你稍后会需要它。在IntelliJ IDEA之外,将启动器脚本的路径和名称添加到路径中。

在Windows上:

在Path系统环境变量中指定IntelliJ IDEA可执行文件的位置。在这种情况下,您将能够从任何目录调用IntelliJ IDEA可执行文件和其他IntelliJ IDEA命令。

步骤2-配置git以使用IntelliJ IDEA作为difftool

遵循此博客文章的说明:

Bash

export INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
PATH=$IDEA_HOME $PATH

Fish

set INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
set PATH $INTELLIJ_HOME $PATH

现在将以下内容添加到git配置中:

[merge]
   tool = intellij
[mergetool "intellij"]
   cmd = idea merge $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") $(cd $(dirname "$BASE") && pwd)/$(basename "$BASE") $(cd $(dirname "$MERGED") && pwd)/$(basename "$MERGED")
   trustExitCode = true
[diff]
   tool = intellij
[difftool "intellij"]
   cmd = idea diff $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE")

您可以使用gitdifftool或gitdifftoolHEAD~1进行测试

其他回答

Windows/MSYS Git解决方案

看完答案后,我发现了一种更简单的方法,只需要更改一个文件。

使用参数2和5创建一个批处理文件来调用diff程序。此文件必须位于您路径中的某个位置。(如果您不知道它在哪里,请将其放在C:\windows中。)调用它,例如,“gitdiff.bat”。我的是:@回声消失REM这是gitdiff.bat“C:\Program Files\WinMerge\WinMergeU.exe”%2%5将环境变量设置为指向批处理文件。例如:GIT_EXTERNAL_DIFF=gitdiff.bat。或通过PowerShell键入GIT-config--globaldiff.EXTERNAL gitdiff.bat。重要的是不要使用引号或指定任何路径信息,否则将无法工作。这就是为什么gitdiff.bat必须在您的路径中。

现在,当您键入“gitdiff”时,它将调用外部diff查看器。

我还有一个补充。我喜欢经常使用不支持作为默认工具之一的diff应用程序(例如万花筒),通过

git difftool -t

我还希望将默认diff作为常规命令行,因此设置GIT_EXTERNAL_diff变量不是一个选项。

您可以使用以下命令一次性使用任意diff应用程序:

git difftool --extcmd=/usr/bin/ksdiff

它只将2个文件传递给您指定的命令,因此您可能也不需要包装器。

介绍

作为参考,我想加入我对VonC答案的变化。请记住,我使用的是MSys版本的Git(此时为1.6.0.2)和修改的PATH,并从PowerShell(或cmd.exe)运行Git本身,而不是Bash shell。

我引入了一个新命令gitdiff。运行此命令会暂时重定向git diff以使用您选择的可视化diff程序(与VonC的解决方案相反,VonC会永久执行此操作)。这使我既可以使用默认的Git diff功能(gitdiff),也可以使用可视化diff功能。这两个命令都采用相同的参数,例如,为了直观地区分特定文件中的更改,可以键入

gitdiff path/file.txt

安装程序

注意,$GitInstall用作安装Git的目录的占位符。

创建新文件$GitInstall\cmd\gitdiff.cmd@回声消失设置本地的对于/F“delims=”%%I in(“%~dp0...”)do@set path=%%~fI\bin;%%~fI\mingw\bin;%路径%如果“%HOME%”==“”@设置HOME=%USERPROFILE%设置GIT_EXTERNAL_DIFF=GIT-DIFF-visual.cmd设置GIT_PAGER=猫git差异%*末端局部的创建一个新文件$GitInstall\bin\git-diff-visual.cmd(用您选择的diff程序的完整路径替换[visual_diff_exe]占位符)@回声消失git使用7个参数调用rem-diff:rem路径旧文件旧十六进制旧模式新文件新十六进制新模式回声差异“%5”“[visual_diff_exe]”“%2”“%5”退出0你现在完成了。在Git存储库中运行gitdiff现在应该为每个更改的文件调用可视化diff程序。

要完成前面的“diff.external”配置回答:

正如Jakub所提到的,Git1.6.3引入了gitdifftool,最初于2008年9月提出:

用法=“[--工具=工具][--提交=参考][--开始=参考--结束=参考]][--无提示][要合并的文件]”(请参阅此答案的最后部分中的--extcmd)

$LOCAL包含起始修订版中的文件内容,$REMOTE包含结束修订版中文件的内容。$BASE包含世界中文件的内容

它基本上被修改为在git索引/工作树上操作。此脚本的通常使用情况是当您有暂存或未暂存的更改,并且希望在并排的diff查看器(例如xxdiff、tkdiff等)中查看更改时。

git difftool [<filename>*]

另一个用例是当您希望看到相同的信息,但比较任意提交时(这是revarg解析可能更好的部分)

git difftool --start=HEAD^ --end=HEAD [-- <filename>*]

最后一个用例是当您想将当前工作树与HEAD以外的其他东西(例如标记)进行比较时

git difftool --commit=v1.0.0 [-- <filename>*]

注意:由于Git2.5,Git-configdiff.toolwinmerge就足够了!请参阅“git mergetool winmerge”

从Git 1.7.11开始,您可以选择-dir diff,以便生成外部diff工具,在填充两个临时目录后,可以一次比较两个目录层次结构,而不是每个文件对运行一次外部工具的实例。


Git 2.5之前:

使用自定义diff工具配置difftool的实际案例:

C:\myGitRepo>git config --global diff.tool winmerge
C:\myGitRepo>git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --global difftool.prompt false

如果winmerge.sh存储在PATH的目录部分中:

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote"

如果您有另一个工具(kdiff3、P4Diff…),请创建另一个shell脚本和相应的difftool.myDiffTool.cmd配置指令。然后,您可以使用diff.tool配置轻松切换工具。

你还有Dave的这个博客条目,以添加其他详细信息。(或针对winmergeu选项的此问题)

此设置感兴趣的是winmerge.shscript:您可以自定义它以考虑特殊情况。

例如,请参见下面David Marble的回答,以获取处理以下问题的示例:

源或目标中的新文件已删除源或目标中的文件


正如Kem Mason在他的回答中提到的,您也可以通过使用--extcmd选项来避免任何包装器:

--extcmd=<command>

指定用于查看差异的自定义命令。gitdifftool忽略配置的默认值,并在指定此选项时运行$command$LOCAL$REMOTE。

例如,这就是gitk能够运行/使用任何diff工具的方式。

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

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

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