Как мне посмотреть 'ГИТ дифф выход с мой любимый инструмент diff/ зрителя?
когда я типа git diff
, Я хочу просмотреть вывод с помощью моего визуального инструмента выбора diff (SourceGear "diffmerge" в Windows). Как настроить git для этого?
25 ответов:
начиная с Git1.6. 3, вы можете использовать git difftool script: см.мой ответ ниже.
может быть статьи поможет вам. Вот лучшие части:
есть два разных способа указать внешний инструмент diff.
первый метод, который вы использовали, установив переменную GIT_EXTERNAL_DIFF. Однако переменная должна указывать на полный путь к исполняемому файлу. Более того, исполняемый файл, указанный GIT_EXTERNAL_DIFF, будет вызван с фиксированным набором из 7 аргументов:
path old-file old-hex old-mode new-file new-hex new-mode
поскольку для большинства инструментов diff требуется другой порядок (и только некоторые) аргументов, вам, скорее всего, придется указать сценарий оболочки, который, в свою очередь, вызывает реальный инструмент diff.
второй способ, который я предпочитаю, чтобы настройка внешнего инструмента diff через "git конфигурация". Вот что я сделал:
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>" "" "" | cat --8<-(snap)--
как вы можете видеть, только второй ("старый файл") и пятый ("новый файл") аргументы будут перешел к инструменту diff.
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 инструмент, т. е. использовать косую черту вместо обратной косой черты. В моем случае, у меня есть
[diff] external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"
in .gitconfig и
"d:/Program Files/Beyond Compare 3/BCompare.exe" "" "" | cat
в скрипте. Против символа "кошка"!
(Я полагаю,'
| cat
', требуется только для некоторых программ, которые могут не вернуть или последовательное статус возврата. Вы можете попробовать без задней кошки, Если ваш инструмент diff имеет явный статус возврата)
что (статья цитируется выше) является теорией для внешнего инструмента определяется через конфигурационный файл (не через переменную окружения).
На практике (все еще для определения файла конфигурации внешнего инструмента) вы можете обратиться к:
- как настроить DiffMerge с помощью msysgit / gitk? который иллюстрирует конкретные настройки DiffMerge и WinMerge для MsysGit и gitk
- как я могу настроить редактор для работы с Git в Windows? для определения Notepad++ как внешний редактор.
чтобы завершить мой предыдущий " diff.внешние" настройки ответа выше:
как упоминается Якуб, Git1.6.3 введен git difftool, первоначально предложенный в сентябре 2008 года:
USAGE=
'[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(См.--extcmd
в последней части этого ответа)
$LOCAL
содержит содержимое файла из начальной версии и$REMOTE
содержимое файла в конец пересмотр.$BASE
содержит содержимое файла в worпо сути
git-mergetool
изменено для работы с индексом/рабочим деревом git.обычно этот сценарий используется, когда у вас есть либо поэтапные, либо нестагированные изменения, и вы хотите увидеть изменения в бок о бок diff viewer (например,
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
, in чтобы создать внешние инструменты diff, которые могут сравнивать две иерархии каталогов одновременно после заполнения двух временных каталогов, вместо запуска экземпляра внешнего инструмента один раз на пару файлов.
Перед Git 2.5:
практический случай для настройки
difftool
С помощью пользовательского инструмента diff: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 хранится в директории часть вашего пути:
#!/bin/sh echo Launching WinMergeU.exe: "C:/Program Files/WinMerge/WinMergeU.exe" -u -e "" "" -dl "Local" -dr "Remote"
если у вас есть другой инструмент (kdiff3, P4Diff, ...), создайте другой скрипт оболочки, и соответствующий
difftool.myDiffTool.cmd
директивы конфигурации.
Затем вы можете легко переключать инструменты с помощьюdiff.tool
config.у вас есть и это запись в блоге Дэйва добавить другие детали.
(Или этот вопрос наwinmergeu
параметры)интерес с этой настройкой является
winmerge.sh
скрипт: вы можете настроить его, чтобы учитывать особые случаи.см., например,Давид Мрамора ' s ответ ниже для примера, который имеет дело с:
- новая файлы в любом месте происхождения или назначения
- удалены файлы в любом месте происхождения или назначения
как Кэм Мэйсон упоминает в ответ, вы можете также избегайте любой обертки с помощью
--extcmd
вариант:--extcmd=<command>
укажите пользовательскую команду для просмотра различий.
git-difftool
игнорирует настроенные значения по умолчанию и запускает$command $LOCAL $REMOTE
если этот параметр указан.например, вот как
gitk
может работать / использовать любой .
в духе ответов на вопросы, которые несколько отличаются от задаваемых. Попробуйте это решение:
$ meld my_project_using_git
Meld понимает git и обеспечивает навигацию по последним изменениям.
начиная с версии git 1.6.3 есть "git difftool " который вы можете настроить для использования вашего любимого графического инструмента diff. В настоящее время поддерживаются из коробки являются kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuse и opendiff; если инструмент, который вы хотите использовать, отсутствует в этом списке, вы всегда можете использовать ''.
"git difftool" принимает те же параметры, что и "git разность."
С Новым git difftool, его так же просто, как добавить это к вашему .gitconfig file:
[diff] tool = any-name [difftool "any-name"] cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""
также проверить diffall, простой скрипт, который я написал, чтобы расширить раздражающее (IMO) поведение diff по умолчанию при открытии каждого в последовательном режиме.
у меня есть одно дополнение к этому. Мне нравится регулярно использовать приложение diff, которое не поддерживается в качестве одного из инструментов по умолчанию (например, kaleidoscope), через
git difftool -t
мне также нравится иметь значение по умолчанию
diff
просто будьте обычной командной строкой, поэтому установитеGIT_EXTERNAL_DIFF
переменная не вариант.вы можете использовать произвольную
diff
приложение в качестве одноразового с этой командой:git difftool --extcmd=/usr/bin/ksdiff
Он просто передает 2 файла в указанную Вами команду, поэтому вам, вероятно, не нужно и обертку тоже.
основываясь на ответе 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 [ "" = "$NULL" ] ; then echo "removed: " elif [ "" = "$NULL" ] ; then echo "added: " else echo "changed: " "C:/Program Files (x86)/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "" "" fi
решение для Windows / msys git
прочитав ответы, я обнаружил более простой способ, который включает в себя изменение только одного файла.
создайте пакетный файл для вызова программы diff с аргументами 2 и 5. Этот файл должен быть где-то в пути. (Если вы не знаете, где это, положите его c:\windows). Назовем его, например, " gitdiff.летучая мышь." Мой-это:
@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.летучая мышь должна быть на вашем пути.
теперь, когда вы набираете "git diff", он вызовет ваш внешний diff viewer.
Если вы делаете это через 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 ` `cygpath -w `
это работает для меня на Windows 7. Нет необходимости в промежуточных скриптах sh
содержание .gitconfig:
[diff] tool = kdiff3 [difftool] prompt = false [difftool "kdiff3"] path = C:/Program Files (x86)/KDiff3/kdiff3.exe cmd = "$LOCAL" "$REMOTE"
краткое изложение выше великих ответов:
git difftool --tool-help git config --global diff.tool <chosen tool> git config --global --add difftool.prompt false
затем используйте его, введя (дополнительно указав имя файла):
git difftool
введение
для справки я хотел бы включить мой вариант ответа VonC. Имейте в виду, что я использую версию MSys Git (1.6.0.2 в настоящее время) с измененным путем и запускаю сам Git из Powershell (или cmd.exe), а не оболочка Bash.
я ввел новую команду
gitdiff
. Выполнение этой команды временно перенаправляетgit diff
чтобы использовать визуальную программу diff по вашему выбору (в отличие от решения VonC, которое делает это постоянно). Этот позволяет мне иметь обе функции git diff по умолчанию (git diff
), а также визуальные функции 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 теперь должна вызывать вашу программу visual diff для каждого файла, который был изменен.
вот пакетный файл, который работает для Windows-предполагает, что DiffMerge установлен в месте по умолчанию, обрабатывает x64, обрабатывает вперед для замены обратной косой черты по мере необходимости и имеет возможность установить себя. Должно быть легко заменить DiffMerge с вашей любимой программой diff.
установка:
gitvdiff --install
gitvdiff.летучая мышь:
@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
Если вы находитесь на Mac и имеете XCode, то у вас установлен FileMerge. Команда терминала-opendiff, поэтому вы можете просто сделать
git difftool -t opendiff
для версии linux о том, как настроить инструмент diff на версиях 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 "" ""
установить meld
# 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(по умолчанию), это откроет графический режим, сделает волшебное сохранение и нажмите, чтобы разрешить слияние. Вот и все
на Mac OS X,
git difftool -t diffuse
делает работу для меня в папке git. Для установки diffuse можно использовать port -
sudo port install diffuse
можно использовать
git difftool
.например, если у вас есть meld, вы можете редактировать ветви
master
иdevel
by:git config --global diff.external meld git difftool master..devel
посмотрев на некоторые другие внешние инструменты diff, я обнаружил, что
diff
просмотр в IntelliJ IDEA (и Android Studio) является лучшим для меня.Шаг 1-Настройка IntelliJ IDEA для запуска из командной строки
если вы хотите использовать IntelliJ IDEA в качестве инструмента diff, вы должны сначала настроить IntelliJ IDEA для запуска из командной строки, следуя инструкциям здесь:
на macOS или UNIX:
- убедитесь, что IntelliJ IDEA работает.
- в главном меню выберите
Tools | Create Command-line Launcher
. Откроется диалоговое окно создать сценарий запуска с предлагаемым Путем и именем сценария запуска. Вы можете принять значение по умолчанию или задать свой путь. Обратите на это внимание, так как вам это понадобится позже. Вне IntelliJ IDEA добавьте путь и имя сценария запуска в свой путь.On Windows:
- укажите расположение исполняемого файла IntelliJ IDEA в системной переменной среды Path. В этом случае вы сможете вызвать исполняемый файл IntelliJ IDEA и другие команды IntelliJ IDEA из любого каталога.
Шаг 2-Настройка git для использования IntelliJ IDEA в качестве difftool
следуя инструкциям на этот блог пост:
Баш
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
Я пробовал причудливые вещи здесь (с tkdiff) и ничего не работало для меня. Поэтому я написал следующий скрипт, tkgitdiff. Он делает то, что мне нужно это делать.
$ cat tkgitdiff #!/bin/sh # # tkdiff for git. # Gives you the diff between HEAD and the current state of your file. # newfile= 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 else meld fi
но теперь я устал всегда использовать meld в графической среде, и это не тривиально, чтобы вызвать нормальный diff с этой настройкой, поэтому я переключился на это:
[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
если у вас уже есть инструмент diff, связанный с типами файлов (скажем, потому что вы установили TortoiseSVN, который поставляется с diff viewer), вы можете просто передать обычный
git diff
вывод в файл "temp", а затем просто откройте этот файл напрямую, не зная ничего о средстве просмотра:git diff > "~/temp.diff" && start "~/temp.diff"
установка его в качестве глобального псевдонима работает еще лучше:
git what
[alias] what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"
Если вы не один для командной строки, то при установке tortoise git вы можете щелкнуть правой кнопкой мыши на файле, чтобы получить подменю tortoisegit с опцией "Diff later".
когда вы выберете это в первом файле, вы можете щелкнуть правой кнопкой мыши на втором файле, перейти в подменю tortoisegit и выбрать "Diff with ==yourfilehere==" Это даст графический интерфейс tortoisegitmerge для результата.
вы можете попробовать xd http://github.com/jiqingtang/xd, который является оболочкой GUI для git / SVN diff. Это не инструмент diff сам по себе. Ты беги
xd
когда вы хотите запуститьgit diff
илиsvn diff
и он покажет вам список файлов, окно предварительного просмотра, и вы можете запустить любой инструмент diff, который вам нравится, включая tkdiff, xxdiff, gvimdiff, emacs(ediff), xemacs(ediff), meld, diffuse, kompare и kdiff3. Вы также можете запустить любой пользовательский инструмент.к сожалению, инструмент не поддержка Windows.
разоблачение: Я являюсь автором этого инструмента.