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.54.0 no changes
-
2.53.0
2026-02-02
-
2.52.0
2025-11-17
- 2.51.1 → 2.51.2 no changes
-
2.51.0
2025-08-18
- 2.50.1 no changes
-
2.50.0
2025-06-16
- 2.44.1 → 2.49.1 no changes
-
2.44.0
2024-02-23
- 2.43.1 → 2.43.7 no changes
-
2.43.0
2023-11-20
- 2.41.1 → 2.42.4 no changes
-
2.41.0
2023-06-01
- 2.38.1 → 2.40.4 no changes
-
2.38.0
2022-10-02
- 2.34.1 → 2.37.7 no changes
-
2.34.0
2021-11-15
- 2.31.1 → 2.33.8 no changes
- 2.31.0 no changes
- 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.23.1 → 2.28.1 no changes
-
2.23.0
2019-08-16
- 2.16.6 → 2.22.5 no changes
- 2.15.4 no changes
- 2.13.7 → 2.14.6 no changes
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
- 2.9.5 → 2.10.5 no changes
-
2.8.6
2017-07-30
-
2.7.6
2017-07-30
- 2.6.7 no changes
-
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 blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental] [-L <range>] [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>] [--ignore-rev <rev>] [--ignore-revs-file <file>] [--color-lines] [--color-by-age] [--progress] [--abbrev=<n>] [ --contents <file> ] [<rev> | --reverse <rev>..<rev>] [--] <file>
ОПИС
Анотує кожен рядок у заданому файлі інформацією з версії, яка востаннє змінювала рядок. За потреби, можна почати анотування з заданої версії.
Якщо вказати параметр -L один або кілька разів, він обмежує анотацію запитуваними рядками.
При перейменуванні всього файлу походження рядків відстежується автоматично (наразі немає можливості вимкнути цю функцію). Щоб відстежувати рядки, переміщені з одного файлу в інший, або рядки, скопійовані та вставлені з іншого файлу тощо, див. параметри -C та -M.
У звіті нічого не повідомляється про рядки, які були видалені або замінені; вам потрібно скористатися інструментом, таким як git diff або інтерфейсом «pickaxe», про який трохи далі.
Окрім підтримки анотацій файлів, Git також підтримує пошук в історії розробки, щоб дізнатися, коли фрагмент коду зʼявлявся під час зміни. Це дозволяє відстежувати, коли фрагмент коду був доданий до файлу, переміщений або скопійований між файлами, а також видалений або замінений. Це працює шляхом пошуку текстового рядка в diff. Невеликий приклад інтерфейсу pickaxe, який шукає blame_usage:
$ git log --pretty=oneline -S'blame_usage' 5040f17eba15504bad66b14a645bddd9b015ebb7 blame -S <ancestry-file> ea4c7f9bf69e781dd0cd88d2bccb2bf5cc15c9a7 git-blame: Зробіть вихід
ОПЦІЇ
- -b
-
Показувати порожній SHA-1 для комітів, що є граничними. Цю поведінку також можна налаштувати за допомогою параметра конфігурації
blame.blankBoundary. - --root
-
Не слід розглядати кореневі коміти як межі. Цю поведінку також можна налаштувати за допомогою параметра конфігурації
blame.showRoot. - --show-stats
-
Додати додаткові статистичні дані в кінці виводу команди blame.
- -L <початок>,<кінець>
- -L :<імʼя-функції>
-
Анотує лише проміжок рядків, заданий за допомогою <початку>,<кінця> або за регулярним виразом <імʼя-функції> назви функції. Може бути задано декілька разів. Допускається накладання проміжків.
<початок> та <кінець> необовʼязкові.
-L<початок> або-L<початок>,охоплює рядки від <початку> до кінця файлу.-L,<кінець> — від початку файлу до <кінця>.<start> і <end> може мати одну з цих форм:
-
<number>
Якщо <start> або <end> є числом, воно визначає абсолютний номер рядка (рядки рахуються від 1).
-
/<regex>/Ця форма використовуватиме перший рядок, що відповідає заданому POSIX-виразу <regex>. Якщо <start> є регулярним виразом, пошук розпочнеться з кінця попереднього діапазону
-L, якщо такий є, інакше — з початку файлу. Якщо <start> є^/<regex>/, пошук розпочнеться з початку файлу. Якщо <end> є регулярним виразом, пошук розпочнеться з рядка, вказаного в <start>. -
+<offset> або-<offset>Є дійсним лише для <end> та визначатиме кількість рядків до або після рядка, заданого <start>.
Якщо
:<funcname> вказано замість <start> та <end>, це регулярний вираз, який позначає діапазон від першого рядка funcname, що відповідає <funcname>, до наступного рядка funcname.:<funcname> шукає з кінця попереднього діапазону-L, якщо такий є, інакше з початку файлу.^:<funcname> шукає з початку файлу. Назви функцій визначаються так само якgitdiffобчислює заголовки латок (див. «Визначення власного заголовка фрагмента» у gitattributes[5]). -
- -l
-
Показує повне значення ревізії (Типово: вимкнено).
- -t
-
Показує необроблений відбиток часу (Типово: вимкнено).
- -S <файл-ревізій>
-
Використовує ревізії із вказаного файлу ревізій замість виклику git-rev-list[1].
- --reverse <ревізія>..<ревізія>
-
Рухає історію вперед, а не назад. Замість показу ревізії, у якій рядок зʼявився, показує останню ревізію у якій він існував. Для цього потрібно вказати проміжок ревізій, наприклад, ПОЧАТОК..КІНЕЦЬ, де рядок, який ви шукаєте, повинен існувати у ПОЧАТКУ. git blame --reverse ПОЧАТОК є скороченням для git blame --reverse ПОЧАТОК..HEAD.
- --first-parent
-
Слідує лише за першим батьківським комітом після того, як побачить коміт злиття. Ця опція може бути використана для визначення, коли рядок зʼявився саме у певній гілці, а не коли його в цілому було додано.
- -p
- --porcelain
-
Показує у форматі, призначеному для машинного використання.
- --line-porcelain
-
Показувати формат porcelain, але виводити інформацію про коміт для кожного рядка, а не лише при першому згадуванні коміту. Передбачає використання параметра --porcelain.
- --incremental
-
Показує результати покроково у форматі, призначеному для машинного використання.
- --encoding=<encoding>
-
Визначає кодування для виводу імені автора та заголовку коміту. Встановлення значення
noneпризводить до виводу неконвертованих даних. Детальніше дивіться обговорення кодування на сторінці посібника git-log[1]. - --contents <файл>
-
Анотує використовуючи вміст вказаного файлу, починаючи з <ревізії>, якщо її визначено, або ж з HEAD. Ви можете вказати
-аби команда зчитувала контент файлу зі стандартного вводу. - --date <формат>
-
Визначає формат виводу дати. Якщо цей параметр відсутній, буде використано значення параметру конфігурації
blame.date. Якщо ж і його немає, то буде використано формат ISO. Задля ознайомлення із підтримуваними значенням дивіться обговорення параметру--dateу git-log[1]. - --progress
- --no-progress
-
Типово, статус виконання виводиться у стандартному потоці помилок, коли він підключений до терміналу. Цей прапорець дозволяє виводити прогрес навіть коли такий потік не підключено.
--progressне може використовуватися разом з--porcelainчи--incremental. - -M[<число>]
-
Виявляє переміщені чи скопійовані рядки всередині файлу. Коли коміт переміщує чи копіює сукупність рядків (наприклад, коли вихідний файл містить рядок А і потім Б, а коміт переставляє спочатку Б, а тоді А), традиційний алгоритм розпізнає лише половину руху і, зазвичай, приписує рядки, що були переміщені вгору (тобто Б), батьківському коміту, а рядки, що були переміщені вниз (тобто А), — дочірньому. Із цим параметром, обидві групи рядків приписуються батьківському шляхом виконання додаткових перевірок.
<Число> необовʼязкове. Це нижня межа кількості літерно-цифрових символів, які Git має визначити як переміщені/скопійовані всередині файлу, щоб повʼязати ці рядки із батьківським комітом. Типово дорівнює 20.
- -C[<число>]
-
На додачу до
-Mвизначає переміщені або скопійовані рядки з інших файлів, що були змінені у тому самому коміті. Це корисно коли ви реорганізовуєте вашу програму та переміщуєте код між файлами. Коли цей параметр вказано двічі, команда додатково шукає копії з інших файлів у коміті, в якому файл було створено. Якщо ж його вказано тричі, то команда додатково шукає копії з інших файлів у будь-якому коміті.<Число> необовʼязкове. Це нижня межа кількості літерно-цифрових символів, які Git має визначити як переміщені/скопійовані між файлами, аби повʼязати ці рядки із батьківським комітом. Типово дорівнює 40. Якщо вказано більше одного параметру
-C, то буде використано <число> останнього з них. - --ignore-rev <ревізія>
-
При визначенні відповідальності ігнорувати зміни, внесені цією версією, так ніби ці зміни ніколи не відбувалися. Рядки, які були змінені або додані ігнорованим комітом, будуть приписані попередньому коміту, який змінив цей рядок або сусідні рядки. Цю опцію можна вказати кілька разів, щоб ігнорувати більше ніж одну ревізію. Якщо встановлено опцію конфігурації
blame.markIgnoredLines, то рядки, які були змінені ігнорованим комітом і приписані іншому коміту, будуть позначені символом ? у результатах blame. Якщо встановлено опцію конфігураціїblame.markUnblamableLines, то ті рядки, яких торкнувся ігнорований комміт, які ми не змогли приписати іншій ревізії, позначаються символом *. У режимах porcelain ми виводимо ignored та unblamable відповідно на новому рядку. - --ignore-revs-file <файл>
-
Нехтує ревізіями, що перелічені у <файлі>, який має бути в тому ж форматі що й
fsck.skipList. Цей параметр може бути вказано декілька разів. Ці файли будуть опрацьовані після усіх файлів, що визначені параметром конфігураціїblame.ignoreRevsFile. Порожнє імʼя файлу ("") очищає перелік ревізій з попередніх опрацьованих файлів. - --color-lines
-
Позначати кольором рядки у стандартному форматі по-різному, якщо вони походять із того самого коміту, що й попередній рядок. Це полегшує розрізнення блоків коду, доданих у різних комітах. Зазвичай використовується блакитний колір, який можна змінити за допомогою параметра конфігурації
color.blame.repeatedLines. - --color-by-age
-
Кольорові позначки рядків залежно від їхнього віку у типовому форматі. Параметр конфігурації
color.blame.highlightRecentвизначає, який колір використовуватиметься для кожного вікового діапазону. - -h
-
Показати повідомлення довідки.
- -c
-
Використовувати той самий режим виводу, що й для git-annotate[1] (Стандартно: вимкнено).
- --score-debug
-
Включити інформацію для налагодження, повʼязану з переміщенням рядків між файлами (див.
-C) та рядків, переміщених у файлі (див.-M). Перше число у списку — це оцінка. Це кількість літерно-цифрових символів, які, як було виявлено, були переміщені між файлами або всередині них. Ця кількість має перевищувати певний поріг, щоб команда git blame визнала ці рядки коду переміщеними. - -f
- --show-name
-
Показувати назву файлу в оригінальному коміті. Зазвичай назва файлу показується, якщо є рядок, що походить з файлу з іншою назвою, через виявлення перейменування.
- -n
- --show-number
-
Показувати номер рядка в оригінальному коміті (зазвичай вимкнено).
- -s
-
Приховати імʼя автора та позначку часу у виводі.
- -e
- --show-email
-
Показувати електронну адресу автора замість імені автора (зазвичай: вимкнено). Цим також можна керувати за допомогою параметра конфігурації
blame.showEmail. - -w
-
Ігнорувати пробіли під час порівняння батьківської версії та дочірньої, щоб знайти, звідки взялися рядки.
-
--diff-algorithm=(patience|minimal|histogram|myers) -
Вибір алгоритму порівняння. Є наступні варіанти:
-
default -
myers -
Базовий алгоритм «жадібного» порівняння. Наразі це типове значення.
-
minimal -
Витрачає додатковий час, щоб переконатися, що отримано найменший можливий diff.
-
patience -
При створенні латок використовується алгоритм «patience diff».
-
histogram -
Цей алгоритм розширює алгоритм «patience» для «підтримки рідкісних загальних елементів».
Наприклад, якщо ви налаштували змінну
diff.algorithmна значення, відмінне від стандартного, і хочете скористатись стандартним значенням, тоді вам потрібно використовувати опцію--diff-algorithm=default. -
СТАНДАРТНИЙ ФОРМАТ
Якщо не вказано ні опції --porcelain, ні --incremental, git blame виведе анотацію для кожного рядка з таким виглядом:
-
скорочена назва обʼєкта для коміту, з якого походить рядок;
-
ідентифікатор автора (стандартно імʼя автора та дата, якщо не вказано
-sабо-e); та -
номер рядка
перед вмістом рядка.
ФОРМАТ PORCELAIN
У цьому форматі кожен рядок виводиться після заголовка; заголовок щонайменше має перший рядок, який містить:
-
40-байтовий SHA-1 коміта, до якого належить рядок;
-
номер рядка у вихідному файлі;
-
номер рядка в кінцевому файлі;
-
у рядку, що починає групу рядків з іншого коміту, ніж попередній, кількість рядків у цій групі. У наступних рядках це поле відсутнє.
Після цього рядка заголовка принаймні один раз для кожного коміту йде наступна інформація:
-
імʼя автора ("author"), електронна адреса ("author-mail"), час ("author-time") та часовий пояс ("author-tz"); аналогічно для комітера.
-
імʼя файлу в коміті, до якого відноситься рядок.
-
перший рядок повідомлення журналу комітів ("summary").
Вміст фактичного рядка виводиться після вищезазначеного заголовка, починаючи з символу табуляції. Це дозволяє додавати більше елементів заголовка пізніше.
Формат porcelain зазвичай приховує інформацію про коміти, які вже були переглянуті. Наприклад, два рядки, що повʼязані з одним і тим самим комітом, будуть показані, але деталі цього коміту будуть показані лише один раз. Інформація, що стосується окремих рядків, не буде згрупована разом, як-от редагування, які будуть позначені як ignored або unblamable. Це ефективніше, але може вимагати від читача збереження більшої кількості даних про стан. Опцію --line-porcelain можна використовувати для виведення повної інформації про коміт для кожного рядка, що дозволяє простіше (але менш ефективне) використання, наприклад:
# підрахувати кількість рядків, що належать кожному автору git blame --line-porcelain file | sed -n 's/^author //p' | sort | uniq -c | sort -rn
ВИЗНАЧЕННЯ ДІАПАЗОНІВ
На відміну від git blame та git annotate у старіших версіях git, обсяг анотації може бути обмежений як діапазонами рядків, так і діапазонами версій. Опцію -L, яка обмежує анотацію діапазоном рядків, можна вказувати кілька разів.
Якщо вам потрібно знайти початок рядків 40-60 для файлу foo, ви можете скористатися опцією -L ось так (вони означають одне й те саме — обидва запитують 21 рядок, починаючи з рядка 40):
git blame -L 40,60 foo git blame -L 40,+21 foo
Також ви можете використовувати регулярний вираз для визначення діапазону рядків:
git blame -L '/^sub hello {/,/^}$/' foo
що обмежує анотацію тілом підпрограми hello.
Якщо вас не цікавлять зміни, старіші за версію v2.6.18, або зміни, старіші за 3 тижні, ви можете використовувати специфікатори діапазону версій, подібні до git rev-list:
git blame v2.6.18.. -- foo git blame --since=3.weeks -- foo
Коли для обмеження анотації використовуються специфікатори діапазону редакцій, рядки, які не змінилися з моменту встановлення межі діапазону (або коміт версії 2.6.18, або найновіший коміт, якому більше 3 тижнів у наведеному вище прикладі), вважаються причиною встановлення межі діапазону.
Особливо корисним є перевірка того, чи містить доданий файл рядки, скопійовані з наявних файлів. Іноді це свідчить про те, що розробник працював недбало і не виконав належного рефакторингу коду. Спочатку можна знайти коміт, у якому було додано цей файл, за допомогою команди:
git log --diff-filter=A --pretty=short -- foo
а потім анотуйте зміну між комітом та його батьківськими обʼєктами, використовуючи нотацію commit^!:
git blame -C -C -f $commit^! -- foo
ІНКРЕМЕНТАЛЬНИЙ ВИВІД
Якщо команду запустити з опцією --incremental, вона виводитиме результат у міру його формування. Зазвичай у видачі спочатку йдуть рядки, до яких торкнулися останні коміти (тобто рядки будуть позначені не в хронологічному порядку), і це призначено для використання в інтерактивних переглядачах.
Формат виводу подібний до формату Porcelain, але він не містить фактичних рядків з файлу, до якого додаються анотації.
-
Кожен запис blame завжди починається з рядка:
<40-byte-hex-sha1> <sourceline> <resultline> <num-lines>
Номери рядків рахуються від 1.
-
Коли коміт вперше зʼявляється в потоці, на початку кожного рядка виводиться різна інша інформація про нього з тегом з одного слова, що описує додаткову інформацію про коміт (автор, електронна адреса, коміттер, дати, короткий опис тощо).
-
На відміну від формату Porcelain, інформація про імʼя файлу завжди надається та завершує запис:
"filename" <whitespace-quoted-filename-goes-here>
і тому його дійсно досить легко проаналізувати за допомогою будь-якого синтаксичного аналізатора, орієнтованого на рядки та слова (що має бути цілком природним для більшості скриптових мов).
NoteДля тих, хто займається синтаксичним аналізом: щоб зробити його більш надійним, просто ігноруйте всі рядки між першим і останнім (рядками «<sha1>» та «filename»), у яких ви не розпізнаєте слова-теги (або які вас не цікавлять) на початку рядків «розширеної інформації». Таким чином, якщо коли-небудь буде додано інформацію (наприклад, кодування коміту або розширений коментар до коміту), програма для перегляду blame не буде на це зважати.
СПИСОК АВТОРІВ
Див. gitmailmap[5].
КОНФІГУРАЦІЯ
Все, що знаходиться нижче цього рядка в цьому розділі, вибірково включено з документації git-config[1]. Вміст такий самий, як і там:
|
Warning
|
Missing See original version for this content. |
GIT
Частина набору git[1]