Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

use Winmerge inside of Git to file diff

Is there a way to use Winmerge inside of git to do Diffs?

like image 985
eiu165 Avatar asked Dec 10 '09 15:12

eiu165


People also ask

Does WinMerge work with Git?

Winmerge is installed. Git for windows is installed, from "git version 2.12. 0. windows1" or above (although earlier versions of git may have introduced the command).

How do I use Mergetool meld in git?

git mergetool allows you to use a GUI merge program (i.e. Meld) to resolve the merge conflicts that have occurred during a merge. Like difftool you can set the GUI program on the command line using -t <tool> / --tool=<tool> but, as before, it makes more sense to configure it in your . gitconfig file.


1 Answers

Update June 2015, 6 years later:

As detailed in "git mergetool winmerge", a simple git config diff.tool winmerge will be enough.

Git 2.5+ (Q2, 2015) is now aware of Winmerge as a diff or merge tool!


Original answer (2009-2012)

(msysgit, 1.6.5, DOS session)

The first part (using winmerge) is described in "How do I view ‘git diff’ output with visual diff program?"

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 

With winmerge.sh stored in a directory part of your PATH:

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

(see WinMerge Command-line options)

git difftool 

will now launch WinMerge.
If you want git diff to launch WinMerge, just set:

set GIT_EXTERNAL_DIFF=winmerge.sh 

But the real added value comes from the ability to use that same diff tool to present all differences in one batch instead of presenting them sequentially, forcing you to close the diff tool windows one file at a time.

Update June 2012 (2-and-a-half years later):

Comparing directories instead of file-by-file will be available soon:
See [ANNOUNCE] Git 1.7.11.rc1:

"git difftool" learned the "--dir-diff" option to spawn external diff tools that can compare two directory hierarchies at a time after populating two temporary directories, instead of running an instance of the external tool once per a file pair.

See "Patch difftool: teach difftool to handle directory diffs", and the answer "Directory comparison of Git branches" for more details.


Original difftool by directories script (December 2009)

As Seba Illingworth mentions in his answer, a script git-diffall.sh (also put in the path) can do just that:

#!/bin/sh git diff --name-only "$@" | while read filename; do     git difftool "$@" --no-prompt "$filename" & done 

But that only works by opening n windows for n files (if you try to use the -s option of WinMerge, it will not work because of the temp files being deleted by the difftool too early)


That is why I like the approach of GitDiff.bat - power-diffing with GI, which allows you to review the list of files with a difference, before selecting one to examine its internal differences.
I have tweaked it to use only DOS commands

@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 

It is not robust enough to handle files with same names in different directories, but it gives you a general idea of what is possible:
Here only one WinMerge will open up, with the list of files having internal differences. You can click on the ones you want to examines, then a simple ESC will close the all WinMerge-diff session.

like image 60
VonC Avatar answered Sep 22 '22 19:09

VonC