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

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


person user3891    schedule 31.10.2008    source источник
comment
Вы можете использовать git difftool вместо git diff во всех новых версиях git. Это откроет программу визуального сравнения.   -  person Debajit    schedule 04.06.2009
comment
Что касается нового скрипта difftool, я добавил ответ ниже: stackoverflow.com/questions/255202/   -  person VonC    schedule 04.06.2009
comment
gitx - gitx.frim.nl. Достаточно.   -  person Alex Grande    schedule 11.02.2012
comment
Краткое руководство вы найдете здесь: nathanhoad.net/ как-to-meld-for-git-diffs-in-ubuntu-hardy   -  person Dmitry Bespalov    schedule 22.01.2014
comment
git difftool -tool=opendiff просто замените opendiff на что угодно.   -  person potench    schedule 17.04.2015
comment
Перейдите в свой репозиторий в Git Bash. Тип 1_. Убедитесь, что это сработало, набрав git difftool. Избавьтесь от подсказки, набирающей git config --global difftool.prompt false. Я рекомендую p4merge вместо winmerge.   -  person Michael S.    schedule 11.05.2016
comment
(1.), чтобы перечислить поддерживаемые внешние инструменты сравнения, сделайте git difftool --tool-help (2.), чтобы открыть с помощью специального инструмента сравнения, например vimdiff, просто сделайте git difftool --tool=vimdiff. Это краткое изложение решение, написанное @ JakubNarębski   -  person Trevor Boyd Smith    schedule 05.06.2018


Ответы (26)


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


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

Есть два разных способа указать внешний инструмент сравнения.

Первый - это метод, который вы использовали, установив переменную 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.)


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

person VonC    schedule 31.10.2008
comment
ах, я бы установил внешнюю программу сравнения, но не знал о 7 аргументах, спасибо. - person user3891; 01.11.2008
comment
Престижность ... это очень удобно. Я установил это с помощью opendiff (который запускает удобную утилиту XCode FileMerge под Mac OS X). - person Ryan Delucchi; 13.06.2009
comment
@Ryan: это здорово :) Вы использовали настройку diff.external, подробно описанную в этом ответе, или git difftool из моего второго ответа ниже? - person VonC; 13.06.2009
comment
Фантастика! Спасибо, попробовали и DiffMerge, и opendiff; оба работают достаточно хорошо. - person vfilby; 29.10.2009
comment
old-file old-hex old-mode new-file new-hex new-mode это всего 6 аргументов, а не 7 ... - person Jez; 08.02.2012
comment
@Jez: да, эта статья опускает первый аргумент, то есть путь. Вы найдете это через несколько строк ниже. - person VonC; 08.02.2012
comment
Итак, git отправляет 7 аргументов программе сравнения? Чем больше я узнаю о Git, тем больше я чувствую, что он создан для одного человека: оригинального программиста. Этот DVD больше похож на блестящую игрушку, которая мало что делает. - person C Johnson; 10.09.2013
comment
Привет, я попытался выполнить эту процедуру для TextWrangler. Я могу открыть файлы, найти различия, но когда я нажимаю на список различий, он не показывает, где они находятся в тексте ... Есть идеи? - person spec3; 15.03.2016
comment
@ user3891 есть ли альтернативная ссылка на статью, на которую вы ссылались, которая больше не доступна в Интернете - person Peter Nimmo; 05.10.2016
comment
@PeterNimmo Я нашел альтернативную ссылку: osdir.com/ml /version-control.msysgit/2008-06/msg00200.html - person VonC; 05.10.2016
comment
@VonC Альтернативная ссылка в вашем комментарии также больше не доступна - person Ben; 10.05.2018
comment
@ Бен Спасибо. Я отредактировал ответ и восстановил ссылку на https://web.archive.org/web/20170508180316/http://git.net:80/ml/version-control.msysgit/2008-06./msg00200.html - person VonC; 10.05.2018
comment
@JesseRusak Команда cat требуется, потому что diff (1) по умолчанию завершается с кодом ошибки, если файлы различаются. Git ожидает, что внешняя программа сравнения выйдет с кодом ошибки, только если произошла фактическая ошибка, например если не хватает памяти. Передавая вывод git в cat, ненулевой код ошибки маскируется. Более эффективно программа могла бы просто запустить exit с аргументом 0. - person Diomidis Spinellis; 17.02.2019
comment
@DiomidisSpinellis Спасибо. Я включил ваш комментарий в ответ для большей наглядности. - person VonC; 17.02.2019
comment
Примечание: шаг 2 (изменение diff.external) заставит git diff запустить ваш difftool. Это может быть нежелательно и может вызвать проблемы с пользовательскими интерфейсами (такими как SourceTree), заставляя их агрессивно запускать ваш инструмент в неурочное время. Вероятно, лучше вместо этого изменить diff.tool (например: git config --global diff.tool p4merge) - person Kevin Meboe; 12.03.2019
comment
@KevinMeboe Я согласен: это предлагает мой второй ответ ниже (stackoverflow.com/a/949242/6309). - person VonC; 12.03.2019

