Close

Git blame

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

Команда git blame часто используется с графическим интерфейсом. Онлайн-платформы хостинга Git, такие как Bitbucket, предлагают представления blame views — графические оболочки команды git blame. На них можно ссылаться в групповых обсуждениях запросов pull и коммитов. В большинстве сред IDE, поддерживающих интеграцию с Git, тоже предусмотрены динамические представления blame views.


Порядок действий


Чтобы показать, как работает команда git blame, потребуется репозиторий с историей изменений. Воспользуемся в качестве примера проектом с открытым кодом git-blame-example. Это простой репозиторий, содержащий файл README.md с несколькими коммитами, которые были сделаны несколькими авторами. Для демонстрации работы git blame создадим копию репозитория с помощью команды git clone.

git clone https://kevzettler@bitbucket.org/kevzettler/git-blame-example.git && cd git-blame-example

Now that we have a copy of the example code we can start exploring it with git blame. The state of the example repo can be examined using git log. The commit history should look like the following:

$ git log
    commit 548dabed82e4e5f3734c219d5a742b1c259926b2
    Author: Juni Mukherjee <jmukherjee@atlassian.com>
    Date:   Thu Mar 1 19:55:15 2018 +0000

        Another commit to help git blame track the who, the what, and the when

    commit eb06faedb1fdd159d62e4438fc8dbe9c9fe0728b
    Author: Juni Mukherjee <jmukherjee@atlassian.com>
    Date:   Thu Mar 1 19:53:23 2018 +0000

        Creating the third commit, along with Kev and Albert, so that Kev can get git blame docs.

    commit 990c2b6a84464fee153253dbf02e845a4db372bb
    Merge: 82496ea 89feb84
    Author: Albert So <aso@atlassian.com>
    Date:   Thu Mar 1 05:33:01 2018 +0000

        Merged in albert-so/git-blame-example/albert-so/readmemd-edited-online-with-bitbucket-1519865641474 (pull request #2)

        README.md edited online with Bitbucket

    commit 89feb84d885fe33d1182f2112885c2a64a4206ec
    Author: Albert So <aso@atlassian.com>
    Date:   Thu Mar 1 00:54:03 2018 +0000

        README.md edited online with Bitbucket
Логотип Git
Связанные материалы

Шпаргалка по Git

Логотип Bitbucket
СМ. РЕШЕНИЕ

Изучите Git с помощью Bitbucket Cloud

Команда git blame работает только на конкретных файлах, поэтому, чтобы получить полезный результат, нужно указать путь к файлу. Если выполнить git blame без настройки параметров, отобразится только меню справки по командам. В данном примере используется файл README.MD. Файл README принято размещать в корне репозитория Git проекта с открытым кодом в качестве источника документации по проекту.

git blame README.MD

Приведенная выше команда позволит получить пример вывода blame. Ниже показан фрагмент полного вывода команды blame для файла README. Это фиксированная часть вывода, которая отражает состояние репозитория на момент написания данного документа.

$ git blame README.md
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  1) # Git Blame example
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  2)
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  3) This repository is an example of a project with multiple contributors making commits.
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  4)
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  5) The repo use used elsewhere to demonstrate `git blame`
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  6)
    89feb84d (Albert So      2018-03-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 laboris 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
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  8)
    eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000  9) Annotates each line in the given file with information from the revision which last modified the line. Optionally, start annotating from the given revision.
    eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000 10)
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 11) Creating a line to support documentation needs for git blame.
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 12)
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 13) Also, it is important to have a few of these commits to clearly reflect the who, the what and the when. This will help Kev get good screenshots when he runs the git blame on this README.

Данный пример содержит первые 13 строк файла README.md. Рассмотрим подробно одну из строк. В таблице показано содержимое строки 3, столбцы таблицы соответствуют содержимому.

Идентификатор

Автор

Временная отметка

Номер строки

Содержимое строки

89feb84d

Автор

Albert So

Временная отметка

2018-03-01 00:54:03 +0000

Номер строки

3

Содержимое строки

This repository is an example of a project with multiple contributors making commits.

Вывод команды blame позволяет сделать ряд наблюдений. Всего перечислено три автора: ответственный за сопровождение проекта Kev Zettler, а также Albert So и Juni Mukherjee. Сведения об авторах — как правило, самая ценная часть вывода git blame. Полезны также временные отметки, а само внесенное изменение отображается в столбце содержимого строки.

Распространенные опции


git blame -L 1,5 README.md

Параметр -L позволяет ограничить вывод указанным диапазоном строк. В данном примере задан вывод строк с 1 по 5.

git blame -e README.md

Параметр -e позволяет отобразить адреса электронной почты авторов вместо имен пользователей.

git blame -w README.md

Параметр -w предписывает игнорировать изменения пробелов. Если предыдущий автор изменил пробелы в файле, заменив знаки табуляции на пробелы или добавив новые строки, эти изменения будут отражены в выводе git blame. В результате правильно интерпретировать вывод будет непросто.

git blame -M README.md

Параметр -M позволяет находить перемещенные или скопированные строки внутри одного и того же файла. При этом будет указываться первоначальный автор строк, а не автор, который последним переместил или скопировал строки.

git blame -C README.md

Параметр -C позволяет находить строки, которые были перемещены или скопированы из других файлов. При этом будет указываться первоначальный автор строк, а не автор, который последним переместил или скопировал строки.

Git blame vs git log


While git blame displays the last author that modified a line, often times you will want to know when a line was originally added. This can be cumbersome to achieve using git blame. It requires a combination of the -w, -C, and -M options. It can be far more convenient to use the git log command.

Чтобы вывести список всех первоначальных коммитов, в которых был добавлен или изменен определенный фрагмент кода, нужно выполнить команду git log с параметром -S и добавлением искомого кода. Приведем в качестве примера строку вывода команды blame для файла README. Рассмотрим фрагмент «CSS3D and WebGL renderers» из строки 12.

$ git log -S"CSS3D and WebGL renderers." --pretty=format:'%h %an %ad %s'
    e339d3c85 Mario Schuettel Tue Oct 13 16:51:06 2015 +0200 reverted README.md to original content
    509c2cc35 Daniel Tue Sep 8 13:56:14 2015 +0200 Updated README
    cb20237cc Mr.doob Mon Dec 31 00:22:36 2012 +0100 Removed DOMRenderer. Now with the CSS3DRenderer it has become irrelevant.

This output shows us that content from the README was added or modified 3 times by 3 different authors. It was originally added in commit cb20237cc by Mr.doob. In this example, git log has also been prepended with the --pretty-format option. This option converts the default output format of git log into one that matches the format of git log. For more information on usage and configuration options visit the git log page.

Резюме


The git blame command is used to examine the contents of a file line by line and see when each line was last modified and who the author of the modifications was. The output format of git blame can be altered with various command line options. Online Git hosting solutions like Bitbucket offer blame views, which offer a superior user experience to command line git blame usage. git blame and git log can be used in combination to help discover the history of a file's contents. The git log command has some similar blame functionality, to learn more visit the git log overview page.


Поделитесь этой статьей
Следующая тема

Рекомендуемые статьи

Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.

Люди сотрудничают друг с другом, используя стену со множеством инструментов

Блог Bitbucket

Рисунок: DevOps

Образовательные программы DevOps

Демонстрация функций в демо-зале с участием экспертов Atlassian

Как инструмент Bitbucket Cloud работает с Atlassian Open DevOps

Подпишитесь на информационную рассылку по DevOps

Thank you for signing up