Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
-
2.51.0
2025-08-18
- 2.48.1 → 2.50.1 no changes
-
2.48.0
2025-01-10
- 2.46.1 → 2.47.3 no changes
-
2.46.0
2024-07-29
- 2.45.4 no changes
-
2.45.3
2024-11-26
- 2.45.1 → 2.45.2 no changes
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.4 no changes
-
2.44.0
2024-02-23
- 2.43.1 → 2.43.7 no changes
-
2.43.0
2023-11-20
- 2.42.2 → 2.42.4 no changes
-
2.42.1
2023-11-02
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 no changes
-
2.41.0
2023-06-01
- 2.40.1 → 2.40.4 no changes
-
2.40.0
2023-03-12
- 2.37.3 → 2.39.5 no changes
-
2.37.2
2022-08-11
- 2.36.1 → 2.37.1 no changes
-
2.36.0
2022-04-18
- 2.35.1 → 2.35.8 no changes
-
2.35.0
2022-01-24
- 2.34.1 → 2.34.8 no changes
-
2.34.0
2021-11-15
- 2.33.1 → 2.33.8 no changes
-
2.33.0
2021-08-16
- 2.32.1 → 2.32.7 no changes
-
2.32.0
2021-06-06
- 2.31.1 → 2.31.8 no changes
-
2.31.0
2021-03-15
- 2.30.1 → 2.30.9 no changes
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 no changes
-
2.29.0
2020-10-19
- 2.28.1 no changes
-
2.28.0
2020-07-27
- 2.25.2 → 2.27.1 no changes
-
2.25.1
2020-02-17
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 no changes
-
2.24.0
2019-11-04
- 2.22.1 → 2.23.4 no changes
-
2.22.0
2019-06-07
- 2.21.1 → 2.21.4 no changes
-
2.21.0
2019-02-24
- 2.20.1 → 2.20.5 no changes
-
2.20.0
2018-12-09
- 2.19.1 → 2.19.6 no changes
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 no changes
-
2.18.0
2018-06-21
- 2.17.1 → 2.17.6 no changes
-
2.17.0
2018-04-02
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
- 2.10.5 no changes
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.7.6 no changes
-
2.6.7
2017-05-05
-
2.5.6
2017-05-05
-
2.4.12
2017-05-05
-
2.3.10
2015-09-28
- 2.1.4 → 2.2.3 no changes
-
2.0.5
2014-12-17
СИНОПСИС
git diff-index [-m] [--cached] [--merge-base] [<common-diff-options>] <tree-ish> [<path>…]
ОПИС
Порівняйте вміст і режим блобів, знайдених в об’єкті дерева, з відповідними відстежуваними файлами в робочому дереві або з відповідними шляхами в індексі. Якщо присутні аргументи <шлях>, порівнюйте лише шляхи, що відповідають цим шаблонам. В іншому випадку порівнюються всі відстежувані файли.
ОПЦІЇ
-
-p
-
-u
-
--patch
-
Згенерувати патч (див. Генерація тексту патча за допомогою -p).
-
-s
-
--no-patch
-
Придушити весь вивід з механізму різниці. Корисно для команд типу
git
show
, які показують патч за замовчуванням, щоб приглушити їхній вивід або скасувати дію опцій типу--patch
,--stat
, зазначених раніше в командному рядку в псевдонімі. -
-U
<n> -
--unified=
<n> -
Генерувати різниці з <n> рядками контексту замість звичайних трьох. Implies
--patch
. -
--output=
<файл> -
Вивід у певний файл замість stdout.
-
--output-indicator-new=
<char> -
--output-indicator-old=
<char> -
--output-indicator-context=
<char> -
Вкажіть символ, який використовується для позначення нових, старих або контекстних рядків у згенерованому патчі. Зазвичай це
+
,-
та '' відповідно. -
--raw
-
Згенерувати різницю у необробленому форматі. Це значення за замовчуванням.
-
--patch-with-raw
-
Синонім до слова
-p
--raw
. -
--indent-heuristic
-
Увімкнути евристику, яка зсуває межі різниці фрагментів, щоб зробити патчі легшими для читання. Це значення за замовчуванням.
-
--no-indent-heuristic
-
Вимкнути евристику відступів.
-
--minimal
-
Витратьте додатковий час, щоб переконатися, що отримано найменшу можливу різницю.
-
--patience
-
Згенеруйте різницю за допомогою алгоритму "різниця терпіння".
-
--histogram
-
Згенеруйте різницю за допомогою алгоритму "різниця гістограми".
-
--anchored=
<text> -
Згенеруйте різницю за допомогою алгоритму "закріпленої різниці".
Цей параметр можна вказати більше одного разу.
Якщо рядок існує як у джерелі, так і в пункті призначення, існує лише один раз і починається з <текст>, цей алгоритм намагається запобігти його появі як видалення або додавання у виводі. Він внутрішньо використовує алгоритм "різниці терпіння".
-
--diff-algorithm=
(patience
|minimal
|histogram
|myers
) -
Виберіть алгоритм порівняння. Варіанти такі:
-
default
-
myers
-
Базовий алгоритм жадібного різниці. Наразі це алгоритм за замовчуванням.
-
minimal
-
Витратьте додатковий час, щоб переконатися, що отримано найменшу можливу різницю.
-
patience
-
Використовуйте алгоритм "різниця терпіння" під час створення патчів.
-
histogram
-
Цей алгоритм розширює алгоритм терпіння для «підтримки рідко зустрічаються поширених елементів».
Наприклад, якщо ви налаштували змінну
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
-
Вивести стислий виклад розширеної інформації заголовка, такої як створення або видалення файлів ("new" або "gone", необов’язково
+l
, якщо це символічне посилання) та зміни режиму (+x
або-x
для додавання або видалення виконуваного біта відповідно) у diffstat. Інформація розміщується між частиною імені файлу та частиною графу. Має на увазі--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
. -
--no-color
-
Вимкніть кольорову різницю. Це те саме, що
--color=never
. -
--color-moved
[=
<режим>] -
Переміщені рядки коду забарвлюються по-різному. <режим> за замовчуванням має значення
no
, якщо опція не вказана та доzebra
, якщо вказано опцію без режиму. Режим має бути одним із таких:-
no
-
Переміщені рядки не виділяються.
-
default
-
Є синонімом слова «зебра». У майбутньому це може змінитися на більш розумний режим.
-
plain
-
Будь-який рядок, доданий в одному місці та видалений в іншому, буде забарвлений за допомогою
color.diff.newMoved
. Аналогічно,color.diff.oldMoved
буде використано для видалених рядків, доданих деінде в різниці. Цей режим виявляє будь-який переміщений рядок, але він не дуже корисний під час перегляду, щоб визначити, чи блок коду був переміщений без перестановки. -
blocks
-
Блоки переміщеного тексту довжиною щонайменше 20 буквено-цифрових символів виявляються жадібно. Виявлені блоки зафарбовуються кольором
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
. Ці режими можна вказати у вигляді списку, розділеного комами:-
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>, щоб визначити, що таке слово, замість того, щоб вважати словом рядки, що не є пробілами. Також мається на увазі
--word-diff
, якщо ця опція ще не була ввімкнена.Кожен неперекриваючийся збіг <regex> вважається словом. Будь-що між цими збігами вважається пробілом та ігнорується(!) для цілей пошуку відмінностей. Ви можете додати |[
^
[:space:
]] до вашого регулярного виразу, щоб переконатися, що він відповідає всім символам, які не є пробілами. Збіг, що містить символ нового рядка, непомітно обрізається(!) на місці нового рядка.Наприклад,
--word-diff-regex=.
трактуватиме кожен символ як слово та, відповідно, показуватиме відмінності посимвольно.Регулярний вираз також можна встановити за допомогою драйвера різниці або параметра конфігурації, див. gitattributes[5] або git-config[1]. Його явне вказівка перевизначає будь-який драйвер різниці або параметр конфігурації. Драйвери різниці перевизначають параметри конфігурації.
-
--color-words
[=
<regex>] -
Еквівалентно
--word-diff=color
плюс (якщо було вказано регулярний вираз) --word-diff-regex=<регулярний вираз>. -
--no-renames
-
Вимкніть виявлення перейменування, навіть якщо у файлі конфігурації це встановлено за замовчуванням.
-
--
[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
. Implies--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
.Порядок виведення визначається порядком шаблонів глобусів у <orderfile>. Усі файли зі шляхами, що відповідають першому шаблону, виводяться першими, усі файли зі шляхами, що відповідають другому шаблону (але не першому), виводяться наступними і так далі. Усі файли зі шляхами, що не відповідають жодному шаблону, виводяться останніми, ніби в кінці файлу є неявний шаблон збігу всіх. Якщо кілька шляхів мають однаковий ранг (вони відповідають одному шаблону, але не попереднім шаблонам), їхній порядок виведення відносно один одного є звичайним порядком.
<файл_замовлення> аналізується наступним чином:
-
Пусті рядки ігноруються, тому їх можна використовувати як роздільники для зручності читання.
-
Рядки, що починаються з хеш-символа ("
#
"), ігноруються, тому їх можна використовувати для коментарів. Додайте зворотну скісну риску ("\") на початок шаблону, якщо він починається з хеш-символа. -
Кожен інший рядок містить один візерунок.
Шаблони мають той самий синтаксис і семантику, що й шаблони, що використовуються для
fnmatch
(3) без прапорцяFNM_PATHNAME
, за винятком того, що ім’я шляху також відповідає шаблону, якщо видалення будь-якої кількості компонентів кінцевого імені шляху відповідає шаблону. Наприклад, шаблон "foo*bar
" відповідає "fooasdfbar
" та "foo/bar/baz/asdf
", але не "foobarx
". -
-
--skip-to=
<файл> -
--rotate-to=
<файл> -
Видалити файли перед іменем <файл> з виводу (тобто «перейти до») або перемістити їх у кінець виводу (тобто «повернути до»). Ці опції були винайдені в основному для використання команди
git
difftool
і можуть бути не дуже корисними в іншому випадку. -
-R
-
Поміняти місцями два вхідні дані; тобто показати відмінності між індексним або дисковим файлом та вмістом дерева.
-
--relative
[=
<шлях>] -
--no-relative
-
Під час запуску з підкаталогу проєкту можна наказати програмі виключати зміни за межами каталогу та показувати шляхи відносно нього за допомогою цієї опції. Коли ви не перебуваєте в підкаталозі (наприклад, у чистому репозиторії), ви можете вказати, відносно якого підкаталогу робити вивід, вказавши <шлях> як аргумент.
--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=<регулярний вираз>
-
Ігнорувати зміни, усі рядки яких відповідають <regex>. Цей параметр можна вказувати більше одного разу.
-
--inter-hunk-context=
<number> -
Показує контекст між різницями (diff hanks), до вказаної <кількості> рядків, таким чином об’єднуючи ханки, що знаходяться близько один до одного. За замовчуванням використовується значення
diff.interHunkContext
або 0, якщо параметр конфігурації не встановлено. -
-W
-
--function-context
-
Показувати всю функцію як рядки контексту для кожної зміни. Назви функцій визначаються так само, як
git
diff
визначає заголовки патч-хунк (див. "Визначення власного заголовка hunk" у 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
-
Дозволити виконання зовнішнього допоміжного засобу різниці. Якщо ви встановлюєте зовнішній драйвер різниці за допомогою gitattributes[5], вам потрібно використовувати цю опцію з git-log[1] та подібними.
-
--no-ext-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> -
Показати вказане джерело <префікс> замість "a/".
-
--dst-prefix=
<prefix> -
Показувати вказаний пункт призначення <префікс> замість "b/".
-
--no-prefix
-
Не показувати жодного префікса джерела чи призначення.
-
--default-prefix
-
Використовуйте префікси джерела та призначення за замовчуванням ("a/" та "b/"). Це замінює змінні конфігурації, такі як
diff.noprefix
,diff.srcPrefix
,diff.dstPrefix
таdiff.mnemonicPrefix
(див. git-config[1]). -
--line-prefix=
<prefix> -
Додайте додатковий <префікс> до кожного рядка виводу.
-
--ita-invisible-in-index
-
За замовчуванням записи, додані за допомогою
git
add
-N
, відображаються як існуючий порожній файл уgit
diff
та як новий файл уgit
diff
--cached
. Ця опція робить запис відображатися як новий файл уgit
diff
та як неіснуючий уgit
diff
--cached
. Цю опцію можна скасувати за допомогою--ita-visible-in-index
. Обидва параметри є експериментальними та можуть бути видалені в майбутньому.
Для більш детального пояснення цих поширених опцій див. також gitdiffcore[7].
- <tree-ish>
-
Ідентифікатор об’єкта дерева, з яким потрібно порівняти.
- --cached
-
Не враховуйте файл на диску взагалі.
- --merge-base
-
Замість безпосереднього порівняння <tree-ish>, використовуйте базу злиття між <tree-ish> та HEAD. <tree-ish> має бути комітом.
- -m
-
За замовчуванням файли, записані в індексі, але не витягнуті з реєстру, повідомляються як видалені. Цей прапорець змушує git diff-index повідомляти, що всі невитягнуті файли є оновленими.
Формат виводу RAW
Формат необробленого виводу з git-diff-index
, git-diff-tree
, git-diff-files
та git
diff
--raw
дуже схожий.
Ці команди порівнюють два набори речей; те, що порівнюється, відрізняється:
-
git-diff-index
<tree-ish> -
порівнює <дерево-подібне> та файли у файловій системі.
-
git-diff-index
--cached
<tree-ish> -
порівнює <деревоподібне> та індекс.
-
git-diff-tree
[-r
] <tree-ish-1> <tree-ish-2> [<pattern>...] -
порівнює дерева, названі двома аргументами.
-
git-diff-files
[<візерунок>...] -
порівнює індекс та файли у файловій системі.
Команда 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
Тобто, зліва направо:
-
a colon.
-
режим для "src"; 000000, якщо створення або роз’єднання.
-
a space.
-
режим для "dst"; 000000, якщо видалення або роз’єднання.
-
a space.
-
sha1 для "src"; 0{40} якщо створення або роз’єднання.
-
a space.
-
sha1 для "dst"; 0{40} якщо видалення, роз’єднання або "робоче дерево не синхронізоване з індексом".
-
a space.
-
статус, а потім необов’язкове число «оцінки».
-
символ табуляції або NUL, коли використовується опція
-z
. -
шлях для "src"
-
символ табуляції або NUL, коли використовується опція
-z
; існує лише для C або R. -
шлях для "dst"; існує лише для C або R.
-
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 також для комітів злиття. Вивід відрізняється від формату, описаного вище, наступним чином:
-
для кожного з батьків є двокрапка
-
є більше режимів "src" та "src" sha1
-
статус — це об’єднані символи статусу для кожного батьківського елемента
-
немає додаткового числа "оцінка"
-
шлях(и) до файлу, розділені табуляцією
Для -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:
-
Йому передує заголовок "git diff", який виглядає так:
diff --git a/file1 b/file2
Імена файлів
a/
таb/
однакові, якщо не йдеться про перейменування/копіювання. Зокрема, навіть для створення або видалення/dev/null
не використовується замість імен файлівa/
абоb/
.Коли йдеться про перейменування/копіювання,
file1
таfile2
показують відповідно назву вихідного файлу перейменування/копіювання та назву файлу, який створюється в результаті перейменування/копіювання. -
За ним йде один або декілька розширених рядків заголовка:
старий режим <режим> новий режим <режим> видалений файл режим <режим> новий файл режим <режим> копіювати з <шлях> копіювати до <шлях> перейменувати з <шлях> перейменувати в <шлях> індекс подібності <номер> індекс несхожості <номер> індекс <хеш>..<хеш> <режим>
Режими файлів <режим> друкуються як 6-значні вісімкові числа, включаючи тип файлу та біти прав доступу до файлу.
Імена шляхів у розширених заголовках не містять префіксів
a/
таb/
.Індекс подібності – це відсоток незмінених рядків, а індекс несхожості – відсоток змінених рядків. Це округлене до меншого значення ціле число, за яким стоїть знак відсотка. Значення індексу подібності 100% таким чином зарезервовано для двох однакових файлів, тоді як несхожість 100% означає, що жоден рядок зі старого файлу не потрапив до нового.
Рядок індексу містить імена блоб-об’єктів до та після зміни. <mode> додається, якщо режим файлу не змінюється; інакше окремі рядки вказують на старий та новий режими.
-
Шляхи з «незвичайними» символами взяті в лапки, як пояснено для змінної конфігурації
core.quotePath
(див. git-config[1]). -
Усі файли
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
-
У заголовках ханка згадується назва функції, до якої застосовується ханк. Див. "Визначення власного заголовка ханка" в gitattributes[5] для отримання детальної інформації про те, як налаштувати це для певних мов.
Комбінований формат різниці
Будь-яка команда, що генерує різниці, може використовувати опцію -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);
-
Йому передує заголовок "git diff", який виглядає ось так (коли використовується опція
-c
):diff --combined file
або ось так (коли використовується опція
--cc
):diff --cc file
-
За ним йде один або декілька розширених рядків заголовка (у цьому прикладі показано злиття з двома батьківськими об’єктами):
індекс <hash>,<hash>..<hash> режим <mode>,<mode>..<mode> новий файловий режим <mode> режим видаленого файлу <mode>,<mode>
Рядок
mode
<mode>,
<mode>..
<mode> з’являється лише тоді, коли хоча б один з <mode> відрізняється від решти. Розширені заголовки з інформацією про виявлене переміщення контенту (перейменування та виявлення копіювання) розроблені для роботи з diff двох <tree-ish> і не використовуються комбінованим форматом diff. -
Далі йде дворядковий заголовок 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/файл +++ б/файл
Цей розширений формат може бути корисним, якщо активовано виявлення перейменування або копіювання, щоб дозволити вам бачити оригінальну назву файлу в різних батьківських об’єктах.
-
Формат заголовка фрагмента змінено, щоб запобігти випадковому передаванню його до
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 — це етап 2, також відомий як "наша версія", file2 — це етап 3, також відомий як "їхня версія").
інші формати різниці
Опція --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
Тобто з, зліва направо:
-
кількість доданих рядків;
-
вкладка;
-
кількість видалених рядків;
-
вкладка;
-
шлях (можливо, з інформацією про перейменування/копіювання);
-
новий рядок.
Коли активовано опцію виводу -z
, вивід форматується таким чином:
1 2 README NUL 3 1 NUL arch/i386/Makefile NUL arch/x86/Makefile NUL
Тобто:
-
кількість доданих рядків;
-
вкладка;
-
кількість видалених рядків;
-
вкладка;
-
NUL (існує лише якщо перейменовано/скопійовано);
-
ім’я шляху в прообразі;
-
NUL (існує лише якщо перейменовано/скопійовано);
-
шлях у postimage (існує лише якщо перейменовано/скопійовано);
-
NUL.
Додатковий NUL
перед шляхом преобразу у випадку перейменування дозволяє скриптам, які читають вивід, визначити, чи є поточний запис, що читається, записом з одним шляхом, чи записом перейменування/копіювання без попереднього читання. Після читання доданих та видалених рядків, читання до NUL
дасть ім’я шляху, але якщо це NUL
, запис покаже два шляхи.
РЕЖИМИ РОБОТИ
Ви можете вибрати, чи повністю довіряти індексному файлу (використовуючи прапорець --cached
), чи попросити логіку diff показувати будь-які файли, які не відповідають стану stat, як "попередньо змінені". Обидві ці операції справді дуже корисні.
КЕШОВАНИЙ РЕЖИМ
Якщо вказано --cached
, це дозволяє запитувати:
покажіть мені відмінності між HEAD та поточним індексом вміст (той, який я б написав за допомогою 'git write-tree')
Наприклад, припустимо, що ви попрацювали над своїм робочим каталогом, оновили деякі файли в індексі та готові до коміту. Ви хочете точно побачити, що ви збираєтеся комітити, без необхідності писати новий об’єкт дерева та порівнювати його таким чином, і для цього ви просто робите
git diff-index --cached HEAD
Приклад: скажімо, я перейменував commit.c
на git-commit.c
та виконав update-index
, щоб це вплинуло на файл індексу. git
diff-files
взагалі нічого не покаже, оскільки файл індексу відповідає моєму робочому каталогу. Але виконання git
diff-index
призведе до:
torvalds@ppc970:~/git> git diff-index --cached HEAD :100644 000000 4161aecc6700a2eb579e842af0b7f22b98443f74 0000000000000000000000000000000000000000 D commit.c :000000 100644 0000000000000000000000000000000000000000 4161aecc6700a2eb579e842af0b7f22b98443f74 A git-commit.c
Ви можете легко побачити, що вищезгадане є перейменуванням.
Фактично, git
diff-index
--cached
має завжди бути повністю еквівалентним фактичному виконанню git write-tree та його порівнянню. За винятком того, що цей варіант набагато зручніший для випадку, коли ви просто хочете перевірити, де ви знаходитесь.
Отже, виконання команди git
diff-index
--cached
дуже корисне, коли ви запитуєте себе: «що я вже позначив для коміту, і яка різниця з попереднім деревом».
НЕКЕШОВАНИЙ РЕЖИМ
Режим «без кешування» використовує інший підхід і потенційно є кориснішим з
двох, оскільки його дії не можна емулювати за допомогою «git write-tree»
«git diff-tree». Таким чином, це режим за замовчуванням. Версія без
кешування ставить таке питання:
Покажіть мені відмінності між HEAD та поточним взяттям дерево - вміст індексу _та_ файли, які не оновлені
що, очевидно, також дуже корисне питання, оскільки воно говорить вам про те, що ви можете закомітити. Знову ж таки, вивід точно відповідає виводу git diff-tree -r, але з невеликою родзинкою.
Різниця полягає в тому, що якщо якийсь файл не відповідає індексу, у нас немає резервного сховища для нього, і ми використовуємо магічний sha1 з "все-нульовим" кодом, щоб це показати. Отже, припустимо, що ви відредагували kernel/sched.c
, але ще не виконали для нього git update-index — з новим станом не пов’язано жодного "об’єкта", і ви отримуєте:
torvalds@ppc970:~/v2.6/linux> git diff-index --abbrev HEAD :100644 100644 7476bb5ba 000000000 M kernel/sched.c
тобто, це показує, що дерево змінилося, і що kernel/sched.c
не оновлений і може містити нові дані. Нульовий sha1 означає, що для отримання справжньої різниці потрібно безпосередньо переглянути об’єкт у робочому каталозі, а не виконувати різницю між об’єктами.
Note
|
Як і інші команди цього типу, git diff-index насправді взагалі не переглядає вміст файлу. Тож, можливо, kernel/sched.c насправді не змінився, а просто ви його торкнулися. У будь-якому випадку, варто зазначити, що вам потрібно виконати git update-index, щоб синхронізувати індекс.
|
Note
|
Ви можете мати різні файли, що відображаються одночасно як «оновлено» та «все ще пошкоджено в робочому каталозі». Ви завжди можете визначити, який файл у якому стані, оскільки файли зі статусом «оновлено» показують дійсний sha1, а файли зі статусом «не синхронізовано з індексом» завжди матимуть спеціальний sha1 з усіма нулями. |
GIT
Частина набору git[1]