Чтобы завершить мой предыдущий diff. ответ о внешней конфигурации выше:

Как указано в Якубе, 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>*]

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


До 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 config.

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

Этот параметр интересен winmerge.shscript: вы можете настроить его с учетом особых случаев.

См., Например, Дэвида Марбла ответьте ниже для примера, который касается:

  • новые файлы в исходной или конечной точке
  • удалены файлы в исходной или конечной точке

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

--extcmd=<command>

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

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

person VonC    schedule 04.06.2009
comment
Мне пришлось избежать $, для $ LOCAL и $ REMOTE, чтобы они не превратились в и. Я бы отредактировал так: git config --globla difftool.winmerge.cmd winmerge.sh \\ $ LOCAL \ \\ $ REMOTE \ - person Carlos Rendon; 19.08.2009
comment
Кроме того, есть идеи, как заставить опцию -s (открывать несколько различий в одном окне winmerge) для работы в этой схеме? - person Carlos Rendon; 19.08.2009
comment
@Frank: Я подтверждаю, что $PATH или %PATH% соблюдаются, когда дело доходит до git config директив (какова ваша настройка? Версия Git? ОС?). И если вы хотите сообщить Карлосу о сообщении, ваш комментарий должен начинаться с '@': @Carlos (см. meta.stackexchange.com/questions/ 1093 /) - person VonC; 19.04.2010
comment
@Carlos: Фрэнк (см. Комментарий выше) хотел, чтобы вы посмотрели на stackoverflow.com/questions/1220309/ (для открытия нескольких различий в одном окне Winmerge) - person VonC; 19.04.2010
comment
проблема пути, которая у меня была, была решена, stackoverflow.com/questions/2664283/ - person Frank Schwieterman; 19.04.2010
comment
Примечание: git difftool теперь поддерживает каталоги diff: stackoverflow.com/questions/2113889/ - person VonC; 19.06.2012
comment
Опции --start= и --end= не распознаются в v1.7.11 - person Michael; 21.10.2013
comment
@VonC Что делает опция -ub? Я не считаю это одним из параметров командной строки WinMerge. - person legends2k; 26.11.2014
comment
Также стоит упомянуть очень полезную опцию --dir-diff, чтобы сравнить все файлы сразу и избежать подсказок. - person Steve Chambers; 15.05.2018
comment
@SteveChambers Да, я упоминал об этом в stackoverflow.com/a/10879804/6309. Я отредактирую этот ответ. - person VonC; 15.05.2018

Попробуйте это решение:

$ meld my_project_using_git

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

person Charles Merriam    schedule 14.03.2010
comment
Это здорово, гораздо проще набирать meld ., чем git difftool, и нужно последовательно просматривать измененные файлы. И он намного ближе к плагину Mercurial hg vdiff. - person Tom; 16.11.2010
comment
Кроме того, meld . работает и над проектами Mercurial и Subversion, если кому-то интересно. - person Tom; 16.11.2010
comment
Хм, когда я это делаю, отображается список измененных файлов. Когда я нажимаю на один из них или делаю «сравнение», он открывается отдельно на отдельной вкладке. Как мне получить разницу? - person misiu_mp; 15.06.2011
comment
@misiu_mp, я только что попробовал, при нажатии на измененные файлы он показывает разницу (старый файл, а также измененный файл). - person db42; 07.07.2011
comment
В какой версии это было добавлено? Похоже, что это не работает с версией meld 1.1.5. - person Mark Booth; 12.04.2012
comment
Единственный недостаток: иногда meld может сканировать различия намного дольше, чем при использовании difftool. Похоже, он все еще сканирует файлы с gitignored (в моем случае много файлов, сгенерированных сборкой). На моем компьютере создание списка измененных файлов заняло несколько секунд, но с помощью difftool это произошло мгновенно. - person Vadim Kotov; 25.10.2016
comment
Есть такая же функция для компара? Мне это решение очень понравилось (особенно тем, что оно позволяет выбрать интересующий файл из списка). - person Ashark; 23.10.2020
comment
Отличный совет! У меня отлично сработало! - person webasdf; 16.03.2021

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

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

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

