W3docs

git blame

Узнайте, как работает команда git blame: примеры использования, основные параметры и советы по анализу истории изменений.

Описание

Команда git blame аннотирует каждую строку файла информацией о последнем коммите, который её изменил — хешем коммита, автором и временной меткой. Иными словами, для каждой строки она отвечает на вопрос: «кто написал это и когда?».

Это команда только для чтения. Она не изменяет историю или файлы — она лишь отображает метаданные, уже хранящиеся в репозитории. Разработчики прибегают к git blame, чтобы:

  • Найти автора запутанной или проблемной строки, чтобы уточнить замысел.
  • Определить коммит, который внёс изменение, и прочитать его полное сообщение с помощью git show.
  • Понять, как менялся файл, когда история коммитов сама по себе слишком укрупнена, чтобы указать на конкретную строку.

git blame

Информация

git blame показывает только самый последний коммит, затронувший каждую строку. Если строка редактировалась несколько раз, более ранние авторы скрыты. Чтобы проследить строку глубже во времени, повторно запустите blame для более старой ревизии (см. Отслеживание строки через историю ниже).

Как это работает

Чтобы наглядно показать, как работает git blame, рассмотрим пример с файлом README.md, имеющим несколько коммитов от разных авторов.

В следующем примере мы используем git blame. Состояние примера репозитория можно изучить с помощью git log. История коммитов выглядит так:

git log и git blame

git log
commit 745a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a
Author: Bob Smith <[email protected]m>
Date: Fri Apr 1 19:55:15 2019 +0000
Another commit to help git blame track the who, the what, and the when
commit eb06faedb1fdd159d62e4438fc8dbe9c9fe0728b
Author: Bob Smith <[email protected]m>
Date: Fri Apr 1 19:53:23 2019 +0000
Creating the third commit, along with Nick and Robert, so that Nick can get git blame docs.
commit 990c2b6a84464fee153253dbf02e845a4db372bb
Merge: 82496ea 89feb84
Author: Tom Brown <[email protected]m>
Date: Fri Apr 1 05:33:01 2019 +0000
Merged in tom-brown/git-blame-example/albert-so/readmemd-edited-online-with-bitbucket-1519865641474 (pull request #2)
README.md edited online with Bitbucket
commit 73a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8
Author: Tom Brown <[email protected]m>
Date: Fri Apr 1 00:54:03 +0000
README.md edited online with Bitbucket

Команда git blame работает с отдельными файлами. По умолчанию git blame выводит информацию об авторстве для указанного файла.

Следующий вывод является частью полного вывода blame для файла README:

git blame

git blame README.md
83253a1b (marioswift 2019-02-28 13:37:02 -0800 1) # Git Blame example
83253a1b (marioswift 2019-02-28 13:37:02 -0800 2)
73a0b1c2 (Tom Brown 2019-04-01 00:54:03 +0000 3) Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old.
83253a1b (marioswift 2019-02-28 13:37:02 -0800 4)
83253a1b (marioswift 2019-02-28 13:37:02 -0800 5) There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable.
83253a1b (marioswift 2019-02-28 13:37:02 -0800 6)
73a0b1c2 (Tom Brown 2019-04-01 00:54:03 +0000 7) Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod TEMPOR incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laborum nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

Чтение вывода

Каждая строка blame состоит из четырёх частей:

83253a1b (marioswift 2019-02-28 13:37:02 -0800 1) # Git Blame example
└──┬───┘  └───┬────┘ └────────┬─────────────┘  └──────────┬──────────┘
             └─ the line's content
   │          │               │               └─ line number in the file
   │          │               └─ commit timestamp
   │          └─ author of that commit
   └─ abbreviated commit hash

Строки с одинаковым хешем коммита были изменены вместе в последний раз. Чтобы посмотреть, что именно сделал этот коммит, скопируйте хеш и выполните git show 83253a1b.

Основные параметры

git blame принимает несколько параметров, которые сужают вывод или изменяют способ определения авторства. Наиболее полезные из них приведены ниже.

КомандаЧто делает
git blame -L 1,3 README.mdОграничивает вывод указанным диапазоном строк — здесь с 1 по 3. Можно также использовать -L 5,+10, чтобы начать с строки 5 и показать 10 строк.
git blame -e README.mdПоказывает адрес электронной почты каждого автора вместо имени пользователя.
git blame -w README.mdИгнорирует изменения, состоящие только из пробельных символов. Если предыдущий автор лишь изменил отступ строки (например, табуляцию на пробелы), git blame иначе засчитал бы ему это; -w позволяет видеть фактическое изменение содержимого.
git blame -M README.mdОбнаруживает строки, которые были перемещены или скопированы внутри того же файла, и сообщает исходного автора вместо того, кто их переместил.
git blame -C README.mdОбнаруживает строки, которые были перемещены или скопированы из других файлов, и сообщает исходного автора. Передайте -C два или три раза для более агрессивного поиска.
git blame -L :functionName README.mdОграничивает blame одной функцией по имени (использует regex funcname Git), вместо числового диапазона строк.

Отслеживание строки через историю

Поскольку blame останавливается на самом последнем коммите для каждой строки, иногда нужно копнуть на шаг глубже. Получив хеш коммита из вывода blame, вы можете повторно запустить blame для коммита перед этим, чтобы увидеть, как выглядела строка — и кто её написал — ранее.

# Blame the file as it was just before commit 73a0b1c2 touched it
git blame 73a0b1c2^ -- README.md

^ (каретка) означает «родительский коммит для данного». Повторяя это, можно пройти по строке назад через всю её историю, по одной ревизии за раз.

Также можно ограничить blame диапазоном ревизий, чтобы видеть авторство только за определённый период истории:

# Blame README.md considering only commits between v1.0 and v2.0
git blame v1.0..v2.0 -- README.md

Git Blame vs Git Log

Команда git blame показывает последнего автора, изменившего строку, но иногда нужно узнать, когда строка была впервые добавлена. С одним лишь git blame это неудобно — даже при комбинации параметров -w, -C и -M. Для отслеживания того, когда фрагмент текста впервые появился (или был удалён), лучше подходит git log.

Используйте git log с параметром -S («кирка») для отображения коммитов, в которых была добавлена или удалена конкретная строка.

Пример: поиск изменения строки

git log -S пример

git log -S "CSS3D and WebGL renderers." --pretty=format:'%h %an %ad %s'
e339d3c85a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d John Carter Fri Jun 13 16:51:06 2015 +0200 reverted README.md to original content
509c2cc35a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d Max Fri Jul 8 13:56:14 2015 +0200 Updated README
cb20237cc1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6 Leo Sat Aug 31 00:22:36 2012 +0100 Removed DOMRenderer. Now with the CSS3DRenderer it has become irrelevant.

Вывод показывает, что файл README.md был добавлен и изменён 3 раза тремя авторами. Параметр --pretty=format:'...' настраивает вывод git log для отображения конкретных полей: хеша коммита, автора, даты и темы.

Связанные команды

git blame наиболее полезен в сочетании с другими командами инспекции:

  • git log — просмотр полной истории коммитов и поиск по ней с помощью -S/-G.
  • git show — отображение полного сообщения и diff коммита, найденного с помощью blame.
  • git diff — сравнение текущего состояния строки с более ранней ревизией.

Практика

Практика
Каковы функции и параметры команды 'git blame' в Git?
Каковы функции и параметры команды 'git blame' в Git?
Was this page helpful?