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


当前回答

尝试此解决方案:

$ meld my_project_using_git

Meld了解Git,并提供最近更改的导航。

其他回答

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

git difftool -t

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

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

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

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

这是一个适用于Windows的批处理文件-假设DiffMerge安装在默认位置,处理x64,根据需要处理前向反斜杠替换,并能够自行安装。应该很容易用你喜欢的diff程序替换DiffMerge。

要安装:

gitvdiff --install 

gitvdiff.bat:

@echo off

REM ---- Install? ----
REM To install, run gitvdiff --install

if %1==--install goto install



REM ---- Find DiffMerge ----

if DEFINED ProgramFiles^(x86^) (
    Set DIFF="%ProgramFiles(x86)%\SourceGear\DiffMerge\DiffMerge.exe"
) else (
    Set DIFF="%ProgramFiles%\SourceGear\DiffMerge\DiffMerge.exe"
)



REM ---- Switch forward slashes to back slashes ----

set oldW=%2
set oldW=%oldW:/=\%
set newW=%5
set newW=%newW:/=\%


REM ---- Launch DiffMerge ----

%DIFF% /title1="Old Version" %oldW% /title2="New Version" %newW%

goto :EOF



REM ---- Install ----
:install
set selfL=%~dpnx0
set selfL=%selfL:\=/%
@echo on
git config --global diff.external %selfL%
@echo off


:EOF

在Mac OS X上,

git difftool -t diffuse

在Git文件夹中为我做这项工作。要安装漫反射,可以使用端口-

sudo port install diffuse

要完成前面的“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工具的方式。

这在Windows 7上适用。不需要中间sh脚本

.gitconfig的内容:

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

    [difftool "kdiff3"]
      path = C:/Program Files (x86)/KDiff3/kdiff3.exe
      cmd = "$LOCAL" "$REMOTE"