[difftool]
    prompt = false

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

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

person Seba Illingworth    schedule 27.08.2009
comment
что такое $ local и что такое $ remote? - person C Johnson; 15.09.2013
comment
+1 для метода, не требующего сценария-оболочки - person jhewlett; 01.10.2013
comment
@CJohnson: путь к исходному файлу и путь к редактируемому файлу соответственно. - person jhewlett; 01.10.2013
comment
в случае, если ссылка на блог умирает, вот связанный ответ SO: stackoverflow.com/a/1291578/321973 - person Tobias Kienzler; 19.09.2014
comment
@CJohnson: $ LOCAL всегда является последней фиксацией. Однако $ REMOTE несовместим. Если смотреть на изменения в локальной песочнице, это текущий / отредактированный файл, но при сравнении исторических коммитов это родительский коммит. IOW для обычных различий $ LOCAL = old и $ REMOTE = new. Для исторических данных $ LOCAL = более новая и $ REMOTE = более старая версия. - person Granger; 08.01.2018

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

В настоящее время (на момент написания этого ответа) из коробки поддерживаются KDiff3 , Kompare, tkdiff, Meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, Diffuse и opendiff; если инструмента, который вы хотите использовать, нет в этом списке, вы всегда можете использовать параметр конфигурации «difftool.<tool>.cmd».

git difftool принимает те же параметры, что и git diff.

person Jakub Narębski    schedule 23.05.2009
comment
Настроен также Araxis Merge. araxis.com/merge/scm_integration.html - person ΩmegaMan; 07.11.2011
comment
пример использования: git difftool -t kdiff3 HEAD - person emanaton; 05.12.2011

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

git difftool -t

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

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

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

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

person Kem Mason    schedule 03.02.2011
comment
Хороший момент: никто еще не упомянул этот --extcmd вариант. +1. Я включил это в свой ответ. - person VonC; 03.02.2011
comment
Можете добавить ссылку на калейдоскоп? - person Peter Mortensen; 03.07.2021

Основываясь на Ответ 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
person David Marble    schedule 07.11.2010
comment
Отличное дополнение к winmerge.sh скрипту. +1. Я обновил свой ответ для ссылки на ваш. - person VonC; 07.11.2010
comment
winmerge.bat во втором фрагменте должно быть winmerge.sh - person BartoszKP; 09.10.2014
comment
Сможете ли вы сделать это для многих инструментов? И связать их по расширению файла? - person yucer; 06.04.2017

Решение для 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, он вызывает вашу внешнюю программу просмотра различий.

person Steve Hanov    schedule 21.02.2009
comment
+1 (+10, если бы мог.) Это действительно самое простое решение. Я часами боролся с принятым ответом и, наконец, сдался (некоторые из моих проблем, вероятно, были связаны с запуском Git через PowerShell ...) Однако я использовал git config --global diff.external winmerge.cmd вместо установки переменной среды GIT_EXTERNAL_DIFF, и он работает одинаково хорошо. - person Christoffer Lette; 17.08.2012
comment
Пара проблем с этим решением: 1. Не работает с новыми файлами. WinMerge просит меня ввести второй файл для сравнения. 2. Окно сравнения следующего файла открывается только после закрытия текущего окна WinMerge, поэтому нет простого способа увидеть все файлы одновременно. - person Jesus H; 02.07.2019

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

Следуя инструкциям в этом сообщении в блоге < / а>:

Bash

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

person David Rawson    schedule 20.06.2017

