Есть ли способ использовать Winmerge внутри git для выполнения Diffs?
Используйте Winmerge внутри Git для файла diff
Ответ 1
Обновление Июнь 2015 года, 6 лет спустя:
Как указано в разделе git mergetool winmerge", достаточно простого git config diff.tool winmerge.
git 2.5+ (Q2, 2015) теперь известно о Winmerge как инструменте diff или merge!
Оригинальный ответ (2009-2012)
(msysgit, 1.6.5, сеанс DOS)
Первая часть (с использованием winmerge) описана в разделе "Как просмотреть вывод 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.sh хранится в части каталога вашего PATH:
#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -u -dl "Local" -dr "Remote" "$1" "$2"
(см. Параметры командной строки WinMerge)
git difftool
теперь запустит WinMerge. 
Если вы хотите, чтобы git diff запускал WinMerge, просто установите:
set GIT_EXTERNAL_DIFF=winmerge.sh
Но реальная добавленная стоимость исходит из возможности использовать тот же инструмент diff для для представления всех различий в одном пакете вместо того, чтобы представлять их последовательно, заставляя вас закрывать окна инструментов разметки одним файлом на время.
Обновление Июнь 2012 (через 2 с половиной года):
Сравнение каталогов вместо файлов по файлу будет доступно в ближайшее время: 
См. [ANNOUNCE] Git 1.7.11.rc1:
"
git difftool" выучил параметр--dir-diffдля создания внешних средств сравнения, которые могут сравнивать две иерархии каталогов за один раз после заполнения двух временных каталогов вместо запуска экземпляр внешнего инструмента один раз на пару файлов.
См. "  Патч difftool: научить difftool обрабатывать различия в каталогах", а ответ "Сравнение каталогов Git веток" для более подробной информации.
Оригинальный diffftool по каталогам script (декабрь 2009)
Как Себа Иллингворт упоминает в его ответ, script git -diffall.sh(также помещенный в путь) может сделать только это:
#!/bin/sh
git diff --name-only "[email protected]" | while read filename; do
    git difftool "[email protected]" --no-prompt "$filename" &
done
Но это работает только при открытии n окон для n файлов (если вы пытаетесь использовать параметр -s для WinMerge, это не сработает из-за того, что временные файлы будут удалены с помощью diffftool слишком рано)
Вот почему мне нравится подход 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.
Ответ 2
Я столкнулся с проблемой использования первой части в 2-х местах и зафиксировал ее следующим образом
-  Вторая команда для настройки winmerge.cmd потребовала дополнительной косой черты в cmdline (до $LOCAL и $REMOTE), иначе cygwin заменил переменную в cmdline C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\""
-  изменил файл winmerge.sh(без этого, получил неверную ошибку) #!/bin/sh echo Launching WinMergeU.exe: "$(cygpath -aw "$1")" "$(cygpath -aw "$2")" "$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$(cygpath -aw "$1")" "$(cygpath -aw "$2")"
Ответ 3
Так как поток становится запутанным и раздвоенным, вот консолидированные инструкции для списка каталогов "-dir-diff" WinMerge для msysgit Git Windows.
Шаг 1. Создайте файл с именем winmerge.sh в доступном для вашего пути месте (например,/home/bin/winmerge.sh) со следующим содержимым.
#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -r -ub -dl "Remote" -dr "Local" "$1" "$2"
Шаг 2. Введите следующие команды в Git Bash, чтобы указать Git использовать winmerge.sh как diffftool (эти параметры сохраняются в /home/.gitconfig):
git config --replace --global diff.tool winmerge
git config --replace --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
git config --replace --global difftool.prompt false
Шаг 3. Теперь вы можете протестировать, введя следующую команду в Git Bash, чтобы запустить различие WinMerge:
git difftool --dir-diff
Шаг 4. Для более быстрого доступа создайте псевдоним для этой команды, добавив эту строку в .bashrc в своей домашней папке (или создайте файл .bashrc с этой строкой, если файл еще не существует)
alias diffdir='git difftool --dir-diff'
Шаг 5. Теперь вы можете быстро увидеть diff в WinMerge, просто введя следующую команду в Git Bash
diffdir
Ответ 4
У меня есть script, который установит инструменты Diff и Merge в конфигурацию Git с соответствующими параметрами, для которых не требуется отдельный файл .sh. Кажется, он работает отлично для меня.
git config --global diff.tool winmerge
git config --global difftool.prompt false
git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""
git config --global merge.tool winmerge
git config --global mergetool.prompt false
git config --global mergetool.winmerge.trustExitCode true
git config --global mergetool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\""
Примечание - вся часть .cmd цитируется так, что параметры будут правильно указаны в .gitconfig
Ответ 5
Я был смущен тем, почему решение было представлено как пакетный файл DOS, так как моя установка Git появилась с оболочкой bash. Я также не смог получить контекст DOS из bash, поэтому я попытался адаптировать то, что ранее было разделено в контексте bash.
Так как git diff, как представляется, запускает указанную команду один раз для каждого файла, я разбиваю свое решение на два сценария bash:
Сначала настройте gitprepdiff.sh как diffftool, как упоминалось ранее
#!/bin/sh
#echo ...gitprepdiff.sh
cp -v $1 "$TMP/GitDiff/old/$2"
cp -v $2 "$TMP/GitDiff/new"
Я также отметил, что результаты команд git configure можно найти и отредактировать непосредственно в C:\Users\<username>\.gitconfigure
 gitdiff.sh затем запускается в командной строке, где обычно вызывается git diff
