українська мова ▾ Topics ▾ Latest version ▾ git-diff last updated in 2.53.0

НАЗВА

git-diff — Показує зміни між комітами, комітом та робочим деревом тощо

СИНОПСИС

git diff [<options>] [<commit>] [--] [<path>…​]
git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>…​]
git diff [<options>] [--merge-base] <commit> [<commit>…​] <commit> [--] [<path>…​]
git diff [<options>] <commit>...<commit> [--] [<path>…​]
git diff [<options>] <blob> <blob>
git diff [<options>] --no-index [--] <path> <path> [<pathspec>…​]

ОПИС

Показує зміни між робочим деревом та індексом або деревом, зміни між індексом та деревом, зміни між двома деревами, зміни, що виникли в результаті злиття, зміни між двома об’єктами blob або зміни між двома файлами на диску.

git diff [<options>] [--] [<path>...]

Ця форма призначена для перегляду змін, які ви внесли відносно індексу (область проміжного зберігання для наступного коміту). Іншими словами, відмінності — це те, що ви могли б сказати Git додати до індексу, але досі цього не зробили. Ви можете додати ці зміни до stage, використовуючи git-add[1].

git diff [<options>] --no-index [--] <path> <path> [<pathspec>...]

Ця форма призначена для порівняння двох заданих шляхів у файловій системі. Ви можете пропустити опцію --no-index, якщо ви виконуєте команду в робочому дереві, контрольованому Git, і принаймні один зі шляхів вказує за межі робочого дерева, або якщо ви виконуєте команду за межами робочого дерева, контрольованого Git. Ця форма передбачає --exit-code. Якщо обидва шляхи вказують на теки, можна надати додаткові специфікації шляхів. Вони обмежать файли, що входять до diff. Усі такі специфікації шляхів мають бути відносними, оскільки вони застосовуються до обох сторін diff.

git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>...]

Ця форма призначена для перегляду змін, які ви проіндексували для наступного коміту відносно вказаного <commit>. Зазвичай вам потрібно порівняти їх з останнім комітом, тому, якщо ви не вкажете <commit>, зазвичай використовується значення HEAD. Якщо HEAD не існує (наприклад, ненароджені гілки) і <commit> не вказано, буде показано всі проіндексовані зміни. --staged є синонімом --cached.

Якщо вказано --merge-base, замість <commit> використовується база злиття <commit> та HEAD. git diff --cached --merge-base A еквівалентно git diff --cached $(git merge-base A HEAD).

git diff [<options>] [--merge-base] <commit> [--] [<path>...]

Ця форма призначена для перегляду змін у вашому робочому дереві відносно вказаного <commit>. Ви можете використовувати HEAD для порівняння його з останнім комітом або назву гілки для порівняння з вершиною іншої гілки.

Якщо вказано --merge-base, замість <commit> використовується база злиття <commit> та HEAD. git diff --merge-base A еквівалентно git diff $(git merge-base A HEAD).

git diff [<options>] [--merge-base] <commit> <commit> [--] [<path>...]

Використовується для перегляду змін між двома довільними <commit>.

Якщо вказано --merge-base, використовується база злиття двох комітів для сторони "до". git diff --merge-base A B еквівалентно git diff $(git merge-base A B) B.

git diff [<options>] <commit> <commit>...<commit> [--] [<path>...]

Ця форма призначена для перегляду результатів коміту злиття. Перший у списку <commit> має бути самим комітом злиття; решта два або більше комітів повинні бути його батьківськими. Зручними способами створення бажаного набору ревізій є використання суфіксів @ та ^!. Якщо A є комітом злиття, то git diff A A^@, git diff A^! та git show A дають однакові обʼєднані відмінності.

git diff [<options>] <commit>..<commit> [--] [<path>...]

Є синонім попередньої форми (без ..) для перегляду змін між двома довільними <commit>. Якщо <commit> з одного боку пропустити, це матиме той самий ефект, що й використання HEAD замість цього.

git diff [<options>] <commit>...<commit> [--] [<path>...]

Ця форма призначена для перегляду змін у гілці, що містить <commit> і аж до другого <commit>, починаючи зі спільного предка обох <commit>. git diff A...B еквівалентно git diff $(git merge-base A B) B. Ви можете пропустити будь-який з <commit>, що матиме той самий ефект, що й використання HEAD.

Якщо ви робите щось екзотичне, слід зазначити, що всі <commit> у наведеному вище описі, за винятком випадку --merge-base та двох останніх форм, які використовують нотації .., можуть бути будь-якими <tree>. Дерево, що нас цікавить, це те, на яке вказує посилання з назвою AUTO_MERGE, яке записується стратегією злиття ort після виникнення конфліктів злиття (див. git-merge[1]). Порівняння робочого дерева з AUTO_MERGE показує зміни, які ви внесли до цього часу для вирішення текстових конфліктів (див. приклади нижче).

Для отримання повнішого списку способів написання <commit> див. розділ "ВИЗНАЧЕННЯ РЕВІЗІЙ" у gitrevisions[7]. Однак, diff стосується порівняння двох кінцевих точок, а не діапазонів, а позначення діапазонів (<commit>..<commit> та <commit>...<commit>) не означають діапазон, як визначено в розділі "ВИЗНАЧЕННЯ ДІАПАЗОНІВ" у gitrevisions[7].

git diff [<options>] <blob> <blob>

Ця форма призначена для перегляду відмінностей між необробленим вмістом двох blob-обʼєктів.

ОПЦІЇ

-p
-u
--patch

Створення латки (див. Генерація тексту латки за допомогою -p). Стандартно.

-s
--no-patch

Придушує весь вивід механізму порівняння. Це корисно для команд на кшталт git show, які стандартно показують латку, щоб придушити їхній вивід, або щоб скасувати дію таких опцій, як --patch, --stat, вказаних раніше в командному рядку в аліасі.

-U<n>
--unified=<n>

Генерувати diff з <n> рядками контексту замість звичайних трьох. Мається на увазі --patch.

--output=<файл>

Вивід у вказаний файл замість stdout.

--output-indicator-new=<char>
--output-indicator-old=<char>
--output-indicator-context=<char>

Визначає символ, який використовуватиметься для позначення нових, старих або контекстних рядків у згенерованій латці. Зазвичай це відповідно +, - та “ ”.

--raw

Створювати diff в форматі raw.

--patch-with-raw

Синонім до -p --raw.

--indent-heuristic

Увімкнути евристику, яка зсуває межі фрагментів diff, щоб зробити латки легшими для читання. Це стандартне значення.

--no-indent-heuristic

Вимкнути евристику відступів.

--minimal

Витрачає додатковий час, щоб переконатися, що отримано найменший можливий diff.

--patience

Створювати diff використовуючи алгоритм "patience diff".

--histogram

Створювати diff використовуючи алгоритм "histogram diff".

--anchored=<text>

Створювати diff використовуючи алгоритм "anchored diff".

Цей параметр можна вказати більше одного разу.

Якщо рядок існує як у вихідному, так і в цільовому тексті, зустрічається лише один раз і починається з <текст>, цей алгоритм намагається запобігти його появі у вигляді видалення або додавання у результаті. Внутрішньо він використовує алгоритм «patience diff».

--diff-algorithm=(patience|minimal|histogram|myers)

Вибір алгоритму порівняння. Є наступні варіанти:

default
myers

Базовий алгоритм «жадібного» порівняння. Наразі це типове значення.

minimal

Витрачає додатковий час, щоб переконатися, що отримано найменший можливий diff.

patience

При створенні латок використовується алгоритм «patience diff».

histogram

Цей алгоритм розширює алгоритм «patience» для «підтримки рідкісних загальних елементів».

Наприклад, якщо ви налаштували змінну diff.algorithm на значення, відмінне від стандартного, і хочете скористатись стандартним значенням, тоді вам потрібно використовувати опцію --diff-algorithm=default.

--stat[=<width>[,<name-width>[,<count>]]]