Если вы делаете это через 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`
person idbrii    schedule 30.03.2010
comment
По какой-то причине использование bc3 больше не работает для меня, но если я использую вместо этого, все в порядке. - person idbrii; 18.06.2012

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

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

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

    [difftool "kdiff3"]
      path = C:/Program Files (x86)/KDiff3/kdiff3.exe
      cmd = "$LOCAL" "$REMOTE"
person Sharas    schedule 02.02.2012
comment
У вас также есть kdiff3, определенный как ваш mergetool? Не могли бы вы поделиться этой частью вашего gitconfig, если так? - person blong; 12.09.2012
comment
Спасибо. Это не совсем сработало для меня, но это сработало, когда я удалил path и изменил cmd на "\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\"" - person Steve Chambers; 01.11.2013

Краткое изложение предыдущих замечательных ответов:

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

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

git difftool
person Community    schedule 04.11.2014

Вот командный файл, который работает для 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
person Brad Robinson    schedule 09.04.2009
comment
Отличный скрипт, избавивший меня от необходимости искать команды DiffMerge. Возможно, вы захотите изменить строку установки, чтобы использовать кавычки - у меня были проблемы на моем компьютере:% 1 == - install. - person Mario; 23.03.2010

Установите Meld:

 # apt-get install meld

Затем выберите это как средство сравнения:

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

person G. I. Joe    schedule 19.09.2015
comment
Мне нравится объединение, но оно очень плохо работает на MacO, поэтому я переключился на возвышенное объединение. - person Calvin Taylor; 22.09.2020

Если вы используете Mac и используете Xcode, то у вас есть FileMerge установлен. Команда терминала - opendiff, поэтому вы можете просто сделать:

git difftool -t opendiff
person LuxuryMode    schedule 04.09.2011
comment
Используйте параметр -y, чтобы избежать раздражающих запросов. К сожалению, git будет ждать завершения работы FileMerge, прежде чем предлагать следующий измененный файл. Используйте параметр -d, чтобы сравнить каталоги за один раз. - person miner49r; 05.07.2013
comment
Похоже, что для параметра -t требуется полный путь. Возможно, лучше использовать git difftool --extcmd = opendiff. - person yucer; 06.04.2017

Вступление

Для справки я хотел бы включить свой вариант ответ VonC. Имейте в виду, что я использую версию Git для 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] на полный путь к выбранной программе сравнения)

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

person Milan Gardian    schedule 25.12.2008

Для версии 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"
person Fire Crow    schedule 22.10.2009

В Mac OS X,

git difftool -t diffuse

выполняет эту работу за меня в папке Git. Для установки Diffuse можно использовать порт -

sudo port install diffuse
person Shreyas    schedule 09.05.2016
comment
порт? На BSD? - person Peter Mortensen; 03.07.2021
comment
Можете ли вы добавить ссылки на «порт» и «диффузный»? И предполагаемые платформы / операционные системы? - person Peter Mortensen; 03.07.2021

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

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

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

person dolphus333    schedule 18.12.2018
comment
это самый простой и быстрый способ. - person Zameer Fouzan; 23.07.2019

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

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

git config --global diff.external meld
git difftool master..devel
person suhailvs    schedule 06.12.2013

Я пробовал здесь необычные вещи (с 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
person Theodore Sternberg    schedule 05.12.2013

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

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

person abo-abo    schedule 11.07.2013

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

sudo apt-get install kompare

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

git difftool -t kompare <my_branch> master
person Bilal and Olga    schedule 15.02.2010

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

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

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

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

Если вы не пользуетесь командной строкой, то при установке TortoiseGit можно щелкнуть правой кнопкой мыши в файле, чтобы получить подменю TortoiseGit с опцией Diff later.

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

person camjocotem    schedule 11.01.2016

Вы можете попробовать xd, который представляет собой оболочку графического интерфейса для Git / SVN diff. Это не инструмент сравнения.

Вы запускаете xd, когда хотите запустить git diff или svn diff, и он покажет вам список файлов, окно предварительного просмотра, и вы сможете запустить любой инструмент сравнения, который вам нравится, включая tkdiff, xxdiff, gvimdiff, Emacs (ediff), XEmacs (ediff), Meld, Diffuse, Kompare и KDiff3. . Вы также можете запустить любой настраиваемый инструмент.

К сожалению, этот инструмент не поддерживает Windows.

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

person Jiqing Tang    schedule 01.10.2010