Как просмотреть вывод 'git diff' с помощью моего предпочтительного инструмента сравнения / средства просмотра?


754

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


108
Вы можете использовать «git difftool» вместо «git diff» во всех новых версиях git. Это откроет программу визуального сравнения.
PlagueHammer

Что касается нового скрипта difftool, я добавил ответ ниже: stackoverflow.com/questions/255202/…
VonC

2
gitx - gitx.frim.nl . Достаточно.
Алекс Гранде

1
Краткое руководство вы найдете здесь: nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy
Дмитрий Беспалов

5
Перейдите в свой репозиторий в 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 аргументов:

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.)


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


1
ах, я бы установил внешнюю программу сравнения, но не знал о 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 больше похож на блестящую игрушку, которая мало что делает.
С Джонсон

211

Для завершения моего предыдущего ответа "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содержит содержимое файла в

Он в основном git-mergetoolмодифицирован для работы с git index / worktree.

Обычный сценарий использования этого сценария - это когда вы вносите или не ставите изменения, и вы хотите видеть изменения в параллельном средстве просмотра различий (например xxdiff, tkdiffи т. Д.).

git difftool [<filename>*]

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

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 конфигурации.

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

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

Смотри, например , Дэвид Marble «s ответ ниже для примера , который имеет дело с:

  • новый файлы в исходном или целевом
  • удаленные файлы в исходном или целевом

Как упоминает Кем Мейсон в своем ответе , вы также можете избежать любой оболочки, используя --extcmdопцию :

--extcmd=<command>

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

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


11
Я должен был избежать $, для $ 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
Michael

1
@SteveChambers Да, я упоминал об этом в stackoverflow.com/a/10879804/6309 . Я отредактирую этот ответ.
VonC

110

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

$ meld my_project_using_git

Meld понимает git и обеспечивает навигацию по последним изменениям.


17
Это здорово, гораздо проще набирать, meld .чем git difftoolи просматривать последовательно измененные файлы. И это намного ближе к hg vdiffплагину Mercurial .
Том

6
Также meld .работает над проектами Mercurial и Subversion, если кому-то интересно.
Том

Хм, когда я это делаю, список модифицированных файлов показывает. Когда я нажимаю на одну из них или сравниваю ее, она открывается отдельно на отдельной вкладке. Как я могу получить разницу?
misiu_mp

@misiu_mp, я только что попробовал, при нажатии на измененные файлы, он показывает diff (старый файл, а также измененный файл).
db42

В какой версии это было добавлено? Похоже, что не работает с meld версии 1.1.5.
Марк Бут

41

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

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

При желании также добавьте:

[difftool]
    prompt = false

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

Глобальный .gitconfig на Windows находится в %USERPROFILE%\.gitconfig


1
что такое $ local и что такое $ remote?
С Джонсон

3
+1 за метод, который не требует сценария-оболочки
jhewlett

@CJohnson: Путь к исходному файлу и путь к редактируемому файлу соответственно.
Jhewlett

в случае, если ссылка на блог умирает, вот связанный ответ SO: stackoverflow.com/a/1291578/321973
Тобиас Кинцлер

1
@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».


1
Araxis Merge также настроен. araxis.com/merge/scm_integration.html
ΩmegaMan

8
пример использования:git difftool -t kdiff3 HEAD
emanaton

24

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

git difftool -t

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

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

git difftool --extcmd=/usr/bin/ksdiff

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


1
Хороший момент: никто еще не упомянул этот --extcmdвариант. +1. Я включил это в свой ответ.
VonC

19

Основываясь на ответе 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. Я обновил свой ответ по ссылке на ваш.
VonC

1
winmerge.batво втором фрагменте должно бытьwinmerge.sh
BartoszKP

Можете ли вы сделать это для многих инструментов? И связать их по расширению файла?
yucer

12

Решение для Windows / msys git

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

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

    @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.bat должен быть на вашем пути.

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


1
+1 (+10, если бы мог.) Это действительно самое простое решение. Я часами боролся с принятым ответом и, наконец, сдался (некоторые из моих проблем, вероятно, были связаны с запуском Git через PowerShell ...). Однако git config --global diff.external winmerge.cmdвместо настройки GIT_EXTERNAL_DIFFпеременной среды я использовал , и он работает одинаково хорошо.
Кристофер Летт