Генерує diffstat. Як правило, для частини з іменами файлів використовується стільки місця, скільки потрібно, а решта — для частини з таблицями. Стандартна максимальна ширина дорівнює ширині терміналу або 80 стовпців, якщо підключення до терміналу відсутнє; це значення можна змінити за допомогою параметра <width>. Ширину частини імені файлу можна обмежити, вказавши іншу ширину <name-width> після коми або встановивши diff.statNameWidth=<name-width>. Ширину частини таблиці можна обмежити, використовуючи --stat-graph-width=<graph-width> або встановивши diff.statGraphWidth=<graph-width>. Використання --stat або --stat-graph-width впливає на всі команди, що генерують граф статистики, тоді як встановлення diff.statNameWidth або diff.statGraphWidth не впливає на git format-patch. Вказавши третій параметр <count>, ви можете обмежити вивід першими <count> рядками, за якими слідує ..., якщо їх більше.

Ці параметри також можна встановити окремо за допомогою --stat-width=<ширина>, --stat-name-width=<ширина-назви> та --stat-count=<кількість>.

--compact-summary

Виводити у diffstat стислий звіт про інформацію розширеного заголовка, таку як створення або видалення файлів («new» або «gone», за бажанням із позначкою +l, якщо це символічне посилання), а також зміни прав доступу (+x або -x для додавання чи видалення біта виконуваності відповідно). Ця інформація розміщується між частиною з іменем файлу та частиною з графом. Передбачає використання опції --stat.

--numstat

Подібно до --stat, але показує кількість доданих та видалених рядків у десятковому форматі та шлях без скорочень, що робить його зручнішим для машинної обробки. Для бінарних файлів виводить два - замість 0 0.

--shortstat

Виводіть лише останній рядок формату --stat, що містить загальну кількість змінених файлів, а також кількість доданих та видалених рядків.

-X [<param>,...]
--dirstat[=<param>,...]

Виводіть розподіл відносної кількості змін для кожної субтеки. Поведінку --dirstat можна налаштувати, передавши список параметрів, розділених комами. Стандартне значення контролюються змінною конфігурації diff.dirstat (див. git-config[1]). Доступні такі параметри:

changes

Обчислює показники dirstat шляхом підрахунку рядків, які були видалені з вихідного файлу або додані до файлу призначення. При цьому не враховується кількість переміщень коду всередині самого файлу. Іншими словами, перегрупування рядків у файлі не враховується так само, як інші зміни. Це стандартна поведінка, якщо параметр не вказано.

lines

Обчислює показники dirstat, виконуючи звичайний аналіз відмінностей на основі рядків та підсумовуючи кількість видалених/доданих рядків. (Для бінарних файлів рахує 64-байтові блоки, оскільки бінарні файли не мають природного поняття рядків). Такий підхід --dirstat є більш ресурсоємним, ніж підхід changes, але він враховує перегруповані рядки у файлі нарівні з іншими змінами. Отриманий результат відповідає тому, що ви отримуєте від інших опцій --*stat.

files

Обчислює показники dirstat, рахуючи кількість змінених файлів. Кожен змінений файл має однакову вагу в аналізі dirstat. Це найменш ресурсомісткий варіант роботи опції --dirstat, оскільки він взагалі не вимагає аналізу вмісту файлів.

cumulative

Також підраховуються зміни у дочірній теці батьківської теки. Зверніть увагу, що при використанні параметра cumulative сума вказаних відсотків може перевищувати 100%. Стандартну поведінку (без накопичення) можна вказати за допомогою параметра noncumulative.

<limit>

Цілочисельний параметр визначає граничний відсоток (стандартно — 3%). Теки, що вносять менше змін, ніж цей відсоток, не відображаються у виводі.

Приклад: Наступна команда підрахує змінені файли, ігноруючи при цьому теки, в яких міститься менше ніж 10 % від загальної кількості змінених файлів, та підсумовуючи кількість файлів у дочірніх теках в батьківських теках: --dirstat=files,10,cumulative.

--cumulative

Синонім до --dirstat=cumulative.

--dirstat-by-file[=<param>,...]

Синонім до --dirstat=files,<param>,....

--summary

Виводить стислий підсумок інформації розширеного заголовка, такої як створення, перейменування та зміни режиму.

--patch-with-stat

Синонім до -p --stat.

-z

Якщо вказано параметри --raw, --numstat, --name-only або --name-status, не змінювати імена шляхів і використовувати символи NUL як роздільники полів у вихідних даних.

Без цієї опції шляхи з «незвичайними» символами беруться в лапки, як це пояснено для змінної конфігурації core.quotePath (див. git-config[1]).

--name-only

Показувати лише назву кожного зміненого файлу в дереві пост-образів. Назви файлів часто кодуються в UTF-8. Для отримання додаткової інформації див. обговорення кодування на сторінці довідки git-log[1].

--name-status

Показувати лише імʼя(імена) та стан кожного зміненого файлу. Дивіться опис опції --diff-filter щодо значення літер стану. Так само як і --name-only, імена файлів часто кодуються в UTF-8.

--submodule[=<формат>]

Визначає, як відображатимуться відмінності в субмодулях. Для --submodule=short використовується формат short. Цей формат показує лише імена комітів на початку та в кінці діапазону. Якщо вказано --submodule або --submodule=log, використовується формат log. Цей формат перелічує коміти в діапазоні, як це робить git-submodule[1] summary. При вказанні --submodule=diff використовується формат diff. Цей формат показує порівняння змін у вмісті субмодуля між діапазоном комітів. Стандартним є diff.submodule або формат short, якщо опція конфігурації не встановлена.

--color[=<when>]

Показує відмінності з кольоровою підсвіткою. --color (тобто без =<when>) те саме, що й --color=always. <when> може бути одним із always, never або auto. Це можна змінити за допомогою параметрів конфігурації color.ui та color.diff.

--no-color

Вимикає кольорову підсвітку відмінностей. Цей параметр можна використовувати для зміни налаштувань конфігурації. Це те саме, що --color=never.

--color-moved[=<режим>]

Переміщені рядки коду забарвлюються по-різному. Це можна змінити за допомогою параметра конфігурації diff.colorMoved. Якщо параметр не вказано, типовим значенням для <режим> є no, а якщо вказано параметр без режиму — zebra. Режим повинен бути одним із таких:

no

Переміщені рядки не підсвічуються.

default

Є синонімом zebra. У майбутньому це може змінитися на раціональніший режим.

plain

Будь-який рядок, який було додано в одному місці та видалено в іншому, буде виділено кольором color.diff.newMoved. Аналогічно, колір color.diff.oldMoved застосовуватиметься до видалених рядків, які було додано в іншому місці в відмінностях. Цей режим виявляє будь-які переміщені рядки, але під час рецензування він не дуже корисний для визначення того, чи було переміщено блок коду без зміни порядку.

blocks

Блоки переміщеного тексту, що містять щонайменше 20 літерно-цифрових символів, виявляються за алгоритмом «greedy». Виявлені блоки зафарбовуються кольором color.diff.(old|new)Moved. Суміжні блоки неможливо розрізнити.

zebra

Блоки переміщеного тексту виявляються як у режимі blocks. Блоки зафарбовуються кольором color.diff.(old|new)Moved або color.diff.(old|new)MovedAlternative. Зміна між двома кольорами вказує на виявлення нового блоку.

dimmed-zebra

Подібно до zebra, але виконується додаткове затемнення нецікавих частин переміщеного коду. Лінії, що межують з двома суміжними блоками, вважаються цікавими, решта — нецікавими. dimmed_zebra — застарілий синонім.

--no-color-moved

Вимикає виявлення переміщення. Цю опцію можна використовувати для заміни параметрів конфігурації. Вона відповідає параметру --color-moved=no.

--color-moved-ws=<режим>,...

Налаштовує, як ігноруються пробіли під час виконання виявлення переміщення для --color-moved. Можна встановити за допомогою параметра конфігурації diff.colorMovedWS. Ці режими можна вказати у вигляді списку, розділеного комами:

no

Не ігнорувати пробіли під час виявлення переміщення.

ignore-space-at-eol

Ігнорувати зміни пробілів в кінці рядків.

ignore-space-change

