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 <диапазон>] [-S <файл-редакций>] [-M] [-C] [-C] [-C] [--since=<дата>] [--ignore-rev <ред>] [--ignore-revs-file <файл>] [--color-lines] [--color-by-age] [--progress] [--abbrev=<число>] [ --contents <файл> ] [<ред> | --reverse <ред>..<ред>] [--] <файл>
ОПИСАНИЕ
Аннотирует каждую строку в указанном файле информацией из ревизии, которая последней изменила эту строку. При желании можно начать аннотирование с заданной ревизии.
При указании один или несколько раз -L ограничивает аннотацию запрошенными строками.
Происхождение строк автоматически отслеживается при переименованиях целых файлов (в настоящее время нет параметра для отключения отслеживания переименований). Чтобы отследить строки, перемещённые из одного файла в другой, или строки, скопированные и вставленные из другого файла и т.д., см. параметры -C и -M.
Отчёт не сообщает вам ничего о строках, которые были удалены или заменены; вам нужно использовать такой инструмент, как git diff или интерфейс "pickaxe", кратко упомянутый в следующем абзаце.
Помимо поддержки аннотации файлов, Git также поддерживает поиск по истории разработки, чтобы узнать, когда фрагмент кода появился в изменении. Это позволяет отследить, когда фрагмент кода был добавлен в файл, перемещён или скопирован между файлами и в конечном итоге удалён или заменён. Это работает путём поиска текстовой строки в сравнении. Небольшой пример интерфейса pickaxe, который ищет blame_usage:
$ git log --pretty=oneline -S'blame_usage' 5040f17eba15504bad66b14a645bddd9b015ebb7 blame -S <файл-родословной> ea4c7f9bf69e781dd0cd88d2bccb2bf5cc15c9a7 git-blame: Make the output
ПАРАМЕТРЫ
- -b
-
Выводить пустое пространство вместо SHA-1 для граничных коммитов. Этим также можно управлять, используя переменную конфигурации
blame.blankBoundary. - --root
-
Не обрабатывать корневые коммиты, как граничные. Этим также можно управлять, используя переменную конфигурации
blame.showRoot. - --show-stats
-
Включить дополнительную статистику в конец вывода информации об авторах изменений (
blame). - -L <начало>,<конец>
- -L :<имя-функции>
-
Вывести аннотацию только для диапазона строк от <начала> и до <конца>» или для функции, заданной регулярным выражением «<имя-функции>». Может быть указан несколько раз. Диапазоны могут перекрывать друг друга.
<начало> и <конец> являются необязательными.
-L<начало> или-L<начало>,охватывает диапазон от <начала> до конца файла;-L,<конец> — от начала до <конца>.<начало> и <конец> могут принимать одну из этих форм:
-
<число>
Если <начало> или <конец> является числом, оно указывает абсолютный номер строки (строки считаются с 1).
-
/<регулярное-выражение>/Эта форма будет использовать первую строку, соответствующую заданному <регулярному-выражению> POSIX. Если <начало> является регулярным выражением, поиск будет производиться с конца предыдущего диапазона
-L, если таковой имеется, в противном случае — с начала файла. Если <начало> имеет вид^/<регулярное-выражение>/, поиск будет производиться с начала файла. Если <конец> является регулярным выражением, поиск будет начинаться со строки, заданной <началом>. -
+<смещение> или-<смещение>Это допустимо только для <конца> и указывает количество строк до или после строки, заданной <началом>.
Если вместо <начало> и <конца> указано
:<имя-функции>, это регулярное выражение, обозначающее диапазон от первой строки с именем функции, соответствующей <имя-функции>, до следующей строки с именем функции.:<имя-функции> ищет с конца предыдущего диапазона-L, если таковой имеется, в противном случае — с начала файла.^:<имя-функции> ищет с начала файла. Имена функций определяются так же, какgitdiffопределяет заголовки фрагментов патча (см. раздел Определение пользовательского заголовка фрагмента в gitattributes[5]). -
- -l
-
Показывать полные значения ревизий (По умолчанию: отключено).
- -t
-
Показывать необработанные временные метки (По умолчанию: отключено).
- -S <revs-file>
-
Использовать ревизии из <revs-file> вместо вызова git-rev-list[1].
- --reverse <редакция>..<редакция>
-
Идти вперёд по историю, а не назад. Вместо того, чтобы показать, в какой редакции появилась строка, с этим параметром будет показана последня редакция, в которой строка всё ещё существовала. Для этого требуется указать диапазон редакций в виде НАЧАЛО..КОНЕЦ, где путь для которого будут искаться изменения существует в НАЧАЛЕ. Для удобства, git blame --reverse НАЧАЛО работает как git blame --reverse НАЧАЛО..HEAD.
- --first-parent
-
При обработке коммита-слияния, прослеживать только первый родительский коммит. Этот параметр можно использовать для определения того, когда некая линия изменений была привнесена в определённую интеграционную ветку, а не когда эти изменения были в принципе добавлены в историю.
- -p
- --porcelain
-
Выводить информацию в формате для программного разбора.
- --line-porcelain
-
Выводить информацию в машиночитаемом формате, но также добавлять информацию о коммите для каждой строки, а не только при первом его упоминании. Подразумевает --porcelain.
- --incremental
-
Выводить информацию в формате для программного разбора сразу по мере её поступления.
- --encoding=<кодировка>
-
Указывает кодировку для вывода имени автора и информации коммита. Если выставить в
none, тогда blame выводит неизмененные данные. Для подробностей см. обсуждение кодировки на странице руководства git-log[1]. - --contents <файл>
-
Вывести аннотацию, используя содержимое из указанного файла, начиная с <редакции> (если она задана, иначе с HEAD). Вы можете передать «-» в качастве имени файла, чтобы команда читала из стандартного ввода.
- --date <формат>
-
Указывает формат даты. Если --date не указана, то используется значение переменной blame.date из конфигурации. Если переменная blame.date также не установлена, то используется формат ИСО. Чтобы узнать о поддерживаемых значениях, см. обсуждение параметра --date в git-log[1].
- --progress
- --no-progress
-
По умолчанию информация о ходе выполнения выводится в стандартный поток ошибок, когда он привязан к терминалу. Этот флаг позволяет выводить эту информацию, даже когда он привязан не к терминалу. Использовать
--progressсовместно с--porcelainили--incrementalневозможно. - -M[<число>]
-
Выявлять перемещение и копирование строк внутри одного файла. Когда коммит перемещает или копирует блок строк (например, в исходном файле идёт сначала А, а затем Б, а коммит меняет их местами: сначала Б, а затем A), традиционный алгоритм blame замечает только половину этого перемещения и, как правило, приписывает изменения в строках, которые двигаются вверх (т.е. Б) родителю, а тех, которые были перемещены вниз (т.е. А) — дочернему коммиту. С этим параметром, благодаря запуску дополнительных проверок, обе группы строк будут приписаны родителю.
Аргумент <число> является необязательным; это то минимальное количество буквенно-цифровых символов, которые Git должен определить как передвинутые/скопированные внутри файла, чтобы он связывал эти строки с родительским коммитом. Значение по умолчанию — 20.
- -C[<число>]
-
В дополнение к
-M, выявлять строки, перемещённые или скопированные из других файлов, которые были изменены в том же коммите. Это полезно, когда вы реорганизуете свою программу и перемещаете код между файлам. Если этот параметр задан дважды, команда дополнительно ищет строки, скопированные из других файлов в коммитах, которые создают файлы. Если этот параметр задан три раза, команда дополнительно ищет копии из других файлов в любом коммите.Аргумент <число> является необязательным; это то минимальное количество буквенно-цифровых символов, которые Git должен определить как передвинутые/скопированные между файлами, чтобы он связывал эти строки с родительским коммитом. И значение по умолчанию — 40. Если параметр
-Cзадан более одного раза, то используется аргумент <число> последнего указанного-C. - --ignore-rev <редакция>
-
Игнорировать изменения, внесённые редакцией при поиске авторов изменений, как будто этих изменений никогда не было. Строки, которые были изменены или добавлены проигнорированным коммитом, будут приписаны предыдущему коммиту, который изменил эту строку или близлежащие строки. Этот параметр может быть задан несколько раз, чтобы проигнорировать более одной ревизии. Если переменная конфигурации
blame.markIgnoredLinesустановлена, то строки, которые принадлежали проигнорированному коммиту, а затем приписаны к другому, будут помечены знаком вопроса (?) при выводе. Если переменная конфигурацииblame.markUnblamableLinesустановлена, то строки, принадлежавшие проигнорированному коммиту, но которые алгоритм не смог приписать какому-либо другому, будут помечены звёздочкой (*). В режимах машиночитаемых форматов мы печатаем «ignored» и «unblamable» соответственно в новой строке. - --ignore-revs-file <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 -
Базовый жадный алгоритм, используемый в стандартной утилите сравнения (
diff). В настоящее время это значение по умолчанию. -
minimal -
Потратить дополнительное время, чтобы гарантировать, что будет сгенерирован минимально возможный список изменений.
-
patience -
Используйте «терпеливый» алгоритм сравнения (patience diff) для генерации патчей.
-
histogram -
Этот алгоритм расширяет «терпеливый» алгоритм так, что он «поддерживает общие элементы с низкой частотой встречаемости».
В частности, если вы настроили переменную
diff.algorithmна нестандартное значение и хотите использовать стандартный алгоритм, то следует задать параметр--diff-algorithm=default. -
- --abbrev=<n>
-
Вместо использования 7+1 шестнадцатеричных цифр по умолчанию в качестве сокращённого имени объекта использовать <m>+1 цифр, где <m> не меньше <n>, но обеспечивает уникальность имён объектов коммитов. Обратите внимание, что 1 столбец используется для символа ^ для пометки граничного коммита.
ФОРМАТ ПО УМОЛЧАНИЮ
Когда не указаны ни параметр --porcelain, ни --incremental, git blame будет выводить аннотацию для каждой строки с:
-
сокращённое имя объекта для коммита, из которого пришла строка;
-
идентификатор автора (по умолчанию имя автора и дата, если не указаны
-sили-e); и -
номер строки
перед содержимым строки.
ФАРФОРОВЫЙ ФОРМАТ
В этом формате каждая строка выводится после заголовка; заголовок как минимум содержит первую строку, которая имеет:
-
40-байтовый SHA-1 коммита, которому приписывается строка;
-
номер строки в исходном файле;
-
номер строки в конечном файле;
-
в строке, которая начинает группу строк из другого коммита, отличного от предыдущего, количество строк в этой группе. В последующих строках это поле отсутствует.
За этой строкой заголовка следует следующая информация по крайней мере один раз для каждого коммита:
-
имя автора ("author"), адрес электронной почты ("author-mail"), время ("author-time") и часовой пояс ("author-tz"); аналогично для коммиттера.
-
имя файла в коммите, которому приписывается строка.
-
первая строка сообщения журнала коммита («summary»).
Содержимое фактической строки выводится после вышеуказанного заголовка, перед ним ставится символ TAB. Это сделано для возможности добавления дополнительных элементов заголовка в будущем.
Фарфоровый формат обычно подавляет информацию о коммите, которая уже встречалась. Например, две строки, приписанные одному и тому же коммиту, будут показаны обе, но подробности этого коммита будут показаны только один раз. Информация, специфичная для отдельных строк, не будет сгруппирована вместе, например, редакции, помеченные как ignored или unblamable. Это более эффективно, но может потребовать сохранения большего состояния читателем. Параметр --line-porcelain можно использовать для вывода полной информации о коммите для каждой строки, что позволяет использовать более простое (но менее эффективное) использование, например:
# подсчитать количество строк, приписанных каждому автору git blame --line-porcelain файл | 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
Когда для ограничения аннотации используются спецификаторы диапазона редакций, строки, которые не изменились с момента границы диапазона (либо коммита v2.6.18, либо самого последнего коммита старше 3 недель в приведённом выше примере), приписываются этому граничному коммиту диапазона.
Особенно полезный способ — проверить, есть ли в добавленном файле строки, созданные копированием и вставкой из существующих файлов. Иногда это указывает на то, что разработчик был небрежен и не провёл рефакторинг кода должным образом. Сначала вы можете найти коммит, который ввёл файл, с помощью:
git log --diff-filter=A --pretty=short -- foo
а затем аннотировать изменение между коммитом и его родителями, используя обозначение commit^!:
git blame -C -C -f $коммит^! -- foo
ИНКРЕМЕНТАЛЬНЫЙ ВЫВОД
При вызове с параметром --incremental команда выводит результат по мере его построения. Вывод обычно будет говорить о строках, затронутых более поздними коммитами, в первую очередь (т.е. строки будут аннотироваться не по порядку) и предназначен для использования интерактивными просмотрщиками.
Формат вывода похож на фарфоровый формат, но не содержит фактических строк из аннотируемого файла.
-
Каждая запись blame всегда начинается со строки:
<40-байтовый-шестнадцатеричный-sha1> <исходная-строка> <строка-результата> <число-строк>
Номера строк считаются с 1.
-
Когда коммит впервые появляется в потоке, о нём выводится различная другая информация с одноключевым тегом в начале каждой строки, описывающим дополнительную информацию о коммите (автор, адрес электронной почты, коммиттер, даты, сводка и т.д.).
-
В отличие от фарфорового формата, информация об имени файла всегда предоставляется и завершает запись:
"filename" <сюда-помещается-заключённое-в-кавычки-имя-файла>
и, таким образом, его действительно довольно легко анализировать для некоторого построчного и пословного анализатора (что должно быть вполне естественно для большинства языков сценариев).
NoteДля тех, кто занимается анализом: чтобы сделать его более надёжным, просто игнорируйте любые строки между первой и последней (строки "<sha1>" и "filename"), где вы не распознаёте ключевые слова (или вам не важна эта конкретная информация) в начале строк "расширенной информации". Таким образом, если когда-либо будет добавлена информация (например, кодировка коммита или расширенный комментарий к коммиту), просмотрщик blame не будет обращать на неё внимания.
СОПОСТАВЛЕНИЕ АВТОРОВ
См. gitmailmap[5].
КОНФИГУРАЦИЯ
Дальнейшее содержание этого раздела, повторяет то, что может быть найдено в git-config[1]:
|
Warning
|
Missing See original version for this content. |
GIT
Является частью пакета git[1]