Русский ▾ Topics ▾ Latest version ▾ git-blame last updated in 2.53.0

НАЗВАНИЕ

git-blame — Показать, какая ревизия и какой автор последними изменили каждую строку файла

ОБЗОР

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, если таковой имеется, в противном случае — с начала файла. ^:<имя-функции> ищет с начала файла. Имена функций определяются так же, как git diff определяет заголовки фрагментов патча (см. раздел Определение пользовательского заголовка фрагмента в 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 команда выводит результат по мере его построения. Вывод обычно будет говорить о строках, затронутых более поздними коммитами, в первую очередь (т.е. строки будут аннотироваться не по порядку) и предназначен для использования интерактивными просмотрщиками.

Формат вывода похож на фарфоровый формат, но не содержит фактических строк из аннотируемого файла.

  1. Каждая запись blame всегда начинается со строки:

    <40-байтовый-шестнадцатеричный-sha1> <исходная-строка> <строка-результата> <число-строк>

    Номера строк считаются с 1.

  2. Когда коммит впервые появляется в потоке, о нём выводится различная другая информация с одноключевым тегом в начале каждой строки, описывающим дополнительную информацию о коммите (автор, адрес электронной почты, коммиттер, даты, сводка и т.д.).

  3. В отличие от фарфорового формата, информация об имени файла всегда предоставляется и завершает запись:

    "filename" <сюда-помещается-заключённое-в-кавычки-имя-файла>

    и, таким образом, его действительно довольно легко анализировать для некоторого построчного и пословного анализатора (что должно быть вполне естественно для большинства языков сценариев).

    Note
    Для тех, кто занимается анализом: чтобы сделать его более надёжным, просто игнорируйте любые строки между первой и последней (строки "<sha1>" и "filename"), где вы не распознаёте ключевые слова (или вам не важна эта конкретная информация) в начале строк "расширенной информации". Таким образом, если когда-либо будет добавлена информация (например, кодировка коммита или расширенный комментарий к коммиту), просмотрщик blame не будет обращать на неё внимания.

СОПОСТАВЛЕНИЕ АВТОРОВ

См. gitmailmap[5].

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

Дальнейшее содержание этого раздела, повторяет то, что может быть найдено в git-config[1]:

Warning

Missing ru/config/blame.adoc

See original version for this content.

СМ. ТАКЖЕ

GIT

Является частью пакета git[1]