Когда я набираю git diff, я хочу просмотреть результат с помощью выбранного мной инструмента визуального сравнения (SourceGear "diffmerge" в Windows). Как мне настроить git для этого?
Как просмотреть вывод 'git diff' с помощью моего предпочтительного инструмента / средства просмотра diff?
Ответы (26)
Начиная с Git1.6.3, вы можете использовать git difftool script: см. мой ответ ниже.
Может быть это статья поможет вам. Вот лучшие части:
Есть два разных способа указать внешний инструмент сравнения.
Первый - это метод, который вы использовали, установив переменную GIT_EXTERNAL_DIFF. Однако предполагается, что переменная указывает на полный путь к исполняемому файлу. Более того, исполняемый файл, указанный в GIT_EXTERNAL_DIFF, будет вызываться с фиксированным набором из 7 аргументов:
path old-file old-hex old-mode new-file new-hex new-mode
Поскольку для большинства инструментов сравнения требуется другой порядок (и только некоторые) аргументов, вам, скорее всего, придется вместо этого указать сценарий оболочки, который, в свою очередь, вызывает реальный инструмент сравнения.
Второй способ, который я предпочитаю, - это настроить внешний инструмент сравнения с помощью «git config». Вот что я сделал:
1) Создайте сценарий оболочки "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)--
Как видите, инструменту сравнения будут переданы только второй («старый файл») и пятый («новый-файл») аргументы.
2) Тип
$ git config --global diff.external <path_to_wrapper_script>
в командной строке, заменив путь к "git-diff-wrapper.sh", чтобы ваш ~ / .gitconfig содержал
-->8-(snip)--
[diff]
external = <path_to_wrapper_script>
--8<-(snap)--
Обязательно используйте правильный синтаксис для указания путей к сценарию оболочки и инструменту сравнения, т.е. используйте косую черту вперед вместо обратной. В моем случае у меня
[diff]
external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"
в .gitconfig и
"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat
в скрипте-оболочке. Остерегайтесь следящей за ним «кошки»!
(Я полагаю, что '| cat' требуется только для некоторых программ, которые могут не возвращать правильный или последовательный статус возврата. Вы можете попробовать без конечного кота, если ваш инструмент сравнения имеет явный статус возврата)
(Диомидис Спинеллис добавляет в комментариях:
Команда
catявляется обязательной, посколькуdiff(1)по умолчанию завершается с код ошибки, если файлы различаются.
Git ожидает, что внешняя программа сравнения выйдет с кодом ошибки, только если произошла фактическая ошибка, например если ему не хватает памяти.
Путем передачи выводаgitвcatкод ошибки, отличный от нуля, маскируется.
Более эффективно, программа могла бы просто запуститьexitс аргументом 0.)
Это (статья, цитируемая выше) является теорией для внешнего инструмента, определенного через файл конфигурации (а не через переменную среды).
На практике (все еще для определения внешнего инструмента в файле конфигурации) вы можете обратиться к:
- Как настроить DiffMerge с помощью msysgit / gitk?, который иллюстрирует конкретные настройки DiffMerge и WinMerge для MsysGit и gitk
- Как можно Я настроил редактор для работы с Git в Windows? для определения Notepad ++ как внешнего редактора.
old-file old-hex old-mode new-file new-hex new-mode это всего 6 аргументов, а не 7 ...
- person Jez; 08.02.2012
Чтобы завершить мой предыдущий diff. ответ о внешней конфигурации выше:
Как указано в Якубе, Git1.6.3 представил git difftool, первоначально предложено в сентябре 2008 г .:
ИСПОЛЬЗОВАНИЕ = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(см. --extcmd в последней части этого ответа)
$LOCAL содержит содержимое файла из начальной ревизии, а $REMOTE содержит содержимое файла в конечной ревизии. $BASE содержит содержимое файла в рабочей версии.
Он в основном
git-mergetoolмодифицирован для работы с git index / worktree.Обычно этот сценарий используется, когда у вас есть поэтапные или неустановленные изменения, и вы хотите видеть изменения в параллельном средстве просмотра различий (например,
xxdiff,tkdiffи т. Д.).
git difftool [<filename>*]
Другой вариант использования - это когда вы хотите видеть ту же информацию, но сравниваете произвольные коммиты (это та часть, где синтаксический анализ revarg может быть лучше)
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 1.7.11 у вас есть опция --dir-diff, чтобы запускать внешние инструменты сравнения, которые могут сравнивать два каталога иерархии за один раз после заполнения двух временных каталогов, вместо того, чтобы запускать экземпляр внешнего инструмента один раз для каждой пары файлов.
До Git 2.5:
Практический пример настройки difftool с помощью специального инструмента сравнения:
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, ...), создайте другой сценарий оболочки и соответствующую директиву difftool.myDiffTool.cmd config.
Затем вы можете легко переключать инструменты с помощью diff.tool config.
У вас также есть эта запись в блоге Дейва, чтобы добавить другие сведения.
(Или этот вопрос для winmergeu параметров)
Этот параметр интересен winmerge.shscript: вы можете настроить его с учетом особых случаев.
См., Например, Дэвида Марбла ответьте ниже для примера, который касается:
- новые файлы в исходной или конечной точке
- удалены файлы в исходной или конечной точке
Как упоминает Кем Мейсон в его ответ, вы также можете избежать использования оболочки, используя параметр --extcmd :
--extcmd=<command>
Укажите настраиваемую команду для просмотра различий.
git-difftoolигнорирует настроенные значения по умолчанию и запускает$command $LOCAL $REMOTE, если указан этот параметр.
Например, вот как gitk может запускать / использовать любые diff инструменты.
$PATH или %PATH% соблюдаются, когда дело доходит до git config директив (какова ваша настройка? Версия Git? ОС?). И если вы хотите сообщить Карлосу о сообщении, ваш комментарий должен начинаться с '@': @Carlos (см. meta.stackexchange.com/questions/ 1093 /)
- person VonC; 19.04.2010
--start= и --end= не распознаются в v1.7.11
- person Michael; 21.10.2013
-ub? Я не считаю это одним из параметров командной строки WinMerge.
- person legends2k; 26.11.2014
--dir-diff, чтобы сравнить все файлы сразу и избежать подсказок.
- person Steve Chambers; 15.05.2018
Попробуйте это решение:
$ meld my_project_using_git
Meld понимает Git и обеспечивает навигацию по последним изменениям.
meld ., чем git difftool, и нужно последовательно просматривать измененные файлы. И он намного ближе к плагину Mercurial hg vdiff.
- person Tom; 16.11.2010
meld . работает и над проектами Mercurial и Subversion, если кому-то интересно.
- person Tom; 16.11.2010
1.1.5.
- person Mark Booth; 12.04.2012
С новым git difftool это так же просто, как добавить это в ваш файл .gitconfig:
[diff]
tool = any-name
[difftool "any-name"]
cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""
При желании также добавьте:
[difftool]
prompt = false
Также проверьте difffall, простой скрипт, который я написал, чтобы расширить раздражающее (IMO) поведение diff по умолчанию при открытии каждого из них последовательно.
Глобальный .gitconfig в Windows находится в %USERPROFILE%\.gitconfig
Начиная с версии Git 1.6.3 существует git difftool, который вы можете настроить для использования вашего любимого графического инструмента сравнения.
В настоящее время (на момент написания этого ответа) из коробки поддерживаются KDiff3 , Kompare, tkdiff, Meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, Diffuse и opendiff; если инструмента, который вы хотите использовать, нет в этом списке, вы всегда можете использовать параметр конфигурации «difftool.<tool>.cmd».
git difftool принимает те же параметры, что и git diff.
git difftool -t kdiff3 HEAD
- person emanaton; 05.12.2011
У меня есть одно дополнение к этому. Мне нравится регулярно использовать приложение diff, которое не поддерживается в качестве одного из инструментов по умолчанию (например, калейдоскоп), через
git difftool -t
Мне также нравится, чтобы diff по умолчанию представляла собой обычную командную строку, поэтому установка переменной GIT_EXTERNAL_DIFF не является вариантом.
Вы можете использовать произвольное приложение diff в качестве одноразового с помощью этой команды:
git difftool --extcmd=/usr/bin/ksdiff
Он просто передает 2 файла указанной вами команде, поэтому вам, вероятно, тоже не понадобится оболочка.
--extcmd вариант. +1. Я включил это в свой ответ.
- person VonC; 03.02.2011
Основываясь на Ответ 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, который должен быть на вашем пути:
#!/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
winmerge.sh скрипту. +1. Я обновил свой ответ для ссылки на ваш.
- person VonC; 07.11.2010
winmerge.bat во втором фрагменте должно быть winmerge.sh
- person BartoszKP; 09.10.2014
Решение для Windows / MSYS Git
Прочитав ответы, я обнаружил более простой способ, предполагающий изменение только одного файла.
Создайте командный файл для вызова вашей программы сравнения с аргументами 2 и 5. Этот файл должен быть где-то на вашем пути. (Если вы не знаете, где это, поместите его в C: \ windows.) Назовите его, например, gitdiff.bat. Мой:
@echo off REM This is gitdiff.bat "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5Установите переменную среды так, чтобы она указывала на ваш командный файл. Например:
GIT_EXTERNAL_DIFF=gitdiff.bat. Или через PowerShell, набравgit config --global diff.external gitdiff.bat.Важно не использовать кавычки и не указывать какую-либо информацию о пути, иначе это не сработает. Вот почему gitdiff.bat должен быть на вашем пути.
Теперь, когда вы набираете git diff, он вызывает вашу внешнюю программу просмотра различий.
git config --global diff.external winmerge.cmd вместо установки переменной среды GIT_EXTERNAL_DIFF, и он работает одинаково хорошо.
- person Christoffer Lette; 17.08.2012
Посмотрев на некоторые другие внешние инструменты сравнения, я обнаружил, что представление diff в IntelliJ IDEA (и Android Studio) - лучшее для меня.
Шаг 1 - настройте IntelliJ IDEA для запуска из командной строки
Если вы хотите использовать IntelliJ IDEA в качестве инструмента сравнения, вам следует сначала настроить IntelliJ IDEA для запуска из командной строки, следуя инструкциям здесь:
В macOS или UNIX:
- Убедитесь, что IntelliJ IDEA запущена.
- В главном меню выберите
Tools | Create Command-line Launcher. Откроется диалоговое окно «Создать сценарий запуска» с предложенным путем и именем сценария запуска. Вы можете принять значение по умолчанию или указать свой собственный путь. Обратите внимание на это, так как оно вам понадобится позже. Вне IntelliJ IDEA добавьте в свой путь путь и имя сценария запуска.
В Windows:
- Укажите расположение исполняемого файла IntelliJ IDEA в системной переменной среды Path. В этом случае вы сможете вызывать исполняемый файл IntelliJ IDEA и другие команды IntelliJ IDEA из любого каталога.
Шаг 2 - настройте git для использования IntelliJ IDEA в качестве инструмента сравнения
Следуя инструкциям в этом сообщении в блоге < / а>:
Bash
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
Теперь добавьте в конфигурацию git следующее:
[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
Если вы делаете это через 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"
path и изменил cmd на "\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\""
- person Steve Chambers; 01.11.2013
Краткое изложение предыдущих замечательных ответов:
git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.prompt false
Затем используйте его, набрав (при желании также указав имя файла):
git difftool
Вот командный файл, который работает для 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
Установите Meld:
# apt-get install meld
Затем выберите это как средство сравнения:
$ 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 (по умолчанию). Это откроет графический режим. Сделайте волшебное спасение и нажмите то, что разрешает слияние. Это все.
Если вы используете Mac и используете Xcode, то у вас есть FileMerge установлен. Команда терминала - opendiff, поэтому вы можете просто сделать:
git difftool -t opendiff
Вступление
Для справки я хотел бы включить свой вариант ответ VonC. Имейте в виду, что я использую версию Git для MSys (в настоящее время 1.6.0.2) с измененным PATH и запускаю сам Git из PowerShell (или cmd.exe), а не из оболочки Bash.
Я ввел новую команду gitdiff. Выполнение этой команды временно перенаправляет git diff на использование программы визуального сравнения по вашему выбору (в отличие от решения VonC, которое делает это постоянно). Это позволяет мне использовать как стандартные функции Git diff (git diff), так и визуальные функции сравнения (gitdiff). Обе команды принимают одинаковые параметры, поэтому, например, чтобы визуально различать изменения в конкретном файле, вы можете ввести
gitdiff path/file.txt
Настраивать
Обратите внимание, что $GitInstall используется в качестве заполнителя для каталога, в котором установлен Git.
Создайте новый файл
$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Создайте новый файл
$GitInstall\bin\git-diff-visual.cmd(заменив заполнитель[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Теперь все готово. Запуск
gitdiffиз репозитория Git должен теперь вызывать вашу визуальную программу сравнения для каждого файла, который был изменен.
Для версии Linux о том, как настроить инструмент сравнения в версиях Git до 1.6.3 (1.6.3 добавил difftool в Git), это отличное краткое руководство.
Вкратце:
Шаг 1: добавьте это в свой .gitconfig
[diff]
external = git_diff_wrapper
[pager]
diff =
Шаг 2: создайте файл с именем git_diff_wrapper, поместите его где-нибудь в свой $ PATH
#!/bin/sh
vimdiff "$2" "$5"
В Mac OS X,
git difftool -t diffuse
выполняет эту работу за меня в папке Git. Для установки Diffuse можно использовать порт -
sudo port install diffuse
Следующее можно почерпнуть из других ответов здесь, но для меня это сложно (слишком много информации), поэтому вот ответ для tkdiff `` просто введите это '':
git difftool --tool=tkdiff <path to the file to be diffed>
Вы можете заменить имя исполняемого файла вашего любимого инструмента сравнения на tkdiff. Пока (например, tkdiff) (или ваш любимый инструмент сравнения) находится в вашем PATH, он будет запущен.
Вы можете использовать git difftool.
Например, если у вас есть Meld, вы можете редактировать ветви master и devel:
git config --global diff.external meld
git difftool master..devel
Я пробовал здесь необычные вещи (с 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
Давно использую этот бит в файле ~/.gitconfig:
[diff]
external = ~/Dropbox/source/bash/git-meld
С git-meld:
#!/bin/bash
if [ "$DISPLAY" = "" ];
then
diff $2 $5
else
meld $2 $5
fi
Но теперь я устал всегда использовать Meld в графической среде, и вызвать обычный diff с этим нетривиальным setup, поэтому я переключился на это:
[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.
Я использую Kompare в Ubuntu:
sudo apt-get install kompare
Чтобы сравнить две ветки:
git difftool -t kompare <my_branch> master
Если у вас уже есть инструмент сравнения, связанный с типами файлов (скажем, из-за того, что вы установили TortoiseSVN, который поставляется с программой просмотра различий), вы можете просто перенаправить обычный git diff вывод во «временный» файл, а затем просто открыть этот файл напрямую без необходимости знать что-нибудь о зрителе:
git diff > "~/temp.diff" && start "~/temp.diff"
Установка его в качестве глобального псевдонима работает еще лучше: git what
[alias]
what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"
Если вы не пользуетесь командной строкой, то при установке TortoiseGit можно щелкнуть правой кнопкой мыши в файле, чтобы получить подменю TortoiseGit с опцией Diff later.
Когда вы выбираете это в первом файле, вы можете затем щелкнуть правой кнопкой мыши второй файл, перейти в подменю TortoiseGit и выбрать Diff with == yourfilehere ==. Это даст графический интерфейс слияния TortoiseGit для результата.
Вы можете попробовать xd, который представляет собой оболочку графического интерфейса для Git / SVN diff. Это не инструмент сравнения.
Вы запускаете xd, когда хотите запустить git diff или svn diff, и он покажет вам список файлов, окно предварительного просмотра, и вы сможете запустить любой инструмент сравнения, который вам нравится, включая tkdiff, xxdiff, gvimdiff, Emacs (ediff), XEmacs (ediff), Meld, Diffuse, Kompare и KDiff3. . Вы также можете запустить любой настраиваемый инструмент.
К сожалению, этот инструмент не поддерживает Windows.
Раскрытие информации: я являюсь автором этого инструмента.
git difftool -tool=opendiffпросто заменитеopendiffна что угодно. - person potench   schedule 17.04.2015git difftool. Избавьтесь от подсказки, набирающейgit config --global difftool.prompt false. Я рекомендую p4merge вместо winmerge. - person Michael S.   schedule 11.05.2016git difftool --tool-help(2.), чтобы открыть с помощью специального инструмента сравнения, напримерvimdiff, просто сделайтеgit difftool --tool=vimdiff. Это краткое изложение решение, написанное @ JakubNarębski - person Trevor Boyd Smith   schedule 05.06.2018