Несколько проблем с этим решением: 1. Не работает для новых файлов. WinMerge просит меня ввести второй файл для сравнения. 2. Окно для сравнения следующего файла открывается только после того, как вы закроете текущее окно WinMerge, нет простого способа увидеть все файлы одновременно.
Иисус Х

9

Если вы делаете это через 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`

По какой-то причине использование «bc3» больше не работает для меня, но если я использую «за» вместо этого, это нормально.
idbrii

9

Посмотрев на некоторые другие внешние инструменты сравнения, я обнаружил, что diffпредставление в IntelliJ IDEA (и Android Studio) является лучшим для меня.

Шаг 1 - настройка IntelliJ IDEA для запуска из командной строки

Если вы хотите использовать IntelliJ IDEA в качестве инструмента дифф вы должны сначала настроить IntelliJ IDEA для запуска из командной строки , следуя инструкции здесь :

В macOS или UNIX:

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

В 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 config:

[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


8

это работает для меня на Windows 7. Нет необходимости для промежуточных скриптов sh

содержимое .gitconfig:

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

    [difftool "kdiff3"]
      path = C:/Program Files (x86)/KDiff3/kdiff3.exe
      cmd = "$LOCAL" "$REMOTE"

У вас также есть kdiff3, определенный как ваш mergetool? Не могли бы вы поделиться этой частью вашего gitconfig?
Блонг

2
Спасибо. Это не совсем сработало для меня, но сработало, когда я удалился pathи изменился cmdна"\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\""
Стив Чамберс

7

Краткое резюме вышеупомянутых великолепных ответов:

git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.prompt false

Затем используйте его, набрав (при желании также указав имя файла):

git difftool

6

Введение

Для справки я бы хотел добавить свой вариант ответа 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.

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


6

Вот пакетный файл, который работает для 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


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


5

Для 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"

4

В Mac OS X

git difftool -t diffuse 

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

sudo port install diffuse

3

ты можешь использовать git difftool .

например, если у вас есть объединение , вы можете редактировать ветви masterи devel:

git config --global diff.external meld
git difftool master..devel

3

Следующее можно почерпнуть из других ответов здесь, но для меня это сложно (слишком много информации), так что вот ответ «просто введите его» для tkdiff:

git difftool --tool=tkdiff <path to the file to be diffed>

Вы можете заменить имя исполняемого файла вашего любимого инструмента сравнения на tkdiff. Пока (например, tkdiff) (или ваш любимый инструмент сравнения) находится в вашем PATH, он будет запущен.


это самый простой и быстрый способ.
Zameer Fouzan

2

Я попробовал модные вещи здесь (с 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

1

Я использую Kompare на Ubuntu:

sudo apt-get install kompare

Чтобы сравнить две ветви:

git difftool -t kompare <my_branch> master

1

Я использовал этот бит в ~/.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 нетривиально, поэтому я переключился на это:

[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.


0

Если у вас уже есть инструмент сравнения, связанный с типами файлов (скажем, потому что вы установили TortoiseSVN, который поставляется с программой просмотра diff), вы можете просто перенаправить обычный git diffвывод в «временный» файл, а затем просто открыть этот файл напрямую без необходимости знать что-нибудь о зрителе:

git diff > "~/temp.diff" && start "~/temp.diff"

Установка его в качестве глобального псевдонима работает еще лучше: git what

[alias]
    what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"

0

Если вы не один для командной строки, то, если вы устанавливаете Git tortoise, вы можете щелкнуть правой кнопкой мыши по файлу, чтобы получить подменю tortoisegit с опцией «Diff позже».

Когда вы выбираете это в первом файле, вы можете затем щелкнуть правой кнопкой мыши по второму файлу, перейти в подменю tortoisegit и выбрать «Diff with == yourfilehere ==». Это даст графический интерфейс tortoisegitmerge для результата.


0

Вы можете попробовать 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.

Раскрытие : я являюсь автором этого инструмента.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.