如何用视觉差异程序查看“git diff”输出?
当我inputgit diff ,我想用我select的视觉比较工具(Windows上的SourceGear“diffmerge”)查看输出。 我如何configurationgit来做到这一点? 
由于Git1.6.3,你可以使用git difftool脚本 :请参阅下面的答案 。
可能是这篇文章会帮助你。 这里是最好的部分:
有两种不同的方式来指定外部差异工具。
首先是您使用的方法,通过设置GIT_EXTERNAL_DIFFvariables。 但是,该variables应该指向可执行文件的完整path。 而且,由GIT_EXTERNAL_DIFF指定的可执行文件将被调用一组固定的7个参数:
 path old-file old-hex old-mode new-file new-hex new-mode 
由于大多数差异化工具将需要不同的顺序(只有一些)的参数,你很可能不得不指定一个包装脚本,而反过来调用真正的差异工具。
我更喜欢的第二种方法是通过“git config”configuration外部diff工具 。 这是我做的:
1)创build一个包含类似的包装脚本“git-diff-wrapper.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)types
 $ git config --global diff.external <path_to_wrapper_script> 
在命令提示符处,replace为“git-diff-wrapper.sh”的path,这样〜/ .gitconfig包含
 -->8-(snip)-- [diff] external = <path_to_wrapper_script> --8<-(snap)-- 
确保使用正确的语法来指定包装器脚本和diff工具的path,即使用正向斜杠而不是反斜杠。 就我而言,我有
 [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) 
  (上面引用的文章)是通过configuration文件 (而不是通过环境variables) 定义的外部工具的理论。 
 在实际中(仍然是外部工具的configuration文件定义),可以参考: 
- 如何用msysgit / gitk设置DiffMerge? 它说明了MsysGit和gitk的DiffMerge和WinMerge的具体设置
- 我如何设置一个编辑器来在Windows上使用Git? 将Notepad ++定义为外部编辑器。
为了完成我以前的“diff.external”configuration答案 :
正如Jakub所提到的 ,Git1.6.3引入了2008年9月提出的git difftool :
  USAGE = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]' 
  (请参阅此答案最后部分的--extcmd ) 
  $LOCAL包含起始修订版本中的文件内容, $REMOTE包含结束修订版本中的文件内容。 
  $BASE包含文件中的内容 
这基本上是
git-mergetool修改为在git索引/工作树上运行。这个脚本的通常用例是当你有变化的或非变化的变化,你想看到并排的差异查看器(例如
xxdiff,tkdiff等)的变化。
 git difftool [<filename>*] 
另一个用例是当你想看到相同的信息,但比较任意提交(这是revargparsing可能更好的部分)
 git difftool --start=HEAD^ --end=HEAD [-- <filename>*] 
最后一个用例是当你想比较你当前的工作树和HEAD以外的东西(比如一个标签)
 git difftool --commit=v1.0.0 [-- <filename>*] 
  注意:既然Git 2.5, git config diff.tool winmerge就够了! 
 请参阅“ git mergetool winmerge ” 
在Git 2.5之前:
 使用自定义diff工具configurationdifftool实际案例: 
 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,…),请创build另一个shell脚本以及相应的difftool.myDiffTool.cmdconfiguration指令。 
 然后,您可以使用diff.toolconfiguration轻松切换工具。 
 您也有Dave的这个博客条目添加其他细节。 
  (或者winmergeu选项的这个问题 ) 
 这个设置的兴趣是winmerge.sh脚本 :你可以自定义它来考虑特殊情况。 
下面举一个例子来看David Smith的答案 :
- 新的文件在起源或目的地
- 删除原始或目的地的文件
 正如Kem Mason在他的回答中提到的,你也可以通过使用--extcmd选项来避免任何包装 : 
 --extcmd=<command> 
指定用于查看差异的自定义命令。
git-difftool忽略configuration的默认值,并在指定此选项时运行$command $LOCAL $REMOTE。
 例如,这是如何gitk能够运行/使用任何diff工具 。 
本着回答与问题有所不同的问题的精神。 试试这个解决scheme
 $ meld my_project_using_git 
Meld了解git并提供了有关最近更改的导航。
 由于git版本1.6.3有“ git difftool ”,你可以configuration使用你最喜欢的graphics差异工具。 目前支持的开箱即用的是kdiff3,kompare,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,diffuse和opendiff ; 如果您要使用的工具不在此列表中,则始终可以使用“ difftool.<tool>.cmd ”configuration选项。 
“git difftool”接受与“git diff”相同的选项。
使用新的git difftool ,只要将它添加到.gitconfig文件中即可:
 [diff] tool = any-name [difftool "any-name"] cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\"" 
