2015年6月更新,6年后:
详见" git mergetool winmerge",一个简单的WinMerge-diff就足够了。
Git 2.5+(2015年第2季度)现在已经将Winmerge视为差异或合并工具!
原答案(2009-2012)
(msysgit,1.6.5,DOS会话)
第一部分(使用winmerge)在&#34中描述;如何使用visual diff程序查看'git diff'输出?"
C:\myGitRepo>git config --replace --global diff.tool winmerge
C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --replace --global difftool.prompt false
WinMerge-diff存储在difftool的目录部分中:
#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -u -dl "Local" -dr "Remote" "$1" "$2"
(请参阅WinMerge命令行选项)
git difftool
现在将启动WinMerge。
如果您想要WinMerge-diff启动WinMerge,只需设置:
set GIT_EXTERNAL_DIFF=winmerge.sh
但真正的附加价值来自于使用相同的差异工具在一个批次中呈现所有差异而不是按顺序呈现它们的能力,迫使您一次关闭一个文件的差异工具窗口。
2012年6月更新(2年半后):
将很快比较目录而不是逐个文件:
见[ANNOUNCE] Git 1.7.11.rc1:
"WinMerge-diff" 学到了#34; difftool" 生成外部差异工具的选项,可以在填充两个临时目录后一次比较两个目录层次结构,而不是每个文件对运行一次外部工具实例。
请参阅"补丁WinMerge-diff:教授difftool以处理目录差异",以及答案" Git分支的目录比较" 更多细节。
目录脚本的原始difftool(2009年12月)
正如Seba Illingworth在他的回答中提到的,脚本git-diffall.sh(也放在路径中)可以做到这一点:
#!/bin/sh
git diff --name-only "$@" | while read filename; do
git difftool "$@" --no-prompt "$filename" &
done
但这只适用于为n个文件打开n个窗口(如果你尝试使用WinMerge的WinMerge-diff选项,它将无法工作,因为过早地被difftool删除了临时文件)
这就是为什么我喜欢GitDiff.bat的方法 - 使用GI进行功率差异,这允许您在选择一个文件以查看其内部差异之前查看具有差异的文件列表。
我已经调整它只使用DOS命令
@echo off
setlocal
if "%1" == "-?" (
echo GitDiff - enables diffing of file lists, instead of having to serially
echo diff files without being able to go back to a previous file.
echo Command-line options are passed through to git diff.
echo If GIT_FOLDER_DIFF is set, it is used to diff the file lists. Default is windff.
goto END
)
if "%GIT_DIFF_COPY_FILES%"=="" (
rd /s /q %TEMP%\GitDiff
mkdir %TEMP%\GitDiff
mkdir %TEMP%\GitDiff\old
mkdir %TEMP%\GitDiff\new
REM This batch file will be called by git diff. This env var indicates whether it is
REM being called directly, or inside git diff
set GIT_DIFF_COPY_FILES=1
set GIT_DIFF_OLD_FILES=%TEMP%\GitDiff\old
set GIT_DIFF_NEW_FILES=%TEMP%\GitDiff\new
set GIT_EXTERNAL_DIFF=%~dp0\GitDiff.bat
echo Please wait and press q when you see "(END)" printed in reverse color...
call git diff %*
if defined GIT_FOLDER_DIFF (
REM This command using GIT_FOLDER_DIFF just does not work for some reason.
%GIT_FOLDER_DIFF% %TEMP%\GitDiff\old %TEMP%\GitDiff\new
goto END
)
if exist "%ProgramFiles%\Beyond Compare 2\BC2.exe" (
set GIT_FOLDER_DIFF="%ProgramFiles%\Beyond Compare 2\BC2.exe"
"%ProgramFiles%\Beyond Compare 2\BC2.exe" %TEMP%\GitDiff\old %TEMP%\GitDiff\new
goto END
)
"%ProgramFiles(x86)%\WinMerge\WinMergeU.exe" -r -e -dl "Local" -dr "Remote" %TEMP%\GitDiff\old %TEMP%\GitDiff\new
goto END
)
REM diff is called by git with 7 parameters:
REM path old-file old-hex old-mode new-file new-hex new-mode
copy %TEMP%\%~nx2 %GIT_DIFF_OLD_FILES%\%1
copy %5 %GIT_DIFF_NEW_FILES%
:END
它不够强大,无法处理不同目录中具有相同名称的文件,但它可以让您大致了解可能的内容:
这里只打开一个WinMerge,文件列表有内部差异。 您可以单击要检查的那些,然后一个简单的ESC将关闭所有WinMerge-diff会话。