git blame: кто и когда изменил каждую строку
Обновлено 31 июля 2026 г.
git blame <файл> печатает файл построчно и приписывает к каждой строке коммит, автора и дату, когда эта строка получила нынешний вид.
Нужно это, когда в файле нашлась непонятная строка: странное значение в настройках или закомментированный кусок, который никто не объясняет. Blame отвечает, в каком коммите строка появилась, а по коммиту находится сообщение и всё, что менялось рядом.
$ git blame report.txt
^3d8599d (Anna Petrova 2025-02-14 10:12:00 +0300 1) Отчёт за третий квартал
^3d8599d (Anna Petrova 2025-02-14 10:12:00 +0300 2)
9bc5bb09 (Ivan Sokolov 2025-03-03 14:22:10 +0300 3) Продажи выросли на 12%.
9bc5bb09 (Ivan Sokolov 2025-03-03 14:22:10 +0300 4) В команду взяли двух человек.Колонок четыре. Первая - сокращённый хеш коммита. В скобках автор этого коммита, дата со временем и часовым поясом, и номер строки в файле. После закрывающей скобки идёт сама строка, как она выглядит сейчас. Первые две строки лежат нетронутыми с февраля, третью и четвёртую в марте писал другой человек.
Знак ^ перед хешем у первых двух строк значит, что они пришли из самого раннего коммита в рассматриваемом промежутке, обычно из первого коммита репозитория. Хеш при этом печатается на один знак короче, чтобы колонка не разъехалась.
Полезные флаги:
$ git blame -L 3,4 report.txt # только строки с третьей по четвёртую
$ git blame -w report.txt # не считать правкой изменение пробелов
$ git blame -C report.txt # искать строки, перенесённые из других файлов-L спасает в длинных файлах: вывод blame по файлу на тысячу строк читать невозможно.
От строки к коммиту
Хеш из первой колонки - обычный хеш, и следующий шаг почти всегда один: посмотреть коммит целиком.
$ git show 9bc5bb09
commit 9bc5bb094f1a5665665fe922f7f9bddf8e1e3cc5
Author: Ivan Sokolov <ivan@example.com>
Date: Mon Mar 3 14:22:10 2025 +0300
цифры по продажам и найму
diff --git a/report.txt b/report.txtТут видно сообщение, остальные файлы того же коммита и весь его diff. Строка из blame перестаёт быть одинокой: становится понятно, частью какой работы она была.
Частые ошибки
Blame показывает последнюю правку строки, а не её происхождение. Массовое переформатирование или переименование файла делает автором всех строк того, кто это переформатирование закоммитил, и настоящая история уходит на слой глубже. Отсюда флаги -w и -C: первый пропускает правки одних лишь пробелов, второй ищет строки, переехавшие из других файлов. Если и это не помогло, возьми хеш «пустого» коммита и повтори blame на его родителе: git blame 9bc5bb09^ -- report.txt.
Второе. Название команды сбивает с толку: blame отвечает на вопрос «кто написал», а не «кто виноват». Строка могла быть верной три года и сломаться от изменения совсем в другом месте, а автор коммита мог просто перенести чужой текст.