Ігнорувати зміни кількості пробілів. Ігнорує пробіли в кінці рядка та вважає всі інші послідовності з одного або кількох пробільних символів еквівалентними.

ignore-all-space

Ігнорувати пробіли під час порівняння рядків. Ігнорує відмінності, навіть якщо один рядок має пробіли, а інший їх не має.

allow-indentation-change

Спочатку ігнорувати будь-які пробіли у виявленні переміщення, а потім групувати переміщені блоки коду в блок, лише якщо зміна пробілів однакова для кожного рядка. Це несумісно з іншими режимами.

--no-color-moved-ws

Не ігнорувати пробіли під час виявлення переміщення. Можна використовувати для перевизначення налаштувань конфігурації. Це те саме, що --color-moved-ws=no.

--word-diff[=<mode>]

Зазвичай слова розділяються пробілами; див. --word-diff-regex нижче. <mode> стандартно має значення plain і має бути одним з:

color

Виділяє змінені слова, використовуючи лише кольори. Мається на увазі --color.

plain

Показує слова як [-removed-] та {added}. Не намагається екранувати роздільники, якщо вони зʼявляються у вхідних даних, тому вивід може бути неоднозначним.

porcelain

Використовує спеціальний рядковий формат, призначений для використання скриптами. Додані/видалені/незмінені прогони виводяться у звичайному уніфікованому форматі відмінностей, починаючи з символу +/-/` ` на початку рядка та продовжуючи до кінця рядка. Перехід на новий рядок у вхідних даних позначається тильдою ~ на окремому рядку.

none

Знову вимкнути порівняння слів.

Зверніть увагу, що незважаючи на назву першого режиму, колір використовується для виділення змінених частин у всіх режимах, якщо вони ввімкнені.

--word-diff-regex=<regex>

Використовуйте <regex> для визначення того, що є словом, замість того, щоб вважати послідовності символів, що не є пробілами, словами. Також передбачає використання параметра --word-diff, якщо він ще не був увімкнений.

Всі збіги виразу <regex>, що не перекриваються, вважаються словами. Все, що знаходиться між цими збігами, вважається пробілами та ігнорується(!) під час пошуку відмінностей. Можливо, вам варто додати |[^[:space:]] до вашого регулярного виразу, щоб переконатися, що він відповідає всім символам, які не є пробілами. Збіг, що містить символ нового рядка, без попередження обрізається(!) на цьому символі.

Наприклад, --word-diff-regex=. трактуватиме кожен символ як слово та, відповідно, показуватиме відмінності посимвольно.

Регулярний вираз також можна задати за допомогою драйвера порівняння або параметра конфігурації; див. gitattributes[5] або git-config[1]. Явне вказання цього параметра має пріоритет над будь-якими налаштуваннями драйвера порівняння або конфігурації. Драйвери порівняння мають пріоритет над налаштуваннями конфігурації.

--color-words[=<regex>]

Еквівалентно --word-diff=color плюс (якщо було вказано регулярний вираз) --word-diff-regex=<regex>.

--no-renames

Вимикає виявлення перейменування, навіть якщо у файлі конфігурації це є стандартним.

--rename-empty
--no-rename-empty

Чи використовувати порожні блоби як джерело перейменування.

--check

Попереджає, якщо зміни призводять до появи маркерів конфлікту або помилок пробілів. Те, що вважається помилками пробілів, визначається параметром конфігурації core.whitespace. У стандартному режимі помилками пробілів вважаються пробіли в кінці рядка (включно з рядками, що складаються виключно з пробілів), а також пробіл, за яким одразу йде символ табуляції в межах початкового відступу рядка. У разі виявлення проблем закінчує роботу з ненульовим кодом стану. Несумісно з параметром --exit-code.

--ws-error-highlight=<kind>

Виділяє помилки пробілів у рядках context, old або new різниці. Кілька значень розділяються комами, none скидає попередні значення, default скидає список до new, а all — це скорочення від old,new,context. Якщо цей параметр не вказано, а змінна конфігурації diff.wsErrorHighlight не встановлена, виділяються лише помилки пробілів у рядках new. Помилки пробілів підсвічуються за допомогою color.diff.whitespace.

--full-index

Замість перших кількох символів, відображати повні назви обʼєктів blob для пре- та пост-образів в рядку "index" під час створення виводу у форматі латки.

--binary

Окрім --full-index, виводити бінарний diff, який можна застосувати за допомогою git-apply. Мається на увазі --patch.

--abbrev[=<n>]

Замість повного 40-байтового шістнадцяткового імені об’єкта у вихідних даних формату diff-raw та у заголовках рядків diff-tree показувати найкоротший префікс довжиною не менше <n> шістнадцяткових цифр, який однозначно ідентифікує об’єкт. У форматі виводу diff-patch опція --full-index має вищий пріоритет, тобто якщо вказано --full-index, повні імена блобів будуть показані незалежно від --abbrev. Нестандартну кількість цифр можна вказати за допомогою --abbrev=<n>.

-B[<n>][/<m>]
--break-rewrites[=[<n>][/<m>]]

Розбивати повні зміни перезапису на пари видалення та створення. Це служить двом цілям:

Це впливає на те, як зміна, яка зводиться до повного перезапису файлу, представляється не як серія видалення та вставки, змішаних разом з дуже невеликою кількістю рядків, які випадково відповідають контексту, а як одне видалення всього старого, за яким слідує одна вставка всього нового, і число <m> контролює цей аспект опції -B (типово — 60%). -B/70% вказує, що менше 30% оригіналу має залишитися в результаті, щоб Git вважав це повним перезаписом (тобто інакше отримана латка буде серією видалення та вставки, змішаних разом з рядками контексту).

При використанні з -M, повністю перезаписаний файл також вважається джерелом перейменування (зазвичай -M розглядає лише файл, який зник, як джерело перейменування), а число <n> контролює цей аспект опції -B (стандартно — 50%). -B20% вказує на те, що зміна з додаванням та видаленням порівняно з 20% або більше від розміру файлу може бути розглянута як можливе джерело перейменування на інший файл.

-M[<n>]
--find-renames[=<n>]

Виявлення перейменувань. Якщо вказано <n>, це означає поріг для індексу схожості (тобто частка доданих/видалених даних порівняно з розміром файлу). Наприклад, -M90% означає, що Git повинен розглядати пару «видалення/додавання» як перейменування, якщо більше ніж 90% файлу не змінилося. Без знака % число слід читати як дріб, з десятковою крапкою перед ним. Тобто -M5 стає 0,5, і, отже, дорівнює -M50%. Аналогічно, -M05 дорівнює -M5%. Щоб обмежити виявлення лише точними перейменуваннями, використовуйте -M100%. Стандартно індекс схожості становить 50%.

-C[<n>]
--find-copies[=<n>]

Виявляти копії, а також перейменування. Див. також --find-copies-harder. Якщо вказано <n>, це має те саме значення, що й -M<n>.

--find-copies-harder

З міркувань продуктивності, типово, опція -C знаходить копії, лише якщо оригінальний файл копії був змінений у тому ж наборі змін. Цей прапорець змушує команду перевіряти незмінені файли як кандидатів на джерело копії. Це дуже ресурсомістка операція для великих проєктів, тому використовуйте її з обережністю. Використання кількох опцій -C має той самий ефект.

-D
--irreversible-delete

Не відображати вихідний текст для видалень, тобто виводити лише заголовок, але не різницю між вихідним текстом та /dev/null. Отримана латка не призначена для застосування за допомогою patch або git apply; вона призначена виключно для тих, хто хоче зосередитися лише на перегляді тексту після внесення змін. Крім того, у виведеній інформації явно бракує даних, щоб застосувати таку латку у зворотному напрямку, навіть вручну, звідси й назва цієї опції.

При використанні разом з -B, також пропускається вихідний текст у частині видалення пари видалення/створення.

-l<num>

