git blame
Описание
Команда git blame — это гибкий инструмент с несколькими вариантами использования. Самая важная функция команды git blame — отображение метаданных автора, связанных с определённой зафиксированной строкой в файле. Она используется для изучения истории файла и определения последнего автора, который изменил строку.

Как это работает
Чтобы наглядно показать, как работает git blame, рассмотрим пример, в котором у нас есть файл README.md с несколькими коммитами от разных авторов.
В следующем примере мы используем git blame. Состояние примера репозитория можно изучить с помощью git log. История коммитов выглядит так:
git log and 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Общие параметры
Вы также можете ограничить вывод определёнными строками с помощью параметра -L, как показано в таблице ниже.
| git blame -L 1,3 README.md | Ограничивает вывод запрошенным диапазоном строк. Здесь мы ограничили вывод строками с 1 по 3. |
|---|---|
| git blame -e README.md | Показывает адрес электронной почты автора вместо имени пользователя. |
| git blame -w README.md | Игнорирует изменения пробелов. Если предыдущий автор изменил форматирование пробелов (например, заменил табуляции пробелами), это может скрыть реальные изменения содержимого в выводе. |
| git blame -M README.md | Параметр -M обнаруживает перемещённые или скопированные строки внутри одного и того же файла. В этом случае будет показан исходный автор строк, а не последний автор, который переместил или скопировал строки. |
| git blame -C README.md | Параметр -C обнаруживает строки, которые были перемещены или скопированы из других файлов. В этом случае будет показан исходный автор строк, а не последний автор, который переместил или скопировал строки. |
| git blame -p README.md | Показывает полный вывод diff для каждой строки, что облегчает просмотр того, что именно было изменено. |
Git Blame vs Git Log
Команда git blame показывает последнего автора, который изменил строку, но иногда вам может понадобиться увидеть, когда строка была изначально добавлена. Это может быть сложно сделать с помощью git blame. Для этой цели можно использовать комбинацию параметров -w, -C и -M. Но проще будет использовать git log.
Используйте git log с параметром -S, чтобы показать коммиты, в которых определённая строка была добавлена или удалена.
Рассмотрим следующий пример:
git log -S example
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
509c2cc35a1b2c3d4e5f6a7b8c9c0d1e2f3a4b5d 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, чтобы отображать определённые поля, такие как хеш коммита, автор, дата и тема.
Практика
What are the functions and options of the 'git blame' command in Git?