Як я переглядаю вихід "git diff" за допомогою вподобаного інструменту / переглядача 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

Оскільки для більшості різних інструментів потрібен інший порядок (і лише деякі) аргументів, вам, швидше за все, доведеться вказати сценарій обгортки, який, в свою чергу, викликає реальний інструмент diff.

Другий спосіб, який я віддаю перевагу, - це налаштувати зовнішній інструмент "diff" через "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)--

Як бачимо, лише інший («старий файл») і п’ятий («новий файл») будуть передані інструменту 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\"

в .gitconfig і

"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat

в сценарії обгортки. Пам’ятайте слідуючого «кота»!

(Я припускаю, що " | cat" потрібен лише для деяких програм, які можуть не повернути належного або послідовного статусу повернення. Ви можете спробувати без кінцевої кішки, якщо ваш інструмент diff має явний статус повернення)

( Діомідіс Спінеліс додає у коментарях :

catКоманда необхідна, тому що diff(1), за замовчуванням виходить з кодом помилки , якщо файли різняться.
Git очікує, що зовнішня програма diff вийде з кодом помилки, лише якщо виникла фактична помилка, наприклад, якщо у неї не вистачає пам'яті.
За допомогою конвеєра маскується вихід gitдо catненульового коду помилки.
Більш ефективно, програма може просто запускатися exitз аргументом 0.)


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


1
ах, я б встановив зовнішню програму diff, але не знав про 7 аргументів, дякую.
user3891

4
Кудо ... це дуже зручно. Я налаштував це за допомогою "opendiff" (який запускає гладку утиліту XCode FileMerge під Mac OS X).
Райан Делуччі

@Ryan: це чудово :) Ви використовували налаштування "diff.external", детально описані у цій відповіді, або "git difftool" моєї другої відповіді нижче?
VonC

Фантастичний! Дякую, спробували і DiffMerge, і opendiff; обидва працюють досить добре.
vfilby

2
Так git надсилає 7 аргументів у програму diff? Чим більше я дізнаюся про Git, тим більше відчуваю, що він зроблений для однієї людини: оригінальний програміст. Цей dvcs здається більше схожою на блискучу іграшку, яка не робить багато.
C Джонсон

211

Щоб виконати попередню відповідь конфігурації "diff.external" вище:

Як згадував Якуб , Git1.6.3 представив git difftool , спочатку запропонований у вересні 2008 року:

USAGE = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(Дивіться --extcmdв останній частині цієї відповіді)

$LOCALмістить вміст файлу від стартової редакції та $REMOTEмістить вміст файлу в кінцевій редакції.
$BASEмістить вміст файлу в роботі

Він в основному git-mergetoolмодифікований для роботи на індексі git / worktree.

Звичайний випадок використання для цього сценарію, коли ви або поставив або unstaged зміни , і ви хотіли б бачити зміни в бік про бік перегляду відмінностей (наприклад 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допомогою спеціального інструменту "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 зберігається в каталозі частини вашої 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директиву конфігурації.
Тоді ви можете легко перемикати інструменти з 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=параметри не розпізнаються в версії 1.7.11
Майкл

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

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

Глобальна .gitconfig в Windows є в %USERPROFILE%\.gitconfig


1
що $ локально, а що $ віддалено?
C Johnson

3
+1 для методу, який не вимагає сценарію обгортки
jhewlett

@CJohnson: шлях до вихідного файлу та шлях до редагованого файлу відповідно.
jhewlett

в разі , якщо штампах блог-посилань, ось пов'язаний SO відповідь: stackoverflow.com/a/1291578/321973
Tobias Kienzler

1
@CJohnson: $ LOCAL - це завжди остання фіксація. Однак $ REMOTE не відповідає. Переглядаючи зміни в локальній пісочній скриньці, це поточний / відредагований файл, але коли відрізняються історичні комісії, це батьківська комісія . IOW для нормального відрізняється $ LOCAL = старий і $ REMOTE = новий. Для історичних значень $ LOCAL = новіший і $ REMOTE = старший.
Грейнджер

40

Оскільки версія git 1.6.3 є " git difftool ", яку ви можете налаштувати на використання улюбленого графічного інструменту diff. В даний час підтримуються нестандартні: 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

У мене є одне доповнення до цього. Мені подобається регулярно використовувати різні програми, які не підтримуються як один із інструментів за замовчуванням (наприклад, калейдоскоп), via

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

Чи можете ви зробити це для багатьох інструментів? І пов’язати їх за допомогою розширення файлів?
Юсер

12

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

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

  1. Створіть пакетний файл для виклику вашої програми diff з аргументами 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. Або через полюс, ввівши текст 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. Немає потреби в посередницьких скриптах

вміст .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. Майте на увазі, що я використовую MSys версію Git (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 тепер повинен викликати вашу програму візуальної різниці для кожного зміненого файлу.


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" == "- встановити".
Маріо

6

Якщо ви на Mac і маєте XCode, у вас встановлений FileMerge. Командна команда терміналу відкрита, тому можна просто зробитиgit difftool -t opendiff


2
Використовуйте опцію -y, щоб уникнути дратівливих підказок. На жаль, git зачекає, поки FileMerge закриє, перш ніж запропонувати наступний змінений файл. Використовуйте параметр -d для порівняння каталогу в одному кадрі.
miner49r

Здається, що варіант -t вимагає повного шляху. Можливо, краще використовувати git difftool --extcmd = opendiff.
Юсер

6

Встановити meld

 # apt-get install meld

Потім виберіть це як дифтол

 $ git config --global diff.tool meld

Якщо tou хочете запустити його на консольному типі:

 $ 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 про те, як налаштувати інструмент 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 "$2" "$5"

4

У Mac OS X

git difftool -t diffuse 

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

sudo port install diffuse

3

ви можете використовувати git difftool.

наприклад, якщо у вас є meld , ви можете редагувати гілки 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, він буде запущений.


це найпростіший і найшвидший спосіб.
Замер Фузан

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 у графічному середовищі, і не тривіально викликати нормальну диференцію з цією установкою, тому я перейшов до цього:

[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

Якщо у вас вже є інструмент diff, пов’язаний з файловими типами (скажімо, тому, що ви встановили TortoiseSVN, який постачається з розглядачем diff), ви можете просто git diffпередати звичайний вихід у "temp" файл, а потім просто відкрити цей файл безпосередньо, не знаючи про що що-небудь про глядача:

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

Визначення його як глобального псевдоніма працює ще краще: git what

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

0

Якщо ви не один для командного рядка, тоді, якщо ви встановите черепаху git, ви можете клацнути правою кнопкою миші на файл, щоб отримати підменю tortoisegit з опцією "Diff later".

Вибравши це в першому файлі, ви можете правою кнопкою миші натиснути другий файл, перейти в підменю tortoisegit і вибрати "Diff with == yourfilehere ==" Це дасть торізогігітмеру gui для результату.


0

Ви можете спробувати xd http://github.com/jiqingtang/xd , який є оболонкою GUI для GIT / SVN diff. Це НЕ різний інструмент сам по собі. Ви біжите , xdколи ви хочете запустити git diffабо svn diffі він покаже вам список файлів, вікно попереднього перегляду , і ви можете запустити будь-який дифф інструмент , який вам подобається, в тому числі tkdiff, xxdiff, gvimdiff, Emacs (Ediff), XEmacs (Ediff), MELD, дифуз, kompare та kdiff3. Ви також можете запустити будь-який спеціальний інструмент.

На жаль, інструмент не підтримує Windows.

Розкриття інформації : Я є автором цього інструменту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.