Когда я набираю «git diff», я хотел бы видеть параллельный diff, например «diff -y», или отображать diff в интерактивном инструменте diff, например «kdiff3». Как это может быть сделано?
Когда я набираю «git diff», я хотел бы видеть параллельный diff, например «diff -y», или отображать diff в интерактивном инструменте diff, например «kdiff3». Как это может быть сделано?
Ответы:
Хотя Git имеет внутреннюю реализацию diff, вы можете вместо этого настроить внешний инструмент.
Есть два разных способа указать внешний инструмент сравнения:
GIT_EXTERNAL_DIFF
и GIT_DIFF_OPTS
окружения.git config
Смотрите также:
git diff --help
При выполнении 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
meld
?
meld
ли настроить версию для создания каталога diff, где я могу выбрать, для каких файлов я хочу просмотреть diff? В настоящее время он запускает отдельную meld
команду для каждого файла, и мне нужно выйти meld
, чтобы увидеть следующий файл. Я бы предпочел meld
показать мне список каталогов измененных файлов, как он ведет себя при meld
использовании из Mercurial.
Используйте git difftool
вместо git diff
. Ты никогда не вернешься.
Вот ссылка на другой стековый поток, в котором говорится git difftool
: Как просмотреть вывод «git 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
This message is displayed because 'diff.tool' is not configured.
. Возможно, обновите ответ с минимальной настройкой этой вещи, чтобы она отображала в терминале параллельные различия, о чем просил OP? Инструменты с графическим интерфейсом совершенно бесполезны на удаленном сервере, где вы подключаетесь с помощью ssh.
git difftool
с vimdiff
не всегда правильно выстроить два файла / буфера.
git difftool -y
чтобы предотвратить приглашение
git difftool
в Windows & Linux: stackoverflow.com/a/48979939/4561887
Вы также можете попробовать git diff --word-diff
. Это не совсем бок о бок, но как-то лучше, так что вы можете предпочесть это вашим реальным потребностям.
git diff --word-diff=color
--word-diff=color
выдает мне неверную опцию ошибки. В какой версии он был представлен?
git diff --color-words
работает.
git diff --color-words
это путь на современных версиях git.
ydiff
Ранее назывался cdiff
, этот инструмент может отображать бок о бок , инкрементные и красочные различия.
Вместо этого git diff
сделайте:
ydiff -s -w0
Это запустит ydiff
режим параллельного отображения для каждого файла с различиями.
Установить с помощью:
python3 -m pip install --user ydiff
-или-
brew install ydiff
Для git log
вы можете использовать:
ydiff -ls -w0
-w0
автоматически определяет ширину вашего терминала. Смотрите ydiff
страницу репозитория GitHub для деталей и демонстрации.
Протестировано в Git 2.18.0, ydiff 1.1.
git diff | cdiff -s
с icdiff?
ydiff -s
из рабочего пространства git / svn / hg, вам не нужно
cd <git repo>
а затем запуститьydiff -ls <path/to/file>
Вы можете сделать бок о бок, 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^
tput cols
вместо этого, например: git difftool -x "sdiff -s -w $(tput cols)"
.
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'
тогда просто:
git diff
Если вы хотите видеть в браузере параллельные различия без использования GitHub, вам может понравиться git webdiff , заменяющий git diff
:
$ pip install webdiff
$ git webdiff
Это дает ряд преимуществ по сравнению с традиционными инструментами для изменения графического интерфейса, такими как tkdiff
то, что он может дать вам подсветку синтаксиса и показать различия в изображениях.
Подробнее об этом читайте здесь .
Я использую 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)
-y
чтобы пропустить Launch 'colordiff' [Y/n]:
приглашение.
git alias diffy "difftool --extcmd=\"colordiff -ydw\""
? Не должно ли это быть git config --global alias.diffy "difftool --extcmd=\"colordiff -ydw\""
?
Для 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 ссылки - теги, ветки или хеши.
Мне лично очень нравится 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
Этот вопрос появился, когда я искал быстрый способ использовать встроенный способ 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
параметры имеют полезную видимость вместе с настройками цвета, чтобы получить возможность раскрашивать исходный код рядом друг с другом по сравнению со стандартной разницей строк при просмотре больших файлов с небольшими изменениями строк.
Несколько других уже упоминали 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 важен. Команда 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>
Использование CDIF:
'SPACEBAR' - Advances the page of the current file.
'Q' - Quits current file, thus advancing you to the next file.
Теперь у вас есть параллельный diff через git diff и difftool. И у вас есть исходный код Python для настройки опытных пользователей, если вам это нужно.
Вот подход. Если вы пропустили меньше, ширина xterm будет равна 80, что не так уж и жарко. Но если вы продолжите команду, например, с COLS = 210, вы можете использовать ваш расширенный xterm.
gitdiff()
{
local width=${COLS:-$(tput cols)}
GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}
Откройте Intellij IDEA , выберите одну или несколько фиксаций в окне инструмента «Контроль версий», просмотрите измененные файлы и дважды щелкните их, чтобы просмотреть изменения рядом для каждого файла.
С помощью встроенного средства запуска командной строки вы можете вывести IDEA куда угодно с помощью простого idea some/path
Есть много хороших ответов на эту тему. Моим решением этой проблемы было написать сценарий.
Назовите это '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
Это может быть несколько ограниченным решением, но оно выполняет работу, используя системную diff
команду без внешних инструментов:
diff -y <(git show from-rev:the/file/path) <(git show to-rev:the/file/path)
--suppress-common-lines
(если ваша diff
опция поддерживает эту опцию).diff
маркеры--width=term-width
; в Bash можно получить ширину как $COLUMNS
или tput cols
.Это может быть также включено в вспомогательный git-скрипт для большего удобства, например, при использовании такого типа:
git diffy the/file/path --from rev1 --to rev2