Как мне посмотреть 'ГИТ дифф выход с мой любимый инструмент diff/ зрителя?


когда я типа git diff, Я хочу просмотреть вывод с помощью моего визуального инструмента выбора diff (SourceGear "diffmerge" в Windows). Как настроить git для этого?

25 685

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 имеет явный статус возврата)


что (статья цитируется выше) является теорией для внешнего инструмента определяется через конфигурационный файл (не через переменную окружения).
На практике (все еще для определения файла конфигурации внешнего инструмента) вы можете обратиться к:

чтобы завершить мой предыдущий " 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

прочитав ответы, я обнаружил более простой способ, который включает в себя изменение только одного файла.

  1. создайте пакетный файл для вызова программы diff с аргументами 2 и 5. Этот файл должен быть где-то в пути. (Если вы не знаете, где это, положите его c:\windows). Назовем его, например, " gitdiff.летучая мышь." Мой-это:

    @echo off
    REM This is gitdiff.bat
    "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
    
  2. установите переменную окружения, чтобы она указывала на ваш пакет файл. Например: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.

  1. создать новый файл, $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
    
  2. создать новый файл $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
    
  3. теперь вы закончили. Работает 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:

  1. убедитесь, что IntelliJ IDEA работает.
  2. в главном меню выберите Tools | Create Command-line Launcher. Откроется диалоговое окно создать сценарий запуска с предлагаемым Путем и именем сценария запуска. Вы можете принять значение по умолчанию или задать свой путь. Обратите на это внимание, так как вам это понадобится позже. Вне IntelliJ IDEA добавьте путь и имя сценария запуска в свой путь.

On Windows:

  1. укажите расположение исполняемого файла 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.

разоблачение: Я являюсь автором этого инструмента.