还检查diffall ,我写了一个简单的脚本来扩展恼人的(国际海事组织)默认比较打开每个序列的行为。
我还有一个补充。 我喜欢经常使用不支持的差异应用程序作为默认工具之一(例如万花筒)
 git difftool -t 
 我也喜欢默认的diff只是常规的命令行,所以设置GIT_EXTERNAL_DIFFvariables不是一个选项。 
 您可以使用此命令一次性使用任意diff应用程序: 
 git difftool --extcmd=/usr/bin/ksdiff 
它只是将2个文件传递给你指定的命令,所以你可能不需要包装器。
build立在VonC的处理文件删除和添加的答案上,使用以下命令和脚本:
 > git config --global diff.tool winmerge > git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\" \"$BASE\"" > git config --global difftool.prompt false 
 这和把你的全局.gitconfig放在一起是一样的: 
 [diff] tool = winmerge [difftool "winmerge"] cmd = winmerge.bat "$LOCAL" "$REMOTE" "$BASE" [difftool] prompt = false 
 然后把下面的内容放在winmerge.sh ,它必须在你的path上: 
 #!/bin/sh NULL="/dev/null" if [ "$2" = "$NULL" ] ; then echo "removed: $3" elif [ "$1" = "$NULL" ] ; then echo "added: $3" else echo "changed: $3" "C:/Program Files (x86)/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$1" "$2" fi 