#!/bin/sh
#echo Running gitdiff.sh...
DIFFTEMP=$TMP/GitDiff
echo Deleting and re-creating $DIFFTEMP...
rm -rf $DIFFTEMP;
mkdir $DIFFTEMP;
echo Creating $DIFFTEMP/old...
mkdir $DIFFTEMP/old;
echo Creating $DIFFTEMP/new...
mkdir $DIFFTEMP/new;
git diff --name-only "[email protected]" | while read filename; do
    git difftool "[email protected]" --no-prompt "$filename";
done
"$PROGRAMFILES\WinMerge\WinMergeU.exe" -r -e -dl "Repository" -dr "Working" $LOCALAPPDATA\\Temp\\1\\GitDiff\\old $LOCALAPPDATA\\Temp\\1\\GitDiff\\new
Также стоит отметить, что при моей установке /tmp (в bash) сопоставлен с %LOCALAPPDATA%\Temp\1\ (в Windows), поэтому я использую последнее в своем вызове WinMerge.
Ответ 6
В окнах вы можете сделать это следующим образом:
1) Откройте файл .gitconfig. Он расположен в вашем домашнем каталоге: c:\users\username.gitconfig
2) Добавьте строки ниже. Обратите внимание на одинарные кавычки, обертывающие путь к winmerge:
[diff]
    tool = winmerge
[difftool "winmerge"]
    cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" -e "$LOCAL" "$REMOTE"
[difftool]
    prompt = false
[merge]
    tool = winmerge
[mergetool "winmerge"]
    cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" \"$MERGED\" \"$REMOTE\"
[mergetool]
    keepBackup = false
    trustExitCode = false
Ответ 7
Без конфигурации:
git difftool --tool winmerge
Предполагая, что:
- Установлен Winmerge
- Git для Windows устанавливается с "git версия 2.12.0.windows1" или выше (хотя более ранние версии git могли ввести эту команду).
Ответ 8
git config --global diff.tool winmerge
git config --global difftool.winmerge.cmd "\"$PROGRAMFILES\\WinMerge\\WinMergeU.exe\" -u -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""
git config --global difftool.prompt false
В соответствии с Руководство по командной строке WinMerge: "Параметры имеют префикс либо символа прямой косой черты (/), либо тире (-)"