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

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

25 ответов


Начиная С Git1.6.3, Вы можете использовать скрипт git difftool: см.мой ответ ниже.


может быть статьи поможет вам. Вот лучшие части:

существует два разных способа указать внешний инструмент 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 config". Вот что я сделал:--12-->

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', требуется только для некоторых программ, которые могут не вернуть или последовательное статус возврата. Вы можете попробовать без трейлинга cat, если ваш инструмент diff имеет явный статус возврата)


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


чтобы завершить мой предыдущий " diff.внешний " config answer выше:

As упоминается Якуб, Git1.6.3 введен git difftool в деталях, первоначально предложенный в сентябре 2008:

использование='[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(См.--extcmd в последней части этого ответа)

$LOCAL содержит содержимое файла из начальной редакции и $REMOTE содержимое файла в конец пересмотр.
$BASE содержит содержимое файла в wor

по сути git-mergetool изменено для работы с индексом git / рабочим деревом.

обычный вариант использования для этого сценария - это когда у вас есть поэтапные или неустановленные изменения, и вы хотите увидеть изменения в бок о бок вьювер diff (например,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, в чтобы создать внешние инструменты 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 конфигурации.

у вас также есть это запись в блоге Дэйва добавить другие детали.
(Или этот вопрос на winmergeu параметры)

интерес с этой настройкой является winmerge.shскрипт: вы можете настроить его, чтобы учитывать особые случаи.

см., например,Давид Мрамора ' s ответ ниже для примера, который имеет дело с:

  • новая файлы в любом месте происхождения или назначения
  • удалены файлы в любом месте происхождения или назначения

As Кэм Мэйсон упоминает в ответ, вы можете также избегайте любой обертки с помощью --extcmd вариант:

--extcmd=<command>

укажите пользовательскую команду для просмотра различий. git-difftool игнорирует настроенные значения по умолчанию и запускает $command $LOCAL $REMOTE если этот параметр указан.

например, вот как gitk может запускать / использовать любой .


в духе ответов на вопросы, которые несколько отличаются от заданных. Попробуйте это решение:

$ meld my_project_using_git

Meld понимает git и обеспечивает навигацию вокруг последних изменений.


начиная с Git версии 1.6.3 существует "ГИТ difftool в деталях " который вы можете настроить для использования вашего любимого графического инструмента diff. В настоящее время поддерживаются из коробки kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuse и opendiff; если инструмент, который вы хотите использовать, отсутствует в этом списке, вы всегда можете использовать ''.

"git difftool" принимает те же параметры, что и "git разность."


С Новым git difftool в деталях, его так же просто, как добавить это к вашему .gitconfig хранит настройки:

[diff]
    tool = any-name
[difftool "any-name"]
    cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""

также проверить diffall, простой скрипт, который я написал, чтобы расширить раздражающее (IMO) поведение по умолчанию diff открытия каждого в последовательном режиме.


у меня есть одно дополнение к этому. Мне нравится регулярно использовать приложение diff, которое не поддерживается как один из инструментов по умолчанию (например, калейдоскоп), через

git difftool -t

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

вы можете использовать произвольную diff app как одноразовый с этой командой:

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.

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

теперь, когда вы вводите "git diff", он вызовет внешний просмотрщик diff.


Если вы делаете это через 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), а также функции визуального различия (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. вы закончили. Бег!--3--> из репозитория 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 (по умолчанию), это откроет графический режим, сделает волшебное сохранение и нажмите, чтобы разрешить слияние. Вот и все!--6-->


на Mac OS X,

git difftool -t diffuse 

делает работу для меня в папке git. Для установки diffuse можно использовать port -

sudo port install diffuse

можно использовать git difftool.

например, если у вас есть объединить, вы можете редактировать ветви 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 system. В этом случае вы сможете вызвать исполняемый файл 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.

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