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

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

Ответы [ 16 ]

2 голосов
/ 02 февраля 2018

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

Настройка CDIF:

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 имеет важное значение. Команда diff в Git добавляет $ @ (все доступные переменные 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 для настройки опытных пользователей, если вам это нужно.

2 голосов
/ 27 июня 2016

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

gitdiff()
{
    local width=${COLS:-$(tput cols)}
    GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}
1 голос
/ 20 июля 2015

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

0 голосов
/ 19 мая 2018

Если у вас Mac, GitUp http://gitup.co/ - хороший выбор.

0 голосов
/ 05 декабря 2017

Открыть Intellij IDEA , выбрать одну или несколько фиксаций в окне инструмента «Контроль версий», просмотреть измененные файлы и дважды щелкнуть по ним, чтобы просмотреть изменения рядом для каждого файла.

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

version control view diff view

0 голосов
/ 02 января 2016

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

Назовите это 'git-scriptname' (и сделайте его исполняемым и поместите его в PATH, как любой скрипт), и вы можете вызвать его как обычную команду 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
...