Как я могу получить параллельный diff, когда я делаю "git diff"? - PullRequest
132 голосов
/ 06 октября 2011

Когда я набираю «git diff», я хотел бы видеть параллельный diff, например, «diff -y», или отображать diff в интерактивном инструменте diff, например «kdiff3».Как это можно сделать?

Ответы [ 16 ]

121 голосов
/ 06 октября 2011

Попробуйте git difftool

Используйте git difftool вместо git diff. Ты никогда не вернешься.

ОБНОВЛЕНИЕ, чтобы добавить пример использования:

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

Для более новых версий git команда difftool поддерживает множество внешних инструментов сравнения "из коробки". Например, vimdiff поддерживается автоматически и может быть открыт из командной строки:

cd /path/to/git/repo
git difftool --tool=vimdiff

Другие поддерживаемые внешние инструменты сравнения перечислены через git difftool --tool-help, вот пример вывода:

'git difftool --tool=<tool>' may be set to one of the following:
        araxis
        kompare
        vimdiff
        vimdiff2

The following tools are valid, but not currently available:
        bc3
        codecompare
        deltawalker
        diffuse
        ecmerge
        emerge
        gvimdiff
        gvimdiff2
        kdiff3
        meld
        opendiff
        tkdiff
        xxdiff
80 голосов
/ 06 октября 2011

Хотя Git имеет внутреннюю реализацию diff, вы можете вместо этого настроить внешний инструмент.

Существует два разных способа задания внешнего инструмента сравнения:

  1. установка переменных окружения GIT_EXTERNAL_DIFF и GIT_DIFF_OPTS.
  2. настройка внешнего инструмента сравнения с помощью git config

Смотри также:

При выполнении git diff, Git проверяет настройки вышеуказанных переменных среды и свой файл .gitconfig.

По умолчанию Git передает следующие семь аргументов программе diff:

path  old-file  old-hex old-mode  new-file  new-hex new-mode

Обычно вам нужны только параметры old-file и new-file. Конечно, большинство инструментов сравнения принимают в качестве аргумента только два имени файла. Это означает, что вам нужно написать небольшой скрипт-обертку, который принимает аргументы, которые Git предоставляет скрипту, и передает их внешней программе git по вашему выбору.

Допустим, вы поместили свой скрипт-обертку в ~/scripts/my_diff.sh:

#!/bin/bash
# un-comment one diff tool you'd like to use

# side-by-side diff with custom options:
# /usr/bin/sdiff -w200 -l "$2" "$5" 

# using kdiff3 as the side-by-side diff:
# /usr/bin/kdiff3 "$2" "$5"

# using Meld 
/usr/bin/meld "$2" "$5"

# using VIM
# /usr/bin/vim -d "$2" "$5"

Затем вам нужно сделать этот скрипт исполняемым:

chmod a+x ~/scripts/my_diff.sh

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

  1. Использование GIT_EXTERNAL_DIFF, GIT_DIFF_OPTS

    например. в вашем файле .bashrc или .bash_profile вы можете установить:

    GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh
    export GIT_EXTERNAL_DIFF
    
  2. Использование git config

    используйте "git config", чтобы определить, где находится ваш скрипт-обертка:

    git config --global diff.external ~/scripts/my_diff.sh
    
  3. Редактирование файла ~/.gitconfig

    Вы можете отредактировать файл ~/.gitconfig, добавив в него следующие строки:

    [diff]
      external = ~/scripts/my_diff.sh
    

Примечание:

Аналогично установке пользовательского инструмента сравнения, вы также можете установить пользовательский инструмент слияния, который может быть визуальным инструментом слияния, чтобы лучше помочь визуализировать слияние. (см. страницу progit.org)

См .: http://fredpalma.com/518/visual-diff-and-merge-tool/ и https://git -scm.com / book / ru / v2 / Настройка Git-Git-Configuration

39 голосов
/ 11 ноября 2013

Вы также можете попробовать git diff --word-diff.Это не совсем бок о бок, но как-то лучше, так что вы можете предпочесть это вашим реальным потребностям бок о бок.

33 голосов
/ 01 февраля 2013

ydiff

Ранее назывался cdiff, этот инструмент может отображать рядом , в инкрементах и color diff.

Вместо того, чтобы делать git diff, выполните:

ydiff -s

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

Установка с:

python3 -m pip install --user ydiff

Для git log вы можете использовать:

ydiff -ls

См. страницу репозитория ydiff GitHub для деталей и демонстрации.

Протестировано в Git 2.18.0, ydiff 1.1.

12 голосов
/ 30 августа 2016

Вы можете сделать бок о бок diff, используя sdiff следующим образом:

$ git difftool -y -x sdiff  HEAD^ | less

, где HEAD^ - это пример, который вы должны заменить тем, с чем хотите различать.

Я нашел это решение здесь , где также есть пара других предложений.Тем не менее, этот единственный ответ - вопрос ОП кратко и ясно.

См. man git-difftool для объяснения аргументов.


Принимая комментарии кНа доске вы можете создать удобную команду git sdiff, написав следующий исполняемый скрипт:

#!/bin/sh
git difftool -y -x "sdiff -w $(tput cols)" "${@}" | less

Сохраните его как /usr/bin/git-sdiff и chmod -x.Тогда вы сможете сделать это:

$ git sdiff HEAD^
7 голосов
/ 20 ноября 2014

Если вы хотите видеть параллельные различия в браузере без использования GitHub, вам может понравиться git webdiff , замена для git diff:

$ pip install webdiff
$ git webdiff

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

Подробнее об этом здесь .

6 голосов
/ 17 июля 2014

Я использую colordiff .

В Mac OS X установите его с

$ sudo port install colordiff

В Linux возможно apt get install colordiff или что-то в этом роде, в зависимости от вашего дистрибутива.

Тогда:

$ git difftool --extcmd="colordiff -ydw" HEAD^ HEAD

Или создайте псевдоним

$ git alias diffy "difftool --extcmd=\"colordiff -ydw\""

Тогда вы можете использовать его

$ git diffy HEAD^ HEAD

Я назвал его "diffy", потому что diff -y является параллельнымбоковой дифференциал в Unix.Colordiff также добавляет цвета, которые приятнее.В опции -ydw, y для бок о бок, w - для игнорирования пробелов, а d - для получения минимального различия (обычно вы получите лучший результат как diff)

6 голосов
/ 12 октября 2012
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'

тогда просто:

git diff
4 голосов
/ 07 мая 2018

Для Unix, комбинация только git и встроенного diff:

git show HEAD:path/to/file | diff -y - path/to/file

Конечно, вы можете заменить HEAD любой другой ссылкой на git, и вы, вероятно, захотите добавить что-то вроде-W 170 для команды diff.

Предполагается, что вы просто сравниваете содержимое своего каталога с прошлым коммитом.Сравнение двух коммитов более сложно.Если ваша оболочка bash, вы можете использовать «подстановку процесса»:

diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)

, где REF1 и REF2 - это ссылки на git - теги, ветви или хеши.

3 голосов
/ 29 октября 2015

Мне лично очень нравится icdiff !

Если вы используете Mac OS X с HomeBrew, просто наберите brew install icdiff.

Чтобы правильно получить метки файлов, а также другие интересные функции, я имею в своем ~/.gitconfig:

[pager]
    difftool = true
[diff]
    tool = icdiff
[difftool "icdiff"]
    cmd = icdiff --head=5000 --highlight --line-numbers -L \"$BASE\" -L \"$REMOTE\" \"$LOCAL\" \"$REMOTE\"

И я использую это как: git difftool

...