Параметри -M та -C передбачають виконання деяких попередніх кроків, які дозволяють економічно виявити підмножини випадків перейменування/копіювання, після чого виконується вичерпна резервна перевірка, під час якої всі залишені неспарені місця призначення порівнюються з усіма відповідними джерелами. (Для перейменувань релевантними є лише залишені неспарені джерела; для копіювань — усі оригінальні джерела.) Для N джерел та цілей ця вичерпна перевірка має складність O(N^2). Ця опція запобігає виконанню вичерпної частини виявлення перейменувань/копіювань, якщо кількість залучених файлів-джерел/файлів-цілей перевищує вказану кількість. Стандартне значення — diff.renameLimit. Зверніть увагу, що значення 0 трактується як необмежене.

--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]

Вибирати лише файли, які додані (A), скопійовані (C), видалені (D), змінені (M), перейменовані (R), мають змінений тип (наприклад, звичайний файл, символічне посилання, субмодуль тощо) (T), не обʼєднані (U), невідомі (X) або мають розірвану пару (B). Можна використовувати будь-яку комбінацію символів фільтра (навіть жодного). Коли до комбінації додається * (все-або-нічого), усі шляхи вибираються, якщо в порівнянні є файл, який відповідає іншим критеріям; якщо файлів, що відповідають іншим критеріям, немає, нічого не вибирається.

Також ці великі літери можна писати в нижньому регістрі, щоб вказати зворотну дію. Наприклад, --diff-filter=ad не включає додані та видалені шляхи.

Зверніть увагу, що не всі відмінності можуть відображати всі типи. Наприклад, скопійовані та перейменовані записи не можуть відображатися, якщо виявлення цих типів вимкнено.

-S<string>

Шукає відмінності, які змінюють кількість входжень зазначеного <рядка> (тобто додавання/видалення) у файлі. Призначено для використання скриптером.

Корисно, коли ви шукаєте конкретний фрагмент коду (наприклад, структуру) і хочете дізнатися історію цього фрагмента від моменту його створення: використовуйте цю функцію послідовно, вводячи потрібний фрагмент у вихідні дані команди -S, і продовжуйте, доки не отримаєте найпершу версію цього фрагмента.

Також виконується пошук у бінарних файлах.

-G<regex>

Шукає відмінності, текст виправлення яких містить додані/видалені рядки, що відповідають <regex>.

Щоб проілюструвати різницю між -S<regex> --pickaxe-regex та -G<regex>, розглянемо коміт з наступним diff у тому ж файлі:

+    return frotz(nitfol, two->ptr, 1, 0);
...
-    hit = frotz(nitfol, mf2.ptr, 1, 0);

Хоча git log -G"frotz\(nitfol" покаже цей коміт, git log -S"frotz\(nitfol" --pickaxe-regex ні (оскільки кількість входжень цього рядка не змінилася).

Якщо не вказано параметр --text, фрагменти бінарних файлів без фільтра textconv будуть ігноруватися.

Дивіться опис «pickaxe» у gitdiffcore[7] для отримання додаткової інформації.

--find-object=<object-id>

Шукає відмінності, які змінюють кількість входжень зазначеного обʼєкта. Подібно до -S, лише аргумент відрізняється тим, що він не шукає певний рядок, а певний ідентифікатор обʼєкта.

Об’єктом може бути блоб або коміт субмодуля. Це має на увазі опцію -t у команді git-log, яка дозволяє також знаходити дерева.

--pickaxe-all

Коли -S або -G знаходить зміну, показати всі зміни в цьому наборі змін, а не лише файли, що містять зміну в <рядку>.

--pickaxe-regex

Обробляти <рядок>, переданий -S, як розширений регулярний вираз POSIX для збігу.

-O<файл-порядку>

Керує порядком, у якому файли відображаються у вихідних даних. Замінює значення конфігураційної змінної diff.orderFile (див. git-config[1]). Щоб скасувати дію diff.orderFile, використовуйте -O/dev/null.

Порядок виведення визначається порядком шаблонів у <файлі-порядку>. Спочатку виводяться всі файли, імена яких відповідають першому шаблону, потім — всі файли, імена яких відповідають другому шаблону (але не першому), і так далі. Усі файли, імена яких не відповідають жодному шаблону, виводяться останніми, ніби в кінці файлу був неявний шаблон, що відповідає всім. Якщо кілька імен мають однаковий ранг (вони відповідають одному й тому ж шаблону, але не відповідають попереднім шаблонам), їхній порядок виведення відносно один одного є звичайним.

