Как я могу получить бок о бок diff, когда я делаю "git diff"?

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

Ответ 1

Хотя 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/en/v2/Customizing-Git-Git-Configuration.

Ответ 2

Попробуй git difftool

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

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

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

Для более новых версий git команда difftool поддерживает множество внешних инструментов diff из коробки. Например, 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

Ответ 3

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

Ответ 4

ydiff

Этот инструмент, ранее называвшийся cdiff, может отображать параллельные, инкрементные и цветные различия.

Вместо того, чтобы делать git diff, сделайте:

ydiff -s

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

Установить с помощью:

python3 -m pip install --user ydiff

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

ydiff -ls

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

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

Ответ 5

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

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

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

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

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


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

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

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

$ git sdiff HEAD^

Ответ 6

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

$ pip install webdiff
$ git webdiff

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

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

Ответ 7

export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'

то просто:

git diff

Ответ 8

Я использую 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 - это параллельный diff в unix. Colordiff также добавляет цвета, которые приятнее. В опции -ydw, y для бок о бок, w для игнорирования пробелов, а d для получения минимального diff (обычно вы получаете лучший результат как diff)

Ответ 9

Мне лично очень нравится 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

Ответ 10

Для 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 ссылки - метки, ветки или хэшей.

Ответ 11

Вот подход. Если вы пропускаете меньше, ширина xterm устанавливается равной 80, что не так сильно. Но если вы выполните команду с помощью, например, COLS = 210, вы можете использовать расширенный xterm.

gitdiff()
{
    local width=${COLS:-$(tput cols)}
    GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "[email protected]"
}

Ответ 12

Несколько других уже упоминали cdiff для git- сравнения, но никто не дал полной реализации этого.

Настройте cdiff:

git clone https://github.com/ymattw/cdiff.git
cd cdiff
ln -s 'pwd'/cdiff ~/bin/cdiff
hash -r # refresh your PATH executable in bash (or 'rehash' if you use tcsh)
        # or just create a new terminal

Отредактируйте ~/.gitconfig, вставив эти строки:

[pager]
        diff = false
        show = false

[diff]
        tool = cdiff
        external = "cdiff -s $2 $5 #"

[difftool "cdiff"]
        cmd = cdiff -s \"$LOCAL\" \"$REMOTE\"

[alias]
        showw = show --ext-dif

Выключение пейджера необходимо для работы cdiff с Diff, в любом случае это пейджер, так что это нормально. Difftool будет работать независимо от этих настроек.

Псевдоним show необходим, потому что git show поддерживает только внешние инструменты сравнения через аргумент.

Знак "#" в конце внешней команды diff важен. Команда Git diff добавляет $ @(все доступные переменные diff) к команде diff, но нам нужны только два имени файла. Таким образом, мы вызываем эти два явно с $ 2 и $ 5, а затем скрываем $ @за комментарием, который иначе запутал бы sdiff. В результате возникает ошибка, которая выглядит следующим образом:

fatal: <FILENAME>: no such path in the working tree
Use 'git <command> -- <path>...' to specify paths that do not exist locally.

Команды Git, которые теперь производят параллельное сравнение:

git diff <SHA1> <SHA2> 
git difftool <SHA1> <SHA2>
git showw <SHA>

Использование Cdiff:

'SPACEBAR' - Advances the page of the current file.
'Q'        - Quits current file, thus advancing you to the next file.

Теперь у вас есть параллельный diff через git diff и difftool. И у вас есть исходный код Python для настройки опытных пользователей, если вам это нужно.

Ответ 13

Этот вопрос появился, когда я искал быстрый способ использовать git встроенный способ определения мест. Мои критерии решения:

  • Быстрый запуск, необходимые встроенные параметры
  • Может легко обрабатывать многие форматы, xml, разные языки программирования.
  • Быстрое обнаружение небольших изменений кода в больших текстовых файлах

Я нашел этот ответ, чтобы получить цвет в git.

Чтобы получить бок о бок diff вместо строки diff, я подчёркивал mb14 отличный ответ об этом вопрос со следующими параметрами:

$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]"

Если вам не нравится дополнительная [- или {+ опция --word-diff=color).

$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]" --word-diff=color

Это помогло получить правильное сравнение с текстом json и xml и java-кодом.

Таким образом, параметры --word-diff-regex имеют полезную видимость вместе с настройками цвета, чтобы получить раскрашенный бок о бок источник исходного кода по сравнению со стандартным различием строк при просмотре больших файлов с небольшими изменениями строки.

Ответ 14

В этой теме есть много хороших ответов. Моим решением для этой проблемы было написать script.

Назовите это "git -scriptname" (и сделайте его исполняемым и поместите его в свой PATH, как и любой script), и вы можете вызвать его как обычную команду git, запустив

$ git scriptname

Фактическая функциональность - это только последняя строка. Здесь источник:

#!/usr/bin/env zsh
#
#   Show a side-by-side diff of a particular file how it currently exists between:
#       * the file system
#       * in HEAD (latest committed changes)

function usage() {
    cat <<-HERE
    USAGE

    $(basename $1) <file>

    Show a side-by-side diff of a particular file between the current versions:

        * on the file system (latest edited changes)
        * in HEAD (latest committed changes)

HERE
}

if [[ $# = 0 ]]; then
    usage $0
    exit
fi

file=$1
diff -y =(git show HEAD:$file) $file | pygmentize -g | less -R

Ответ 15

Откройте Intellij IDEA, выберите одну или несколько записей в окне инструментов "Управление версиями", просмотрите измененные файлы и дважды щелкните их для проверки изменений рядом друг с другом для каждого файла.

С помощью пусковой установки командной строки вы можете принести IDEA в любом месте с помощью простого idea some/path

view control view diff view

Ответ 16

Если вы работаете на Mac, GitUp http://gitup.co/ - неплохой выбор.