如何使用我偏好的diff工具/查看器查看“git diff”输出?

824

当我键入git diff命令时,我希望使用我选择的可视化差异工具(Windows上的SourceGear "diffmerge")查看输出。如何配置git以实现这一点?


118
在所有新版本的git中,您可以使用“git difftool”代替“git diff”,这将打开一个可视化的差异比较程序。 - Debajit
2
gitx - http://gitx.frim.nl/. 就这样了。 - Alex Grande
1
在这里你可以找到简短的教程:http://nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy - Dmitry Bespalov
使用git difftool -tool=opendiff命令并将opendiff替换为任何其他工具。 - potench
6
在 Git Bash 中前往您的代码库。输入 git config diff.tool winmerge。通过输入 git difftool 来验证它是否可用。通过输入 git config --global difftool.prompt false 来取消提示。我建议使用 p4merge 而不是 winmerge。 - Michael S.
显示剩余3条评论
26个回答

8

我在Windows 7上测试通过。不需要中介的 sh 脚本。

.gitconfig 文件内容:

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

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

你是否也将kdiff3定义为你的合并工具?如果是,不介意分享一下你的gitconfig中相关部分吗? - blong
2
谢谢。这对我来说不太起作用,但是当我删除了“path”并将“cmd”更改为“\“C:/Program Files (x86)/KDiff3/kdiff3.exe\”\”“$LOCAL”“$REMOTE””时它确实起作用了。 - Steve Chambers

8

前面的伟大答案简述如下:

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

然后通过输入以下命令来使用它(也可以选择指定文件名):

git difftool

7

安装Meld

 # apt-get install meld

然后选择它作为diff工具:
 $ git config --global diff.tool meld

如果你想在控制台中运行它,请输入:

 $ git difftool

如果您想使用图形模式,请键入:

 $ git mergetool

输出将是:
 'git mergetool' will now attempt to use one of the following tools:
 meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse
 diffmerge ecmerge p4merge araxis bc3 codecompare emerge vimdiff
 Merging:
 www/css/style.css
 www/js/controllers.js

 Normal merge conflict for 'www/css/style.css':
   {local}: modified file
   {remote}: modified file
 Hit return to start merge resolution tool (meld):

所以只需按下 Enter 键即可使用 meld(默认)。这将打开图形模式。进行神奇的保存并按下解决合并的按钮。就这些了。

我喜欢Meld,但它在MacOS上的表现非常糟糕,所以我转而使用Sublime Merge。 - Calvin Taylor

6

如果您使用的是Mac,并且已经安装了Xcode,那么您就已经安装了FileMerge。终端命令是opendiff,因此您只需要执行以下命令:

git difftool -t opendiff

2
使用-y选项以避免烦人的提示。不幸的是,git会等待FileMerge退出后才提供下一个更改的文件。使用-d选项进行一次性目录比较。 - miner49r
选项“-t”似乎需要完整路径。也许使用“git difftool --extcmd=opendiff”更好。 - yucer

6

介绍

为了参考,我想包含我对 VonC 的答案的变化。请记住,我正在使用修改过的 PATH 的 MSys 版本的 Git(此时为1.6.0.2),并从 PowerShell(或 cmd.exe)中运行 Git 自身,而不是 Bash shell。

我引入了一个新命令,gitdiff。运行此命令会临时重定向 git diff 以使用您选择的视觉差异程序(与 VonC 的解决方案永久执行的方式不同)。这使我既可以拥有默认的 Git 差异功能(git diff),也可以使用视觉差异功能(gitdiff)。这两个命令都接受相同的参数,因此例如要在特定文件中可视地比较更改,您可以键入

gitdiff path/file.txt

安装设置

请注意,$GitInstall 是 Git 安装目录的占位符。

  1. Create a new file, $GitInstall\cmd\gitdiff.cmd

     @echo off
     setlocal
     for /F "delims=" %%I in ("%~dp0..") do @set path=%%~fI\bin;%%~fI\mingw\bin;%PATH%
     if "%HOME%"=="" @set HOME=%USERPROFILE%
     set GIT_EXTERNAL_DIFF=git-diff-visual.cmd
     set GIT_PAGER=cat
     git diff %*
     endlocal
    
  2. Create a new file, $GitInstall\bin\git-diff-visual.cmd (replacing [visual_diff_exe] placeholder with full path to the diff program of your choice)

     @echo off
     rem diff is called by git with 7 parameters:
     rem path old-file old-hex old-mode new-file new-hex new-mode
     echo Diffing "%5"
     "[visual_diff_exe]" "%2" "%5"
     exit 0
    
  3. You're now done. Running gitdiff from within a Git repository should now invoke your visual diff program for every file that was changed.


6
以下是适用于Windows的批处理文件,假设DiffMerge安装在默认位置,处理x64,必要时处理前向斜杠替换,并具有自我安装的能力。 可以轻松地使用您喜欢的差异程序替换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

很棒的脚本,它省去了我查找DiffMerge命令的麻烦。你可能需要修改安装行以使用引号 - 我在我的机器上遇到了问题:"%1" == "--install"。 - Mario

5

如果您需要在Git 1.6.3之前的版本上配置Git diff工具的Linux版本,这篇简明教程是非常好的参考。

简单来说:

第一步:将以下内容添加到您的.gitconfig文件中:

[diff]
  external = git_diff_wrapper
[pager]
  diff =

第二步:创建一个名为 git_diff_wrapper 的文件,并将其放在 $PATH 中的某个位置。

#!/bin/sh

vimdiff "$2" "$5"

4

在 Mac OS X 上,

git difftool -t diffuse

这个工具在Git文件夹中对我很有帮助。要安装Diffuse,可以使用端口 -。

sudo port install diffuse

“port”?在BSD上? - Peter Mortensen
你能添加关于“端口”和“扩散”的参考文献吗?还有预设的平台/操作系统吗? - Peter Mortensen

3
以下内容可以从其他答案中获得,但对我来说有点困难(信息量太大),因此这里是关于tkdiff的“直接输入”答案:
git difftool --tool=tkdiff <path to the file to be diffed>

你可以把你最喜欢的文件比较工具的可执行文件名称替换掉 tkdiff。只要 (例如 tkdiff) 或者你最喜欢的比较工具在 PATH 环境变量中,它就会被启动。


这是最简单和最快的方式。 - Zameer Fouzan

3
你可以使用 git difftool 命令。例如,如果你安装了 Meld,你可以通过以下命令编辑分支 masterdevel
git config --global diff.external meld
git difftool master..devel

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