Когда я набираю "git diff", я хотел бы видеть параллельный diff, например, с "diff -y", или хотел бы отображать diff в интерактивном инструменте diff, например "kdiff3", Как это можно сделать?
Как я могу получить бок о бок diff, когда я делаю "git diff"?
Ответ 1
Хотя Git имеет внутреннюю реализацию diff, вы можете вместо этого настроить внешний инструмент.
Есть два разных способа указать внешний инструмент сравнения:
- установка переменных среды
GIT_EXTERNAL_DIFF
иGIT_DIFF_OPTS
. - настройка внешнего инструмента сравнения с помощью
git config
Смотрите также:
- https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
-
git diff --help
- http://www.pixelbeat.org/programming/diffs/
При выполнении 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)
-
Используя
GIT_EXTERNAL_DIFF
,GIT_DIFF_OPTS
например, в вашем файле .bashrc или .bash_profile вы можете установить:
GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh export GIT_EXTERNAL_DIFF
-
Использование
git config
используйте "git config", чтобы определить, где находится ваш скрипт-обертка:
git config --global diff.external ~/scripts/my_diff.sh
-
Редактирование файла
~/.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
Ответ 16
Если вы работаете на Mac, GitUp http://gitup.co/ - неплохой выбор.