Как просмотреть вывод 'git diff' с помощью моего предпочтительного инструмента сравнения / средства просмотра?
754
Когда я git diffнабираю текст, я хочу просмотреть вывод с помощью инструмента визуального сравнения (SourceGear «diffmerge» в Windows). Как мне настроить git для этого?
Перейдите в свой репозиторий в Git Bash. Тип git config diff.tool winmerge. Убедитесь, что это работает, набрав git difftool. Избавьтесь от оперативного набора текста git config --global difftool.prompt false. Я рекомендую p4merge вместо winmerge.
Майкл С.
Ответы:
386
Начиная с Git1.6.3, вы можете использовать скрипт git difftool : см. Мой ответ ниже .
Может быть, это статья поможет вам. Вот лучшие части:
Есть два разных способа указать внешний инструмент сравнения.
Первый - это метод, который вы использовали, установив переменную GIT_EXTERNAL_DIFF. Однако предполагается, что переменная указывает на полный путь к исполняемому файлу. Кроме того, исполняемый файл, указанный в GIT_EXTERNAL_DIFF, будет вызываться с фиксированным набором из 7 аргументов:
Поскольку большинству инструментов сравнения потребуется другой порядок (и только некоторые) аргументов, вам, скорее всего, придется вместо этого указать скрипт-обертку, который в свою очередь вызывает реальный инструмент сравнения.
Второй метод, который я предпочитаю, это настроить внешний инструмент сравнения с помощью «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)--
Как видите, только второй ("старый файл") и пятый ("новый файл") аргументы будут переданы в инструмент сравнения.
Обязательно используйте правильный синтаксис, чтобы указать пути к сценарию-оболочке и инструменту сравнения, т. Е. Используйте прямую косую черту вместо обратной косой черты. В моем случае у меня есть
[diff]
external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"
(Я полагаю, что ' | cat' необходимо только для некоторых программ, которые могут не возвращать правильный или непротиворечивый статус возврата. Вы можете попробовать без завершающего кота, если ваш инструмент сравнения имеет явный статус возврата)
Команда catобязательна, потому что diff(1)по умолчанию выходит с кодом ошибки, если файлы различаются.
Git ожидает, что внешняя программа сравнения завершит работу с кодом ошибки, только если произошла фактическая ошибка, например, если она исчерпала память.
По конвейеру от gitк catкоду ненулевой ошибки маскируются.
Более эффективно, программа могла бы просто работать exitс аргументом 0.)
Это (статья, приведенная выше) является теорией для внешнего инструмента, определенного через конфигурационный файл (не через переменную окружения).
На практике (все еще для определения файла конфигурации внешнего инструмента), вы можете обратиться к:
ах, я бы установил внешнюю программу сравнения, но не знал о 7 аргументах, спасибо.
user3891 31.10.08
4
Слава ... это очень удобно. Я установил это с помощью "opendiff" (который запускает удобную утилиту XCode FileMerge под Mac OS X).
Райан Делуччи
@Ryan: это здорово :) Вы использовали настройку "diff.external", подробно описанную в этом ответе, или "git difftool" моего второго ответа ниже?
VonC
Фантастический! Спасибо, попробовал как DiffMerge, так и opendiff; оба работают довольно хорошо.
vfilby
2
Итак, git отправляет 7 аргументов в программу сравнения? Чем больше я узнаю о Git, тем больше я чувствую, что он создан для одного человека: оригинального программиста. Этот dvcs больше похож на блестящую игрушку, которая мало что делает.
ИСПОЛЬЗОВАНИЕ = '[--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>*]
Другой вариант использования - это когда вы хотели бы видеть ту же информацию, но сравнивать произвольные коммиты (это та часть, в которой анализ синтаксиса может быть лучше)
Последний вариант использования - это когда вы хотите сравнить текущее рабочее дерево с чем-то отличным от 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с помощью пользовательского инструмента сравнения:
Если у вас есть другой инструмент (kdiff3, P4Diff, ...), создайте другой сценарий оболочки и соответствующую difftool.myDiffTool.cmdдирективу config.
Тогда вы можете легко переключать инструменты с помощьюdiff.tool конфигурации.
Как упоминает Кем Мейсон в своем ответе , вы также можете избежать любой оболочки, используя --extcmdопцию :
--extcmd=<command>
Укажите пользовательскую команду для просмотра различий. git-difftoolигнорирует настроенные значения по умолчанию и запускается, $command $LOCAL $REMOTEкогда указана эта опция.
Я должен был избежать $, для $ LOCAL и $ REMOTE, чтобы они не стали "" и "". Я бы отредактировал: git config --globla difftool.winmerge.cmd "winmerge.sh \" \ $ LOCAL \ "\" \ $ REMOTE \ ""
Карлос Рендон
Кроме того, есть идеи, как получить опцию -s (открыть несколько разностей в одном окне winmerge) для работы в этой схеме?
Карлос Рендон
1
@Carlos: Фрэнк (см. Комментарий выше) хотел, чтобы вы посмотрели на stackoverflow.com/questions/1220309/… (для открытия нескольких различий в одном окне winmerge)
VonC
1
В --start=и --end=варианты не признаются в v1.7.11
Это здорово, гораздо проще набирать, meld .чем git difftoolи просматривать последовательно измененные файлы. И это намного ближе к hg vdiffплагину Mercurial .
Том
6
Также meld .работает над проектами Mercurial и Subversion, если кому-то интересно.
Том
Хм, когда я это делаю, список модифицированных файлов показывает. Когда я нажимаю на одну из них или сравниваю ее, она открывается отдельно на отдельной вкладке. Как я могу получить разницу?
misiu_mp
@misiu_mp, я только что попробовал, при нажатии на измененные файлы, он показывает diff (старый файл, а также измененный файл).
db42
В какой версии это было добавлено? Похоже, что не работает с meld версии 1.1.5.
Марк Бут
41
С новым git difftool это так же просто, как добавить это в ваш файл .gitconfig :
Также ознакомьтесь с diffall , простым сценарием, который я написал для расширения раздражающего (IMO) поведения diff по умолчанию при открытии каждого в сериале.
Глобальный .gitconfig на Windows находится в %USERPROFILE%\.gitconfig
@CJohnson: $ LOCAL всегда последний коммит. Однако $ REMOTE не соответствует. Когда вы смотрите на изменения в локальной песочнице, это текущий / отредактированный файл, но при изменении исторических коммитов это родительский коммит. IOW для нормальных различий $ LOCAL = old и $ REMOTE = new. Для исторических $ LOCAL = новее и $ REMOTE = старше.
Грейнджер
40
Начиная с git версии 1.6.3 есть " git difftool ", который вы можете настроить для использования вашего любимого графического инструмента сравнения. В настоящее время из коробки поддерживаются: kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuse и opendiff ; если нужного вам инструмента нет в этом списке, вы всегда можете использовать difftool.<tool>.cmdопцию конфигурации.
«git difftool» принимает те же параметры, что и «git diff».
У меня есть одно дополнение к этому. Мне нравится регулярно использовать приложение diff, которое не поддерживается в качестве одного из инструментов по умолчанию (например, калейдоскоп), через
git difftool -t
Я также хотел бы, чтобы по умолчанию diffбыла обычная командная строка, поэтому установка GIT_EXTERNAL_DIFFпеременной не является опцией.
Вы можете использовать произвольное diffприложение как одноразовое с этой командой:
git difftool --extcmd=/usr/bin/ksdiff
Он просто передает 2 файла в указанную вами команду, поэтому вам, вероятно, также не нужна оболочка.
Отличное дополнение к winmerge.shсценарию. +1. Я обновил свой ответ по ссылке на ваш.
VonC
1
winmerge.batво втором фрагменте должно бытьwinmerge.sh
BartoszKP
Можете ли вы сделать это для многих инструментов? И связать их по расширению файла?
yucer
12
Решение для 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», он вызовет ваш внешний просмотрщик diff.
+1 (+10, если бы мог.) Это действительно самое простое решение. Я часами боролся с принятым ответом и, наконец, сдался (некоторые из моих проблем, вероятно, были связаны с запуском Git через PowerShell ...). Однако git config --global diff.external winmerge.cmdвместо настройки GIT_EXTERNAL_DIFFпеременной среды я использовал , и он работает одинаково хорошо.
Кристофер Летт
Несколько проблем с этим решением: 1. Не работает для новых файлов. WinMerge просит меня ввести второй файл для сравнения. 2. Окно для сравнения следующего файла открывается только после того, как вы закроете текущее окно WinMerge, нет простого способа увидеть все файлы одновременно.
Иисус Х
9
Если вы делаете это через cygwin, вам может понадобиться использовать cygpath :
По какой-то причине использование «bc3» больше не работает для меня, но если я использую «за» вместо этого, это нормально.
idbrii
9
Посмотрев на некоторые другие внешние инструменты сравнения, я обнаружил, что 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 в качестве difftool
У вас также есть kdiff3, определенный как ваш mergetool? Не могли бы вы поделиться этой частью вашего gitconfig?
Блонг
2
Спасибо. Это не совсем сработало для меня, но сработало, когда я удалился pathи изменился cmdна"\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\""
Для справки я бы хотел добавить свой вариант ответа VonC. Имейте в виду, что я использую версию Gys для 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]заполнителя на полный путь к выбранной вами программе diff)
@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 теперь должен вызывать вашу программу визуального сравнения для каждого файла, который был изменен.
Вот пакетный файл, который работает для 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
Отличный скрипт, он избавил меня от необходимости искать команды DiffMerge. Возможно, вы захотите изменить строку установки, чтобы использовать кавычки - у меня возникли проблемы на моем компьютере: "% 1" == "- install".
Марио
6
Если вы работаете на Mac и у вас есть XCode, значит, у вас установлен FileMerge. Терминальная команда opendiff, так что вы можете просто сделатьgit difftool -t opendiff
Используйте параметр -y, чтобы избежать раздражающих подсказок. К сожалению, git будет ждать, пока FileMerge закроется, прежде чем предлагать следующий измененный файл. Используйте опцию -d для сравнения каталогов за один раз.
miner49r
Опция -t требует полного пути. Может быть, лучше использовать git difftool --extcmd = opendiff.
yucer
6
Установить слияние
# apt-get install meld
Затем выберите это как difftool
$ 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 (по умолчанию), это откроет графический режим, сохранит магию и нажмите, чтобы разрешить слияние. Это все
Для Linux-версии о том, как настроить инструмент сравнения различий в версиях git до 1.6.3 (1.6.3 добавило difftool в git), это отличный краткий учебник,
вкратце:
Шаг 1: добавьте это к вашему .gitconfig
[diff]
external = git_diff_wrapper
[pager]
diff =
Шаг 2: создайте файл с именем git_diff_wrapper, поместите его где-нибудь в $ PATH
Следующее можно почерпнуть из других ответов здесь, но для меня это сложно (слишком много информации), так что вот ответ «просто введите его» для tkdiff:
git difftool --tool=tkdiff <path to the file to be diffed>
Вы можете заменить имя исполняемого файла вашего любимого инструмента сравнения на tkdiff. Пока (например, tkdiff) (или ваш любимый инструмент сравнения) находится в вашем PATH, он будет запущен.
Я попробовал модные вещи здесь (с 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
Если у вас уже есть инструмент сравнения, связанный с типами файлов (скажем, потому что вы установили TortoiseSVN, который поставляется с программой просмотра diff), вы можете просто перенаправить обычный git diffвывод в «временный» файл, а затем просто открыть этот файл напрямую без необходимости знать что-нибудь о зрителе:
git diff > "~/temp.diff" && start "~/temp.diff"
Установка его в качестве глобального псевдонима работает еще лучше: git what
Если вы не один для командной строки, то, если вы устанавливаете Git tortoise, вы можете щелкнуть правой кнопкой мыши по файлу, чтобы получить подменю tortoisegit с опцией «Diff позже».
Когда вы выбираете это в первом файле, вы можете затем щелкнуть правой кнопкой мыши по второму файлу, перейти в подменю tortoisegit и выбрать «Diff with == yourfilehere ==». Это даст графический интерфейс tortoisegitmerge для результата.
Вы можете попробовать xd http://github.com/jiqingtang/xd , который является оболочкой GUI для diff GIT / SVN. Это не инструмент сравнения. Ты бежишь, xdкогда хочешь бежать git diffилиsvn diff и он покажет вам список файлов, окно предварительного просмотра, и вы можете запустить любой инструмент сравнения, который вам нравится, включая tkdiff, xxdiff, gvimdiff, emacs (ediff), xemacs (ediff), meld, diffuse, kompare и kdiff3. Вы также можете запустить любой пользовательский инструмент.
git config diff.tool winmerge
. Убедитесь, что это работает, набравgit difftool
. Избавьтесь от оперативного набора текстаgit config --global difftool.prompt false
. Я рекомендую p4merge вместо winmerge.Ответы:
Начиная с Git1.6.3, вы можете использовать скрипт git difftool : см. Мой ответ ниже .
Может быть, это статья поможет вам. Вот лучшие части:
Есть два разных способа указать внешний инструмент сравнения.
Первый - это метод, который вы использовали, установив переменную GIT_EXTERNAL_DIFF. Однако предполагается, что переменная указывает на полный путь к исполняемому файлу. Кроме того, исполняемый файл, указанный в GIT_EXTERNAL_DIFF, будет вызываться с фиксированным набором из 7 аргументов:
Поскольку большинству инструментов сравнения потребуется другой порядок (и только некоторые) аргументов, вам, скорее всего, придется вместо этого указать скрипт-обертку, который в свою очередь вызывает реальный инструмент сравнения.
Второй метод, который я предпочитаю, это настроить внешний инструмент сравнения с помощью «git config» . Вот что я сделал:
1) Создайте скрипт-обертку "git-diff-wrapper.sh", который содержит что-то вроде
Как видите, только второй ("старый файл") и пятый ("новый файл") аргументы будут переданы в инструмент сравнения.
2) Тип
в командной строке, заменив путь к «git-diff-wrapper.sh», поэтому ваш ~ / .gitconfig содержит
Обязательно используйте правильный синтаксис, чтобы указать пути к сценарию-оболочке и инструменту сравнения, т. Е. Используйте прямую косую черту вместо обратной косой черты. В моем случае у меня есть
в .gitconfig и
в сценарии оболочки. Следите за "котом"!
(Я полагаю, что '
| cat
' необходимо только для некоторых программ, которые могут не возвращать правильный или непротиворечивый статус возврата. Вы можете попробовать без завершающего кота, если ваш инструмент сравнения имеет явный статус возврата)( Диомидис Спинеллис добавляет в комментариях :
Это (статья, приведенная выше) является теорией для внешнего инструмента, определенного через конфигурационный файл (не через переменную окружения).
На практике (все еще для определения файла конфигурации внешнего инструмента), вы можете обратиться к:
источник
Для завершения моего предыдущего ответа "diff.external" config выше:
Как упомянул Jakub , в Git1.6.3 введен git difftool , первоначально предложенный в сентябре 2008 года:
ИСПОЛЬЗОВАНИЕ =
'[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(см.
--extcmd
В последней части этого ответа)$LOCAL
содержит содержимое файла из начальной ревизии и$REMOTE
содержит содержимое файла в конечной ревизии.$BASE
содержит содержимое файла вПоследний вариант использования - это когда вы хотите сравнить текущее рабочее дерево с чем-то отличным от HEAD (например, тегом).
Примечание: начиная с Git 2.5
git config diff.tool winmerge
достаточно!Смотрите " git mergetool winmerge" "
А начиная с Git 1.7.11 , у вас есть опция
--dir-diff
, чтобы порождать внешние инструменты сравнения, которые могут сравнивать две иерархии каталогов за раз после заполнения двух временных каталогов, вместо того, чтобы запускать экземпляр внешнего инструмента один раз для пары файлов.Перед Git 2.5:
Практический пример для настройки
difftool
с помощью пользовательского инструмента сравнения:С winmerge.sh, хранящимся в директории вашего PATH:
Если у вас есть другой инструмент (kdiff3, P4Diff, ...), создайте другой сценарий оболочки и соответствующую
difftool.myDiffTool.cmd
директиву config.Тогда вы можете легко переключать инструменты с помощью
diff.tool
конфигурации.У вас также есть эта запись в блоге Дейва, чтобы добавить другие детали.
(Или этот вопрос для
winmergeu
вариантам)Интерес к этому параметру представляет
winmerge.sh
сценарий : вы можете настроить его для учета особых случаев.Смотри, например , Дэвид Marble «s ответ ниже для примера , который имеет дело с:
Как упоминает Кем Мейсон в своем ответе , вы также можете избежать любой оболочки, используя
--extcmd
опцию :Например, вот как
gitk
можно запускать / использовать любойdiff
инструмент .источник
--start=
и--end=
варианты не признаются в v1.7.11В духе ответов на вопросы, которые несколько отличаются от заданных. Попробуйте это решение:
Meld понимает git и обеспечивает навигацию по последним изменениям.
источник
meld .
чемgit difftool
и просматривать последовательно измененные файлы. И это намного ближе кhg vdiff
плагину Mercurial .meld .
работает над проектами Mercurial и Subversion, если кому-то интересно.1.1.5
.С новым git difftool это так же просто, как добавить это в ваш файл .gitconfig :
При желании также добавьте:
Также ознакомьтесь с diffall , простым сценарием, который я написал для расширения раздражающего (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
У меня есть одно дополнение к этому. Мне нравится регулярно использовать приложение diff, которое не поддерживается в качестве одного из инструментов по умолчанию (например, калейдоскоп), через
Я также хотел бы, чтобы по умолчанию
diff
была обычная командная строка, поэтому установкаGIT_EXTERNAL_DIFF
переменной не является опцией.Вы можете использовать произвольное
diff
приложение как одноразовое с этой командой:Он просто передает 2 файла в указанную вами команду, поэтому вам, вероятно, также не нужна оболочка.
источник
--extcmd
вариант. +1. Я включил это в свой ответ.Основываясь на ответе VonC, касающемся удаления и добавления файлов, используйте следующие команды и сценарии:
Что то же самое, что поместить это в ваш глобальный
.gitconfig
:Затем поместите следующее, в
winmerge.sh
котором должны быть на вашем пути:источник
winmerge.sh
сценарию. +1. Я обновил свой ответ по ссылке на ваш.winmerge.bat
во втором фрагменте должно бытьwinmerge.sh
Решение для Windows / msys git
Прочитав ответы, я обнаружил более простой способ, который заключается в изменении только одного файла.
Создайте пакетный файл для вызова вашей программы сравнения с аргументами 2 и 5. Этот файл должен находиться где-то на вашем пути. (Если вы не знаете, где это, поместите его в c: \ windows). Назовите это, например, "gitdiff.bat". Мой это:
Установите переменную окружения так, чтобы она указывала на ваш командный файл. Например:
GIT_EXTERNAL_DIFF=gitdiff.bat
. Или через powershell, набравgit config --global diff.external gitdiff.bat
.Важно не использовать кавычки или указывать какую-либо информацию о пути, иначе это не сработает. Вот почему gitdiff.bat должен быть на вашем пути.
Теперь, когда вы наберете «git diff», он вызовет ваш внешний просмотрщик diff.
источник
git config --global diff.external winmerge.cmd
вместо настройкиGIT_EXTERNAL_DIFF
переменной среды я использовал , и он работает одинаково хорошо.Если вы делаете это через cygwin, вам может понадобиться использовать cygpath :
источник
Посмотрев на некоторые другие внешние инструменты сравнения, я обнаружил, что
diff
представление в IntelliJ IDEA (и Android Studio) является лучшим для меня.Шаг 1 - настройка IntelliJ IDEA для запуска из командной строки
Если вы хотите использовать IntelliJ IDEA в качестве инструмента дифф вы должны сначала настроить IntelliJ IDEA для запуска из командной строки , следуя инструкции здесь :
В macOS или UNIX:
Tools | Create Command-line Launcher
. Откроется диалоговое окно «Создать сценарий запуска» с предложенным путем и именем сценария запуска. Вы можете принять значение по умолчанию или указать свой собственный путь. Обратите внимание на это, так как оно понадобится вам позже. Вне IntelliJ IDEA добавьте путь и имя сценария запуска к своему пути.В Windows:
Шаг 2 - настроить git для использования IntelliJ IDEA в качестве difftool
Следуя инструкциям в этом блоге :
удар
Рыба
Теперь добавьте следующее в ваш git config:
Вы можете попробовать это с помощью
git difftool
илиgit difftool HEAD~1
источник
это работает для меня на Windows 7. Нет необходимости для промежуточных скриптов sh
содержимое .gitconfig:
источник
path
и изменилсяcmd
на"\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\""
Краткое резюме вышеупомянутых великолепных ответов:
Затем используйте его, набрав (при желании также указав имя файла):
источник
Введение
Для справки я бы хотел добавить свой вариант ответа VonC. Имейте в виду, что я использую версию Gys для MSys (1.6.0.2 в настоящее время) с измененным PATH и запускаю сам Git из Powershell (или cmd.exe), а не из оболочки Bash.
Я ввел новую команду
gitdiff
. Выполнение этой команды временно перенаправляетgit diff
на использование программы визуального сравнения по вашему выбору (в отличие от решения VonC, которое делает это постоянно). Это позволяет мне иметь как функциональность Git diff по умолчанию (git diff
), так и функциональность визуального сравнения (gitdiff
). Обе команды принимают одинаковые параметры, поэтому, например, для визуального изменения изменений в конкретном файле, вы можете набратьНастроить
Обратите внимание, что
$GitInstall
используется в качестве заполнителя для каталога, в котором установлен Git.Создать новый файл,
$GitInstall\cmd\gitdiff.cmd
Создайте новый файл
$GitInstall\bin\git-diff-visual.cmd
(замена[visual_diff_exe]
заполнителя на полный путь к выбранной вами программе diff)Теперь вы сделали. Запуск
gitdiff
из репозитория Git теперь должен вызывать вашу программу визуального сравнения для каждого файла, который был изменен.источник
Вот пакетный файл, который работает для Windows - предполагается, что DiffMerge установлен в расположении по умолчанию, обрабатывает x64, обрабатывает замену с обратным слешем по мере необходимости и имеет возможность установить себя. Должно быть легко заменить DiffMerge вашей любимой программой сравнения.
Установить:
gitvdiff.bat:
источник
Если вы работаете на Mac и у вас есть XCode, значит, у вас установлен FileMerge. Терминальная команда opendiff, так что вы можете просто сделать
git difftool -t opendiff
источник
Установить слияние
Затем выберите это как difftool
Если вы хотите запустить его на консоли типа:
Если вы хотите использовать графический режим типа:
И вывод будет:
Так что просто нажмите Enter, чтобы использовать meld (по умолчанию), это откроет графический режим, сохранит магию и нажмите, чтобы разрешить слияние. Это все
источник
Для Linux-версии о том, как настроить инструмент сравнения различий в версиях git до 1.6.3 (1.6.3 добавило difftool в git), это отличный краткий учебник,
вкратце:
Шаг 1: добавьте это к вашему .gitconfig
Шаг 2: создайте файл с именем git_diff_wrapper, поместите его где-нибудь в $ PATH
источник
В Mac OS X
делает за меня работу в папке git. Для установки diffuse можно использовать порт -
источник
ты можешь использовать
git difftool
.например, если у вас есть объединение , вы можете редактировать ветви
master
иdevel
:источник
Следующее можно почерпнуть из других ответов здесь, но для меня это сложно (слишком много информации), так что вот ответ «просто введите его» для tkdiff:
Вы можете заменить имя исполняемого файла вашего любимого инструмента сравнения на tkdiff. Пока (например, tkdiff) (или ваш любимый инструмент сравнения) находится в вашем PATH, он будет запущен.
источник
Я попробовал модные вещи здесь (с tkdiff), и у меня ничего не получалось. Поэтому я написал следующий скрипт, tkgitdiff. Он делает то, что мне нужно.
источник
Я использую Kompare на Ubuntu:
Чтобы сравнить две ветви:
источник
Я использовал этот бит в
~/.gitconfig
течение длительного времени:С
git-meld
:Но теперь я устал от использования meld в графической среде, и с этой настройкой вызывать нормальный diff нетривиально, поэтому я переключился на это:
При такой настройке работают такие вещи:
И я все еще могу сохранить старое доброе
git diff
.источник
Если у вас уже есть инструмент сравнения, связанный с типами файлов (скажем, потому что вы установили TortoiseSVN, который поставляется с программой просмотра diff), вы можете просто перенаправить обычный
git diff
вывод в «временный» файл, а затем просто открыть этот файл напрямую без необходимости знать что-нибудь о зрителе:Установка его в качестве глобального псевдонима работает еще лучше:
git what
источник
Если вы не один для командной строки, то, если вы устанавливаете Git tortoise, вы можете щелкнуть правой кнопкой мыши по файлу, чтобы получить подменю tortoisegit с опцией «Diff позже».
Когда вы выбираете это в первом файле, вы можете затем щелкнуть правой кнопкой мыши по второму файлу, перейти в подменю tortoisegit и выбрать «Diff with == yourfilehere ==». Это даст графический интерфейс tortoisegitmerge для результата.
источник
Вы можете попробовать xd http://github.com/jiqingtang/xd , который является оболочкой GUI для diff GIT / SVN. Это не инструмент сравнения. Ты бежишь,
xd
когда хочешь бежатьgit diff
илиsvn diff
и он покажет вам список файлов, окно предварительного просмотра, и вы можете запустить любой инструмент сравнения, который вам нравится, включая tkdiff, xxdiff, gvimdiff, emacs (ediff), xemacs (ediff), meld, diffuse, kompare и kdiff3. Вы также можете запустить любой пользовательский инструмент.К сожалению, инструмент не поддерживает Windows.
Раскрытие : я являюсь автором этого инструмента.
источник