<файл-порядку> має наступний синтаксис:

  • Пусті рядки ігноруються, тому їх можна використовувати як роздільники для зручності читання.

  • Рядки, що починаються з хеш-символа ("#"), ігноруються, тому їх можна використовувати для коментарів. Додайте зворотну скісну риску ("\") на початок шаблону, якщо він починається з хеш-символа.

  • Кожен інший рядок містить один шаблон.

Шаблони мають той самий синтаксис і семантику, що й шаблони, що використовуються для fnmatch(3) без прапорця FNM_PATHNAME, за винятком того, що імʼя шляху також відповідає шаблону, якщо видалення будь-якої кількості компонентів кінцевого імені шляху відповідає шаблону. Наприклад, шаблон "foo*bar" відповідає "fooasdfbar" та "foo/bar/baz/asdf", але не "foobarx".

--skip-to=<файл>
--rotate-to=<файл>

Вилучіть із виводу файли, що йдуть перед файлом із іменем <file> (тобто «пропустити до»), або перемістіть їх у кінець виводу (тобто «перемістити до»). Ці параметри були розроблені переважно для використання з командою git difftool і в інших випадках можуть виявитися не надто корисними.

-R

Поміняти місцями два потоки вхідних даних; тобто показати відмінності між індексом або файлом на диску та вмістом дерева.

--relative[=<шлях>]
--no-relative

Якщо запускати з субтеки проєкту, за допомогою цього параметра можна вказати, щоб виключити зміни поза межами цієї теки та показувати шляхи відносно неї. Якщо ви не перебуваєте в субтеці (наприклад, у «голому» репозиторії), ви можете вказати, щодо якої саме субтеки має бути відносний вивід, передавши <path> як аргумент. --no-relative можна використовувати для скасування як опції конфігурації diff.relative, так і попереднього --relative.

-a
--text

Обробляти всі файли як текст.

--ignore-cr-at-eol

Ігнорувати символ повернення каретки в кінці рядка під час порівняння.

--ignore-space-at-eol

Ігнорувати зміни пробілів в кінці рядків.

-b
--ignore-space-change

Ігнорувати зміни кількості пробілів. Ігнорує пробіли в кінці рядка та вважає всі інші послідовності з одного або кількох пробільних символів еквівалентними.

-w
--ignore-all-space

Ігнорувати пробіли під час порівняння рядків. Ігнорує відмінності, навіть якщо один рядок має пробіли, а інший їх не має.

--ignore-blank-lines

Ігнорувати зміни, рядки яких порожні.

-I<регулярний вираз>
--ignore-matching-lines=<регулярний вираз>

Ігнорувати зміни, усі рядки яких відповідають <регулярному виразу>. Цей параметр можна вказувати більше одного разу.

--inter-hunk-context=<number>

Показує контекст між фрагментами відмінностей (diff hunks), до вказаної <кількості> рядків, таким чином обʼєднуючи фрагменти, що знаходяться близько один до одного. Стандартно використовується значення diff.interHunkContext або 0, якщо параметр конфігурації не встановлено.

-W
--function-context

Показувати повну функцію у вигляді контекстних рядків для кожної зміни. Імена функцій визначаються так само як git diff обчислює заголовки фрагментів латок (див. «Визначення власного заголовка фрагмента» у gitattributes[5]).

--exit-code

Зробити так, щоб програма завершувала роботу з кодами, аналогічними до diff(1). Тобто вона завершує роботу з кодом 1, якщо були виявлені відмінності, а код 0 означає відсутність відмінностей.

--quiet

Вимкнути весь вивід програми. Мається на увазі --exit-code. Вимкнути виконання зовнішніх помічників diff, код виходу яких не є довіреним, тобто їх відповідний параметр конфігурації diff.trustExitCode або diff.<driver>.trustExitCode або змінна середовища GIT_EXTERNAL_DIFF_TRUST_EXIT_CODE має значення false.

--ext-diff

Дозволити виконання зовнішнього помічника diff. Якщо ви налаштували зовнішній драйвер diff за допомогою gitattributes[5], вам потрібно використовувати цю опцію разом із git-log[1] та подібними командами.

--no-ext-diff

Заборонити сторонні драйвери diff.

--textconv
--no-textconv

Дозволити (або заборонити) використання зовнішніх фільтрів перетворення тексту під час порівняння бінарних файлів. Див. gitattributes[5] для отримання детальної інформації. Оскільки фільтри textconv зазвичай є одностороннім перетворенням, отриманий diff придатний для використання людиною, але не може бути застосований. З цієї причини фільтри textconv стандартно увімкнено лише для git-diff[1] та git-log[1], але не для git-format-patch[1] або команд diff plumbing.

--ignore-submodules[=(none|untracked|dirty|all)]

Ігнорувати зміни в субмодулях під час формування порівняння. Стандартним значенням є all. При використанні none субмодуль вважатиметься зміненим, якщо він містить не відстежувані або змінені файли, або якщо його HEAD відрізняється від коміту, записаного в суперпроєкті; це дозволяє замінити будь-які налаштування параметра ignore у файлах git-config[1] або gitmodules[5]. При використанні untracked субмодулі не вважаються зміненими, якщо вони містять лише не відстежуваний вміст (але вони все одно скануються на наявність зміненого вмісту). Використання dirty ігнорує всі зміни у робочому дереві субмодулів, показуються лише зміни у комітах, збережених у суперпроекті (така поведінка була до версії 1.7.0). Використання all приховує всі зміни у субмодулях.

--src-prefix=<prefix>

Показати вказаний <prefix> для джерела замість "a/".

--dst-prefix=<prefix>

Показувати вказаний <prefix> для призначення замість "b/".

--no-prefix

Не показувати жодного префікса для джерела чи призначення.

--default-prefix

Використовувати типові префікси джерела та призначення ("a/" та "b/"). Замінює змінні конфігурації, такі як diff.noprefix, diff.srcPrefix, diff.dstPrefix та diff.mnemonicPrefix (див. git-config[1]).

--line-prefix=<prefix>

Додавати додатковий <prefix> до кожного рядка виводу.

--ita-invisible-in-index

Стандартно записи, додані за допомогою команди git add -N, відображаються як наявні порожні файли в git diff і як нові файли в git diff --cached. Ця опція забезпечує відображення запису як нового файлу в git diff і як файлу, що не існує, в git diff --cached. Дія цієї опції можна скасувати за допомогою --ita-visible-in-index. Обидві опції є експериментальними і можуть бути вилучені в майбутньому.

--max-depth=<depth>

Для кожного специфікатора шляху, вказаного в командному рядку, слід просканувати не більше ніж <depth> рівнів тек. Значення -1 означає відсутність обмеження. Не можна поєднувати з символами-замінниками у специфікаторі шляху. Якщо дерево містить foo/bar/baz, у наведеному нижче списку показано результати, отримані для кожного набору опцій:

  • --max-depth=0 -- foo: foo

  • --max-depth=1 -- foo: foo/bar

  • --max-depth=1 -- foo/bar: foo/bar/baz

  • --max-depth=1 -- foo foo/bar: foo/bar/baz

  • --max-depth=2 -- foo: foo/bar/baz

Якщо специфікатор шляху не вказано, глибина вимірюється так, ніби вказано всі записи верхнього рівня. Зверніть увагу, що це відрізняється від вимірювання від кореня тим, що при --max-depth=0 все одно буде повернуто foo. Це дозволяє обмежувати глибину, запитуючи при цьому лише підмножину записів верхнього рівня.

Зверніть увагу, що ця опція підтримується лише для порівняння між об’єктами дерева, а не з індексом чи робочим деревом.

Для більш детального пояснення цих поширених опцій див. також gitdiffcore[7].

-1
--base
-2
--ours
-3
--theirs

Порівняння робочого дерева з

  • "базовою" версією (stage #1) при використанні -1 або --base,

  • "нашою гілкою" (stage #2) при використанні -2 або --ours, або

  • "їх гілкою" (stage #3) при використанні -3 або --theirs.

Індекс містить ці етапи лише для необʼєднаних записів, тобто під час вирішення конфліктів. Див. розділ git-read-tree[1] "3-стороннє обʼєднання" для отримання детальної інформації.

-0

Оминути вивід diff для необʼєднаних записів та показати лише "Не обʼєднано". Можна використовувати лише під час порівняння робочого дерева з індексом.

<шлях>...

Параметри <шлях>, якщо їх задано, використовуються для обмеження відмінностей (diff) до вказаних шляхів (ви можете вказати імена тек та отримати відмінності для всіх файлів у них).

Формат виводу RAW

Формат необробленого виводу з git-diff-index, git-diff-tree, git-diff-files та git diff --raw дуже схожий.

Усі ці команди порівнюють два набори елементів; різниця полягає в тому, що саме порівнюється:

git-diff-index <tree-ish>

порівнює <tree-ish> та файли у файловій системі.

git-diff-index --cached <tree-ish>

порівнює <tree-ish> та індекс.

git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<pattern>...]

порівнює дерева, вказані у двох аргументах.

git-diff-files [<pattern>...]

порівнює індекс та файли у файловій системі.

Команда git-diff-tree починає вивід з виводу хешу того, що порівнюється. Після цього всі команди виводять по одному рядку на кожен змінений файл.

Рядок виводу форматується таким чином:

in-place edit  :100644 100644 bcd1234 0123456 M file0
copy-edit      :100644 100644 abcd123 1234567 C68 file1 file2
rename-edit    :100644 100644 abcd123 1234567 R86 file1 file3
create         :000000 100644 0000000 1234567 A file4
delete         :100644 000000 1234567 0000000 D file5
unmerged       :000000 000000 0000000 0000000 U file6

Тобто, зліва направо:

  1. двокрапка (:).

  2. режим для "src"; 000000, у випадку створення (create) чи коли дані не обʼєднані (unmerged).

  3. пробіл.

  4. режим для "dst"; 000000, у випадку вилучення (delete) чи коли дані не обʼєднані (unmerged).

  5. пробіл.

  6. sha1 для "src"; 0{40} у випадку створення (create) чи коли дані не обʼєднані (unmerged).

  7. пробіл.

  8. sha1 для "dst"; 0{40} у випадку видалення (delete) чи коли дані не обʼєднані (unmerged) або "робоче дерево не синхронізоване з індексом".

  9. пробіл.

  10. статус, за яким йде необовʼязкове значення «оцінки».

  11. символ табуляції або NUL, коли використовується опція -z.

  12. шлях для "src"

  13. символ табуляції або NUL, коли використовується опція -z; існує лише для C або R.

  14. шлях для "dst"; існує лише для C або R.

  15. LF або NUL, коли використовується опція -z, для завершення рядка.

Можливі літери позначення статусу:

  • A: додавання файлу

  • C: копіювання файлу в новий

  • D: видалення файлу

  • M: зміна вмісту або режиму файлу

  • R: перейменування файлу

  • T: зміна типу файлу (звичайний файл, символічне посилання або субмодуль)

  • U: файл не обʼєднано (ви повинні завершити об’єднання, перш ніж його можна буде зафіксувати)

  • X: тип зміни "невідомий" (скоріше за все, це помилка, будь ласка, повідомте про неї)

За літерами статусу C та R завжди йде оцінка (що позначає відсоток подібності між джерелом та цільовим обʼєктом переміщення або копіювання). За літерою статусу M може йти оцінка (що позначає відсоток відмінності) для перезаписів файлів.

SHA1 для "dst" відображається як суцільні нулі, якщо файл у файловій системі не синхронізований з індексом.

Приклад:

:100644 100644 5be4a4a 0000000 M file.c

Без опції -z шляхи з "незвичайними" символами беруться в лапки, як про це йдеться в поясненні для змінної конфігурації core.quotePath (див. git-config[1]). При використанні -z ім’я файлу виводиться дослівно, а рядок завершується байтом NUL.

формат diff для злиття

git-diff-tree, git-diff-files та git-diff --raw можуть приймати опцію -c або --cc для генерації виводу diff також для комітів злиття. Вивід відрізняється від формату, описаного вище, наступним чином:

  1. для кожного з батьків є двокрапка

  2. є більше режимів "src" та "src" sha1

  3. статус — це обʼєднані символи статусу для кожного батьківського елемента

  4. немає додаткового числа "оцінки"

  5. шлях(и) до файлу, розділені табуляцією

Для -c та --cc відображається лише кінцевий шлях, навіть якщо файл було перейменовано на будь-якому етапі історії. З --combined-all-paths відображається назва шляху в кожному батьківському файлі, а потім назва шляху в коміті злиття.

Приклади для -c та --cc без --combined-all-paths:

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM	desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM	bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR	phooey.c

Приклади, коли --combined-all-paths додається до -c або --cc:

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM	desc.c	desc.c	desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM	foo.sh	bar.sh	bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR	fooey.c	fuey.c	phooey.c

Зверніть увагу, що «обʼєднані відмінності» показують лише файли, які були змінені з усіх батьківських файлів.

Генерація тексту латки за допомогою -p

Виконання команд git-diff[1], git-log[1], git-show[1], git-diff-index[1], git-diff-tree[1] або git-diff-files[1] з опцією -p створює текст латки. Ви можете налаштувати створення тексту латки за допомогою змінних середовища GIT_EXTERNAL_DIFF та GIT_DIFF_OPTS (див. git[1]), а також атрибута diff (див. gitattributes[5]).

Текст, який ви отримаєте з використанням опції -p, дещо відрізняється від традиційного формату diff:

  1. Йому передує заголовок "git diff", який виглядає так:

    diff --git a/file1 b/file2

    Імена файлів a/ та b/ однакові, якщо не йдеться про перейменування/копіювання. Зокрема, навіть для створення або видалення, /dev/null не використовується замість імен файлів a/ або b/.

    Коли йдеться про перейменування/копіювання, file1 та file2 показують відповідно назву вихідного файлу перейменування/копіювання та назву файлу, який створюється в результаті перейменування/копіювання.

  2. За ним йде один або декілька рядків розширеного заголовка:

    старий режим <режим>
    новий режим <режим>
    видалений файл режим <режим>
    новий файл режим <режим>
    копіювати з <шлях>
    копіювати до <шлях>
    перейменувати з <шлях>
    перейменувати в <шлях>
    індекс подібності <номер>
    індекс несхожості <номер>
    індекс <хеш>..<хеш> <режим>

    Режими файлів <режим> виводиться у вигляді 6-значні вісімкових чисел, включаючи тип файлу та біти прав доступу до файлу.

    Імена шляхів у розширених заголовках не містять префіксів a/ та b/.

    Індекс подібності — це відсоток незмінених рядків, а індекс несхожості — відсоток змінених рядків. Це округлене до меншого значення ціле число, за яким стоїть знак відсотка. Значення індексу подібності 100% таким чином зарезервовано для двох однакових файлів, тоді як несхожість 100% означає, що жоден рядок зі старого файлу не потрапив до нового.

    Рядок індексу містить імена блоб-обʼєктів до та після зміни. <Режим> додається, якщо режим файлу не змінюється; інакше окремі рядки вказують на старий та новий режими.

  3. Шляхи з «незвичайними» символами беруться в лапки, як це пояснено для змінної конфігурації core.quotePath (див. git-config[1]).

  4. Усі файли file1 у виводі посилаються на файли до коміту, а всі файли file2 посилаються на файли після коміту. Неправильно застосовувати кожну зміну до кожного файлу послідовно. Наприклад, ця латка поміняє місцями a та b:

    diff --git a/a b/b
    rename from a
    rename to b
    diff --git a/b b/a
    rename from b
    rename to a
  5. У заголовках фрагмента згадується назва функції, до якої він застосовується. Див. "Визначення власного заголовка фрагмента" в gitattributes[5] для отримання детальної інформації про те, як налаштувати це для конкретних мов (програмування).

Формат обʼєднаних відмінностей (combined diff)

Будь-яка команда, що генерує відмінності, може використовувати опцію -c або --cc для створення «обʼєднаних відмінностей» під час показу злиття. Це стандартний формат під час показу злиття за допомогою git-diff[1] або git-show[1]. Також зауважте, що ви можете надати відповідну опцію --diff-merges будь-якій із цих команд, щоб примусово генерувати відмінності у певному форматі.

Формат «обʼєднаних відмінностей» виглядає так:

diff --combined describe.c
index fabadb8,cc95eb0..4866510
--- a/describe.c
+++ b/describe.c
@@@ -98,20 -98,12 +98,20 @@@
	return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
  }

- static void describe(char *arg)
 -static void describe(struct commit *cmit, int last_one)
++static void describe(char *arg, int last_one)
  {
 +	unsigned char sha1[20];
 +	struct commit *cmit;
	struct commit_list *list;
	static int initialized = 0;
	struct commit_name *n;

 +	if (get_sha1(arg, sha1) < 0)
 +		usage(describe_usage);
 +	cmit = lookup_commit_reference(sha1);
 +	if (!cmit)
 +		usage(describe_usage);
 +
	if (!initialized) {
		initialized = 1;
		for_each_ref(get_name);
  1. Йому передує заголовок "git diff", який виглядає ось так (коли використовується опція -c):

    diff --combined file

    або ось так (коли використовується опція --cc):

    diff --cc file
  2. За ним йде один або декілька розширених рядків заголовка (у цьому прикладі показано злиття з двома батьківськими обʼєктами):

    індекс <hash>,<hash>..<hash>
    режим <mode>,<mode>..<mode>
    новий файловий режим <mode>
    режим видаленого файлу <mode>,<mode>

    Рядок mode <mode>,<mode>..<mode> зʼявляється лише тоді, коли хоча б один з <mode> відрізняється від решти. Розширені заголовки з інформацією про виявлене переміщення контенту (перейменування та виявлення копіювання) спроєктовані для роботи з diff двох <деревоподібних> обʼєктів і не використовуються форматом combined diff.

  3. Далі йде дворядковий заголовок from-file/to-file:

    --- a/файл
    +++ б/файл

    Подібно до дворядкового заголовка для традиційного «уніфікованого» формату diff, /dev/null використовується для повідомлення про створені або видалені файли.

    Однак, якщо вказано опцію --combined-all-paths, замість дворядкового заголовка from-file/to-file ви отримаєте N+1 рядковий заголовок from-file/to-file, де N — кількість батьківських обʼєктів у коміті злиття:

    --- a/файл
    --- a/файл
    --- a/файл
    +++ б/файл

    Цей розширений формат може бути корисним, якщо активовано виявлення перейменування або копіювання, щоб дозволити вам бачити оригінальну назву файлу в різних батьківських обʼєктах.

  4. Формат заголовка фрагмента змінено, щоб запобігти випадковому передаванню його до patch -p1. Формат обʼєднаних відмінностей був створений для перегляду змін у комітах злиття та не призначався для їх впровадження. Зміна подібна до зміни в розширеному заголовку index:

    @@@ <from-file-range> <from-file-range> <to-file-range> @@@

    У заголовку фрагмента є (кількість батьківських обʼєктів + 1) символи @ для формату обʼєднаних відмінностей.

На відміну від традиційного «уніфікованого» формату відмінностей, який показує два файли A та B з одним стовпцем із префіксом - (мінус — зʼявляється в A, але видалений в B), + (плюс — відсутній в A, але доданий до B) або " " (пробіл — без змін), цей формат порівнює два або більше файлів file1, file2,…​ з одним файлом X та показує, чим X відрізняється від кожного з fileN. Один стовпець для кожного з fileN додається до рядка виводу, щоб відзначити, чим рядок X відрізняється від нього.

Символ - у стовпці N означає, що рядок зʼявляється у файлі N, але не зʼявляється в результаті. Символ + у стовпці N означає, що рядок зʼявляється в результаті, а файл N не містить цього рядка (іншими словами, рядок було додано з погляду батьківського обʼєкта).

У наведеному вище прикладі виводу сигнатуру функції було змінено в обох файлах (отже, два видалення - з файлу file1 та файлу file2, плюс ++, що означає, що один доданий рядок не відображається ні у файлі file1, ні у файлі file2). Також, вісім інших рядків є такими як у файлі file1, але не відображаються у файлі file2 (отже, з префіксом +).

Коли цей формат виводиться за допомогою команди git diff-tree -c, він порівнює батьківські обʼєкти коміту злиття з результатом злиття (тобто file1..fileN є батьками). У виводі за допомогою команди git diff-files -c, він порівнює два нерозвʼязані батьківські обʼєкти злиття з файлом робочого дерева (тобто file1 — це stage 2, також відомий як "наша версія", file2 — це stage 3, також відомий як "їхня версія").

інші формати diff

Опція --summary описує щойно додані, видалені, перейменовані та скопійовані файли. Опція --stat додає граф diffstat(1) до виводу. Ці опції можна комбінувати з іншими опціями, такими як -p, і вони призначені для використання людиною.

Під час відображення змін, що передбачають перейменування або копіювання, опція --stat форматує імена шляхів у стислому вигляді, об’єднуючи спільні префікси та суфікси. Наприклад, зміна, що передбачає переміщення файлу arch/i386/Makefile до arch/x86/Makefile із внесенням 4 рядків, буде відображатися так:

arch/{i386 => x86}/Makefile    |   4 +--

Опція --numstat надає інформацію diffstat(1), але вона розроблена для легшого використання машиною. Запис у виводі --numstat виглядає так:

1	2	README
3	1	arch/{i386 => x86}/Makefile

Тобто, зліва направо:

  1. кількість доданих рядків;

  2. символ табуляції;

  3. кількість видалених рядків;

  4. символ табуляції;

  5. шлях (можливо, з інформацією про перейменування/копіювання);

  6. символ переходу на новий рядок.

Коли активовано опцію виводу -z, вивід форматується таким чином:

1	2	README NUL
3	1	NUL arch/i386/Makefile NUL arch/x86/Makefile NUL

Тобто:

  1. кількість доданих рядків;

  2. символ табуляції;

  3. кількість видалених рядків;

  4. символ табуляції;

  5. NUL (існує лише якщо перейменовано/скопійовано);

  6. імʼя шляху в первісному образі;

  7. NUL (існує лише якщо перейменовано/скопійовано);

  8. шлях у postimage (існує лише якщо перейменовано/скопійовано);

  9. NUL.

Додатковий символ NUL перед шляхом до оригінального файлу у випадку перейменування призначений для того, щоб скрипти, які зчитують вихідні дані, могли визначити, чи поточний запис, що зчитується, є записом з одним шляхом, чи записом про перейменування/копіювання, не зчитуючи дані далі. Після зчитування рядків про додані та видалені файли зчитування до символу NUL дасть імʼя шляху, але якщо це NUL, запис міститиме два шляхи.

ПРИКЛАДИ

Різні способи перевірки робочого дерева
$ git diff            (1)
$ git diff --cached   (2)
$ git diff HEAD       (3)
$ git diff AUTO_MERGE (4)
  1. Зміни в робочому дереві ще не підготовлені для наступного коміту.

  2. Зміни між індексом та вашим останнім комітом; що ви б зафіксували, якби запустили git commit без опції -a.

  3. Зміни в робочому дереві з моменту вашого останнього коміту; що ви б зафіксували, якби запустили git commit -a

  4. Зміни в робочому дереві, які ви внесли для вирішення текстових конфліктів на даний момент.

Порівняння з довільними коммітами
$ git diff test            (1)
$ git diff HEAD -- ./test  (2)
$ git diff HEAD^ HEAD      (3)
  1. Замість використання вершини поточної гілки, порівняння з вершиною гілки «test».

  2. Замість порівняння з вершиною гілки "test", порівняння з вершиною поточної гілки, але тільки для файлу "test".

  3. Порівняння версії перед останнім комітом та останнім комітом.

Порівняння гілок
$ git diff topic master    (1)
$ git diff topic..master   (2)
$ git diff topic...master  (3)
  1. Зміни між вершинами гілок topic та master.

  2. Те саме, що й вище.

  3. Зміни, що відбулися в гілці master з моменту відгалуження гілки topic.

Обмеження виводу diff
$ git diff --diff-filter=MRC            (1)
$ git diff --name-status                (2)
$ git diff arch/i386 include/asm-i386   (3)
  1. Показує лише модифікацію, перейменування та копіювання, але не додавання чи видалення.

  2. Показує лише назви та природу змін, але не фактичний вивід diff.

  3. Обмежує вивід diff вказаними субдеревами.

Обробка виводу diff
$ git diff --find-copies-harder -B -C  (1)
$ git diff -R                          (2)
  1. Витрачати додаткові цикли на пошук перейменованих файлів, копій та повністю переписаних файлів (це дуже витратно по ресурсах).

  2. Виводить diff у зворотньому порядку.

КОНФІГУРАЦІЯ

Все, що знаходиться нижче цього рядка в цьому розділі, вибірково включено з документації git-config[1]. Вміст такий самий, як і там:

diff.autoRefreshIndex

Під час використання git diff для порівняння з файлами робочого дерева зміни, що стосуються лише статистичних даних, не розглядаються як зміни. Натомість без попередження виконується команда git update-index --refresh, щоб оновити кешовану інформацію про статистику для шляхів, вміст яких у робочому дереві збігається з вмістом індексу. Типовим значенням цієї опції є true. Зверніть увагу, що це впливає лише на git diff Porcelain, а не на команди diff нижчого рівня, такі як git diff-files.

diff.dirstat

Список параметрів --dirstat, розділених комами, що визначають типову поведінку параметра --dirstat для git diff та подібних команд. Стандартні значення можна перевизначити в командному рядку (використовуючи --dirstat=<param>,...). Стандартне значення, (якщо не змінене за допомогою diff.dirstat) це changes,noncumulative,3. Доступні наступні параметри:

changes

Обчислює показники dirstat шляхом підрахунку рядків, які були видалені з вихідного файлу або додані до файлу призначення. При цьому не враховується кількість переміщень коду всередині самого файлу. Іншими словами, перегрупування рядків у файлі не враховується так само, як інші зміни. Це стандартна поведінка, якщо параметр не вказано.

lines

Обчислює показники dirstat, виконуючи звичайний аналіз відмінностей на основі рядків та підсумовуючи кількість видалених/доданих рядків. (Для бінарних файлів рахує 64-байтові блоки, оскільки бінарні файли не мають природного поняття рядків). Такий підхід --dirstat є більш ресурсоємним, ніж підхід changes, але він враховує перегруповані рядки у файлі нарівні з іншими змінами. Отриманий результат відповідає тому, що ви отримуєте від інших опцій --*stat.

files

Обчислює показники dirstat, рахуючи кількість змінених файлів. Кожен змінений файл має однакову вагу в аналізі dirstat. Це найменш ресурсомісткий варіант роботи опції --dirstat, оскільки він взагалі не вимагає аналізу вмісту файлів.

cumulative

Також підраховуються зміни у дочірній теці батьківської теки. Зверніть увагу, що при використанні параметра cumulative сума вказаних відсотків може перевищувати 100%. Стандартну поведінку (без накопичення) можна вказати за допомогою параметра noncumulative.

<limit>

Цілочисельний параметр визначає граничний відсоток (стандартно — 3%). Теки, що вносять менше змін, ніж цей відсоток, не відображаються у виводі.

Приклад: Наступний код рахує змінені файли, ігноруючи теки з кількістю змінених файлів менше ніж 10% від загальної кількості, та накопичуючи кількість дочірніх тек у батьківських теках: files,10,cumulative.

diff.statNameWidth

Обмежує ширину частини імені файлу у виводі --stat. Якщо встановлено, застосовується до всіх команд, що генерують вивід --stat, окрім format-patch.

diff.statGraphWidth

Обмежує ширину частини графу у виводі --stat. Якщо встановлено, застосовується до всіх команд, що генерують вивід --stat, окрім format-patch.

diff.context

Генерує відмінності з <n> рядками контексту замість стандартних 3-х. Це значення перевизначається опцією -U.

diff.interHunkContext

Показує контекст між відмінностями фрагментів (diff hanks) до вказаної кількості рядків, обʼєднуючи таким чином ті ханфрагментии, що знаходяться поруч. Це значення є стандартним для параметра командного рядка --inter-hunk-context.

diff.external

Якщо ця змінна конфігурації встановлена, порівняння виконується не за допомогою внутрішнього механізму, а за допомогою вказаної команди. Цю налаштування можна замінити за допомогою змінної середовища GIT_EXTERNAL_DIFF. Команда викликається з параметрами, описаними в розділі «git Diffs» у документації git[1]. Примітка: якщо ви хочете використовувати зовнішню програму порівняння лише для частини ваших файлів, вам може знадобитися gitattributes[5].

diff.trustExitCode

Якщо для цього булевого значення встановлено значення true, то команда diff.external повинна повертати код завершення 0, якщо вона вважає вхідні файли однаковими, або 1, якщо вважає їх різними, як і команда diff(1). Якщо встановлено значення false (що є стандартним значенням), то команда повинна повертати код завершення 0 незалежно від того, чи файли однакові. Будь-який інший код завершення змушує Git повідомити про фатальну помилку.

diff.ignoreSubmodules

Встановлює стандартне значення параметра --ignore-submodules. Зверніть увагу, що це впливає лише на Porcelain`git diff`, а не на команди diff нижчого рівня, такі як git diff-files. Команди git checkout та git switch також враховують це налаштування під час показу змін, що не зафіксовані. Встановлення значення all вимикає вивід підсумкової інформації субмодулів, яка зазвичай показується командами git commit та git status, коли встановлено status.submoduleSummary, якщо це не замінено за допомогою опції командного рядка --ignore-submodules. На команди git submodule це налаштування не впливає. Стандартно встановлено значення untracked, щоб ігнорувати будь-які не відстежувані субмодулі.

diff.mnemonicPrefix

Якщо встановлено, git diff використовує пару префіксів, яка відрізняється від стандартних a/ та b/, залежно від того, що порівнюється. Коли ця конфігурація діє, зворотний вивід diff також змінює порядок префіксів:

git diff

порівнює індекс (i) та робоче дерево (w);

git diff HEAD

порівнює коміт (c) та робоче дерево (w);

git diff --cached

порівнює коміт (c) та індекс (i);

git diff HEAD:<файл1> <файл2>

порівнює об’єкт (o) та елемент робочого дерева (w);

git diff --no-index <a> <b>

порівнює дві не-git-речі <a> та <b>.

diff.noPrefix

Якщо встановлено, git diff не показує жодного префікса джерела чи призначення.

diff.srcPrefix

Якщо встановлено, git diff використовуватиме цей префікс джерела. Стандартно a/.

diff.dstPrefix

Якщо встановлено, git diff використовуватиме цей префікс призначення. Стандартно b/.

diff.relative

Якщо встановлено значення true, git diff не показує зміни поза текою та показує шляхи відносно поточної теки.

diff.orderFile

Файл, що вказує, як упорядкувати файли в межах diff. Дивіться опис параметра -O для отримання детальної інформації. Якщо diff.orderFile є відносним шляхом, він розглядається як відносний до вершини робочого дерева.

diff.renameLimit

Кількість файлів, які слід врахувати під час вичерпного аналізу на наявність дублікатів або перейменувань; відповідає опції -l команди git diff. Якщо значення не вказано, використовується стандартне значення — 1000. Цей параметр не діє, якщо виявлення перейменувань вимкнено.

diff.renames

Чи виявляє Git перейменування та яким чином. Якщо встановлено значення false, виявлення перейменувань вимкнено. Якщо встановлено значення true, увімкнено базове виявлення перейменувань. Якщо встановлено значення copies або copy, Git також виявлятиме копії. Стандартне значення — true. Зверніть увагу, що це впливає лише на git diff Porcelain, такі як git-diff[1] та git-log[1], а не на команди нижчого рівня, такі як git-diff-files[1].

diff.suppressBlankEmpty

Булеве значення, яке пригнічує стандартну поведінку, що передбачає вставку пробілу перед кожним порожнім рядком виводу. Стандартне значення — false.

diff.submodule

Визначає формат, у якому показуються відмінності в субмодулях. Формат short показує лише імена комітів на початку та в кінці діапазону. Формат log перелічує коміти в діапазоні так само як це робить summary у linkgit:git-submodule[1]. Формат diff показує вбудований порівняльний вигляд зміненого вмісту субмодуля. Стандартним є short.

diff.wordRegex

Розширений регулярний вираз POSIX, що використовується для визначення поняття «слово» під час обчислення відмінностей пословно. Послідовності символів, що відповідають цьому регулярному виразу, є «словами», а всі інші символи — це ігноровані пробіли.

diff.<driver>.command

Команда власного драйвера diff. Див. gitattributes[5] для отримання детальної інформації.

diff.<driver>.trustExitCode

Якщо для цього булевого значення встановлено значення true, то команда diff.<driver>.command повинна повертати код завершення 0, якщо вона вважає вхідні файли однаковими, або 1, якщо вважає їх різними, як і diff(1). Якщо встановлено значення false (що є стандартним значенням), то команда повинна повертати код завершення 0 незалежно від того, чи файли однакові. Будь-який інший код завершення змушує Git повідомити про фатальну помилку.

diff.<driver>.xfuncname

Регулярний вираз, який драйвер diff повинен використовувати для розпізнавання заголовка фрагмента. Також може використовуватися вбудований шаблон. Див. gitattributes[5] для отримання детальної інформації.

diff.<driver>.binary

Встановлення для цього параметра значення true змушує драйвер diff обробляти файли як бінарні. Детальніше див. gitattributes[5].

diff.<driver>.textconv

Команда, яку драйвер diff має викликати для створення текстової версії файлу. Результат перетворення використовується для створення зручного для читання diff. Див. gitattributes[5] для отримання детальної інформації.

diff.<driver>.wordRegex

Регулярний вираз, який драйвер diff має використовувати для розділення слів у рядку. Див. gitattributes[5] для отримання детальної інформації.

diff.<driver>.cachetextconv

Встановлення цього параметра в значення true змусить драйвер diff кешувати результати перетворення тексту. Детальніше див. gitattributes[5].

diff.indentHeuristic

Встановлення цього параметра в значення false дозволить вимкнути стандартну евристику, яка зміщує межі фрагментів diff для полегшення читання латок.

diff.algorithm

Вибір алгоритму порівняння. Є наступні варіанти:

default
myers

Базовий алгоритм «жадібного» порівняння. Наразі це типове значення.

minimal

Витрачає додатковий час, щоб переконатися, що отримано найменший можливий diff.

patience

При створенні латок використовується алгоритм «patience diff».

histogram

Цей алгоритм розширює алгоритм «patience» для «підтримки рідкісних загальних елементів».

diff.wsErrorHighlight

Підсвічувати помилки у пробілах у рядках context, old або new у diff. Кілька значень розділяються комою, none скидає попередні значення, default скидає список до new, а all є скороченим варіантом old,new,context. Помилки пробілів підсвічуються кольором color.diff.whitespace. Параметр командного рядка --ws-error-highlight=<kind> замінює це налаштування.

diff.colorMoved

Якщо встановлено дійсне значення <mode> або true, переміщені рядки в diff матимуть інший колір. Детальніше про допустимі режими див. у розділі --color-moved. Якщо просто встановити значення true, буде використано стандартний колірний режим. Коли встановлено значення false, переміщені лінії не забарвлюються.

diff.colorMovedWS

Коли переміщені рядки забарвлюються, наприклад, за допомогою параметра diff.colorMoved, цей параметр контролює режим обробки пробілів. Докладніше про допустимі режими див. у --color-moved-ws у git-diff[1].

GIT

Частина набору git[1]