Коли я набираю "git diff", я хотів би бачити бічну сторону diff, як, наприклад, "diff -y", або хотів би відобразити diff в інтерактивному інструменті diff, наприклад "kdiff3". Як це можна зробити?
Коли я набираю "git diff", я хотів би бачити бічну сторону diff, як, наприклад, "diff -y", або хотів би відобразити diff в інтерактивному інструменті diff, наприклад "kdiff3". Як це можна зробити?
Відповіді:
Хоча Git має внутрішню реалізацію diff, замість цього ви можете встановити зовнішній інструмент.
Існує два різні способи визначення зовнішнього інструменту "diff":
GIT_EXTERNAL_DIFF
та GIT_DIFF_OPTS
середовища.git config
Дивитися також:
git diff --help
Виконуючи a git diff
, Git перевіряє як налаштування вищезгаданих змінних середовища, так і його .gitconfig
файл.
За замовчуванням Git передає наступні сім аргументів програмі diff:
path old-file old-hex old-mode new-file new-hex new-mode
Зазвичай потрібні лише параметри старого та нового файлу. Звичайно, більшість інструментів різного роду приймають лише два імена файлів як аргумент. Це означає, що вам потрібно написати невеликий обгортковий скрипт, який бере аргументи, які 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, як і де знайти свій власний сценарій різної обгортки. У вас є три варіанти, як це зробити: (я вважаю за краще редагувати .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
Примітка:
Аналогічно встановленню спеціального інструменту "diff", ви також можете встановити спеціальний інструмент злиття, який може бути візуальним інструментом злиття, щоб краще допомогти візуалізувати злиття. (див. сторінку 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
. Ви ніколи не повернетесь.
Ось посилання на інший stackoverflow, в якому йдеться про 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
This message is displayed because 'diff.tool' is not configured.
. Можливо, оновіть відповідь мінімальним способом, як налаштувати цю річ, щоб її відображення поруч відрізнялося терміналом, про що вимагає ОП? Інструменти графічного інтерфейсу досить марні на віддаленому сервері, де ви підключаєтесь за допомогою ssh.
git difftool
з vimdiff
не завжди правильно вибудовуються два файли / буфери.
git difftool -y
для запобігання підказок tkdiff
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^
є приклад, який слід замінити тим, на що ви хочете відрізнятись.
Я знайшов це рішення тут, де також є кілька інших пропозицій. Однак ця відповідь відповідає на питання ОП коротко і чітко.
Для пояснення аргументів див. Людину 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
що бічний бік відрізняється від unix. Colordiff також додає кольори, які приємніше. У варіанті -ydw
, то y
є на бік про бік, то w
є ігнорувати пробільні, і d
це справляє мінімальний диференціал ( як правило , ви отримаєте найкращий результат , як дифф)
-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 вбудований спосіб знайти відмінності. Мої критерії рішення:
Я знайшов цю відповідь, щоб отримати колір в git.
Щоб встати на бік 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), але ми хочемо лише двох імен файлів. Тому ми чітко виказуємо ці два $ 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. І у вас є вихідний код cdiff 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