解决scheme为Windows / msys git
在阅读答案后,我发现了一个简单的方法,只涉及到只更改一个文件。
- 
创build一个batch file来调用你的diff程序,参数2和5.这个文件必须在你的path中的某个地方。 (如果你不知道它在哪里,把它放在c:\ windows)。 调用它,例如,“gitdiff.bat”。 我的是: @echo off REM This is gitdiff.bat "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
- 
将环境variables设置为指向您的batch file。 例如: GIT_EXTERNAL_DIFF=gitdiff.bat。 或者通过键入git config --global diff.external gitdiff.bat。不要使用引号或指定任何path信息,否则不起作用。 这就是为什么gitdiff.bat必须在你的path。 
现在当你input“git diff”时,它会调用你的外部差异查看器。
如果你通过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` 
这在Windows 7上适用于我。不需要中介sh脚本
.gitconfig的内容:
  [diff] tool = kdiff3 [difftool] prompt = false [difftool "kdiff3"] path = C:/Program Files (x86)/KDiff3/kdiff3.exe cmd = "$LOCAL" "$REMOTE" 
上面这些好的答案的简短摘要:
 git difftool --tool-help git config --global diff.tool <chosen tool> git config --global --add difftool.prompt false 
然后通过input(也可以指定文件名)来使用它:
 git difftool 
介绍
作为参考,我想在VonC的答案中join我的变体。 请记住,我正在使用带有修改PATH的Git(此时为1.6.0.2)的MSys版本,并且从Powershell(或cmd.exe)运行Git本身,而不是Bash shell。
 我介绍了一个新的命令, gitdiff 。 运行这个命令会暂时redirectgit diff以使用您select的可视化diff程序(而不是永久性的VonC解决scheme)。 这使我有默认的Git difffunction( git diff )以及可视化difffunction( gitdiff )。 两个命令都采用相同的参数,例如,可以直观地区分您可以键入的特定文件中的更改 
 gitdiff path/file.txt 
build立
 请注意, $GitInstall被用作Git安装目录的占位符。 
- 
创build一个新文件 $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
- 
创build一个新文件 $GitInstall\bin\git-diff-visual.cmd(用你select的diff程序的完整pathreplace[visual_diff_exe]占位符)@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
- 
你现在完成了。 从Git仓库中运行 gitdiff现在应该为每个已更改的文件调用可视化diff程序。
这是一个适用于Windows的batch file – 假定DiffMerge安装在默认位置,处理x64,根据需要处理反斜杠replace,并且具有自行安装的能力。 应该很容易用你最喜欢的差异程序来replaceDiffMerge。
安装:
 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上并且有XCode,那么你已经安装了FileMerge。 terminal命令是opendiff,所以你可以做git difftool -t opendiff 
对于如何在1.6.3之前的git版本(1.6.3添加difftool到git)上configurationdiff工具的linux版本, 这是一个非常简洁的教程,
简单来说:
第1步:将此添加到您的.gitconfig
 [diff] external = git_diff_wrapper [pager] diff = 
第2步:创build一个名为git_diff_wrapper的文件,把它放在$ PATH的某处
 #!/bin/sh vimdiff "$2" "$5" 
安装meld
  # apt-get install meld 
然后selectdifftool
  $ git config --global diff.tool meld 
如果tou想在控制台上input:
  $ git difftool 
如果你想使用graphics模式input:
  $ 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): 
所以只需按回车使用meld(默认),这将打开graphics模式,进行魔术保存,然后按解决合并。 就这样
在Mac OS X上,
 git difftool -t diffuse 
在git文件夹中为我做这项工作。 为了安装diffuse,可以使用port –
 sudo port install diffuse 
我在这里尝试了一些奇特的东西(用tkdiff),没有为我工作。 所以我写了下面的脚本tkgitdiff。 它做我所需要做的。
 $ cat tkgitdiff #!/bin/sh # # tkdiff for git. # Gives you the diff between HEAD and the current state of your file. # newfile=$1 git diff HEAD -- $newfile > /tmp/patch.dat cp $newfile /tmp savedPWD=$PWD cd /tmp patch -R $newfile < patch.dat cd $savedPWD tkdiff /tmp/$newfile $newfile 
 你可以使用git difftool 。 
 例如,如果你有融合 ,你可以编辑分支master devel : 
 git config --global diff.external meld git difftool master..devel 
 我已经在~/.gitconfig使用了很久了: 
 [diff] external = ~/Dropbox/source/bash/git-meld 
 用git-meld : 
 #!/bin/bash if [ "$DISPLAY" = "" ]; then diff $2 $5 else meld $2 $5 fi 
但是现在我已经厌倦了在graphics环境中总是使用融合,并且使用这个设置调用标准差异并不是微不足道,所以我切换到了这个:
 [alias] v = "!sh -c 'if [ $# -eq 0 ] ; then git difftool -y -t meld ; else git difftool -y $@ ; fi' -" 
有了这个设置,像这样的工作:
 git v git v --staged git v -t kompare git v --staged -t tkdiff 
 而且我仍然保留好旧的git diff 。 
 看了其他一些外部差异工具之后,我发现IntelliJ IDEA(和Android Studio)中的diff视图对我来说是最好的。 
第1步 – 安装IntelliJ IDEA从命令行运行
如果你想使用IntelliJ IDEA作为你的diff工具,你应该首先安装IntelliJ IDEA,按照这里的说明从命令行运行:
在macOS或UNIX上:
- 确保IntelliJ IDEA正在运行。
-  在主菜单上,selectTools | Create Command-line LauncherTools | Create Command-line Launcher。 Create Launcher Script对话框将打开,并显示启动脚本的build议path和名称。 您可以接受默认值,或指定自己的path。 注意它,因为你稍后需要它。 在IntelliJ IDEA之外,将启动脚本的path和名称添加到path中。
在Windows上:
- 在Path系统环境variables中指定IntelliJ IDEA可执行文件的位置。 在这种情况下,您将能够从任何目录调用IntelliJ IDEA可执行文件和其他IntelliJ IDEA命令。
第2步 – configurationgit使用IntelliJ IDEA作为difftool
按照此博客上的说明:
巴什
 export INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS PATH=$IDEA_HOME $PATH 
鱼
 set INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS set PATH $INTELLIJ_HOME $PATH 
现在添加以下到您的gitconfiguration:
 [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") 
 你可以用git difftool或者git difftool HEAD~1来试试 
我在Ubuntu上使用kompare:
 sudo apt-get install kompare 
比较两个分支:
 git difftool -t kompare <my_branch> master 
 如果你碰巧已经有了一个与文件types相关的diff工具(比如说,因为你安装了TortoiseSVN,它带有一个diff查看器),你可以将常规的git diff输出传送给一个“temp”文件,然后直接打开该文件而不需要了解观众的一切: 
 git diff > "~/temp.diff" && start "~/temp.diff" 
 将其设置为全局别名会更好: git what 
 [alias] what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f" 
如果你不是一个命令行,那么如果你安装了龟git你可以右键点击一个文件,以获得一个tortoisegit子菜单与“稍后比较”选项。
当你在第一个文件上select这个时,你可以右键单击第二个文件,进入tortoisegit子菜单并select“Diff with == yourfilehere ==”这将给出tortoisegitmerge gui的结果。
 你可能想尝试xd http://github.com/jiqingtang/xd ,它是GIT / SVN diff的GUI包装器。 它本身不是一个差异化工具。 你运行xd当你想运行git diff或者svn diff ,它会显示一个文件列表,一个预览窗口,你可以启动你喜欢的任何diff工具,包括tkdiff,xxdiff,gvimdiff,emacs(ediff),xemacs埃迪夫),融合,弥漫,kompare和kdiff3。 您也可以运行任何自定义工具。 
不幸的是,该工具不支持Windows。
披露 :我是这个工具的作者。