↓Перейти к содержанию
  1. Git: руководства и команды/

git blame: кто и когда изменил строку в файле

·7 минут·

Что такое git blame #

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

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

Зачем нужна команда git blame #

Вот несколько практических сценариев, когда git blame становится незаменимым:

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

  2. Поиск источника бага — странное поведение программы часто можно отследить до коммита, в котором была введена проблема. Это помогает быстро найти нужную строку.

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

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

Базовый синтаксис #

Самая простая форма команды:

git blame file.py

Эта команда выводит для каждой строки файла file.py информацию о том, в каком коммите она была последний раз изменена.

Разбор вывода #

Типичный вывод выглядит так:

d3a4b2c1 (Иван Петров     2024-12-10 14:23:45 +0300   1) def hello():
d3a4b2c1 (Иван Петров     2024-12-10 14:23:45 +0300   2)     print("Hello")
a1b2c3d4 (Мария Сидорова  2024-12-09 09:15:30 +0300   3)     print("World")

Каждая строка содержит:

  • Хэш коммита (первые 8 символов) — d3a4b2c1
  • Имя автора — Иван Петров
  • Дата и время — 2024-12-10 14:23:45 +0300
  • Номер строки — 1, 2, 3
  • Содержимое строки — код

Полезные опции #

git blame имеет множество полезных флагов для фильтрации и форматирования вывода.

Ограничение по диапазону строк #

Часто нужно посмотреть историю только для части файла:

# Строки 10-20
git blame -L 10,20 file.py

# 10 строк начиная со строки 10
git blame -L 10,+10 file.py

# От строки 5 до конца файла
git blame -L 5,- file.py

Игнорирование пробельных символов #

При рефакторинге кода часто меняется только форматирование. Флаг -w (или --ignore-all-space) игнорирует такие изменения:

git blame -w file.py

Отслеживание перемещённых и скопированных строк #

При рефакторинге код часто перемещается или копируется. Используйте эти флаги:

# Отслеживать перемещённые строки
git blame -M file.py

# Отслеживать скопированные строки
git blame -C file.py

# Комбинация: использовать оба алгоритма
git blame -M -C file.py

Отслеживание после переименования файла #

Если файл был переименован, используйте --follow:

git blame --follow old_name.py

Git blame на момент конкретного коммита #

Иногда нужно узнать историю файла на момент конкретного коммита:

git blame <commit> -- file.py

# Пример: узнать историю на момент коммита HEAD~5
git blame HEAD~5 -- file.py

Форматирование вывода #

Для более детального вывода используйте опции форматирования:

# Показать email вместо имени
git blame -e file.py

# Показать дату в ISO формате
git blame --date=iso file.py

# Показать дату в относительном формате (5 days ago)
git blame --date=relative file.py

# Длинный вывод с дополнительной информацией
git blame -l file.py

Форматирование и кастомизация #

Помимо стандартных опций, можно кастомизировать формат вывода:

# Показать полный хэш коммита вместо сокращённого
git blame -l file.py

# Показать порцеленовый формат (machine-readable)
git blame --porcelain file.py

# Комбинация: email, длинный хэш и релятивная дата
git blame -e -l --date=relative file.py

Использование git blame в IDE #

Современные интегрированные среды разработки имеют встроенную поддержку git blame или расширения для неё.

VS Code #

В VS Code используется расширение GitLens, которое показывает информацию о последнем коммите прямо в коде:

const x = 10;  // Иван Петров (10 дней назад) commit: Добавлена переменная x

Как установить:

  1. Откройте Extensions (Ctrl+Shift+X)
  2. Найдите “GitLens”
  3. Нажмите Install

Как использовать:

  • Наведите курсор на строку кода — увидите информацию о коммите
  • Кликните на инфу — откроется детальная информация о коммите
  • Ctrl+Shift+P → “GitLens: Blame” для открытия полного вывода

IntelliJ IDEA / WebStorm #

В JetBrains IDE встроена команда “Annotate”:

  1. Откройте файл
  2. Нажмите View → Annotate (или используйте контекстное меню)
  3. Справа появится панель с информацией о каждой строке

Горячая клавиша обычно: Ctrl+Alt+A (Windows/Linux) или Cmd+Alt+A (Mac)

Sublime Text #

Используйте плагин “GitGutter” или “Git”:

  1. Ctrl+Shift+P → “Package Control: Install Package”
  2. Поищите “Git” или “GitGutter”
  3. После установки команда git blame будет доступна через контекстное меню

git blame на GitHub #

GitHub имеет встроенную поддержку git blame в веб-интерфейсе.

Как использовать #

  1. Откройте репозиторий на GitHub
  2. Перейдите к интересующему вас файлу
  3. Нажмите кнопку “Blame” (рядом с “Edit” и “Raw”)
  4. Вы увидите аннотированный вывод для каждой строки

На GitHub вывод интерактивен:

  • Кликните на хэш коммита — откроется информация о коммите
  • Кликните на имя автора — откроется его профиль
  • Кликните на дату — откроется коммит

Это удобно для быстрого анализа без использования терминала.

Практический пример: поиск источника бага #

Давайте рассмотрим реальный сценарий, когда нужно найти когда и кем был введён баг.

Ситуация: вы нашли странный код в файле auth.py:

def validate_token(token):
    # Это очень странно, почему здесь hardcoded значение?
    if token == "magic-token-12345":
        return True
    return False

Шаг 1: используем git blame для поиска:

git blame auth.py | grep "magic-token"

Вывод:

a1b2c3d4 (Павел Иванов     2024-11-15 16:42:00 +0300   42) if token == "magic-token-12345":

Шаг 2: смотрим детали коммита:

git show a1b2c3d4

Вывод:

commit a1b2c3d4567890abcdef1234567890abcdef1234
Author: Павел Иванов <[email protected]>
Date:   Wed Nov 15 16:42:00 2024 +0300

    Quick fix for testing - TEMPORARY!

diff --git a/auth.py b/auth.py
index 1234567..abcdefg 100644
--- a/auth.py
+++ b/auth.py
@@ -40,7 +40,7 @@ def validate_token(token):
-    return check_against_database(token)
+    if token == "magic-token-12345":
+        return True
     return False

Шаг 3: теперь вы знаете:

  • Это был временный коммит для тестирования
  • Был написан Павелом Иванов
  • Это был баг, введённый 15 ноября

Шаг 4: можете связаться с Павелом и спросить, нужно ли это исправлять, или посмотреть в истории коммитов, был ли он позже переделан.

Альтернативы git blame #

Иногда git blame — не лучший инструмент. Рассмотрите альтернативы:

Поиск по содержимому: git log -S #

Если вы хотите найти когда была добавлена или удалена конкретная строка:

# Найти коммиты, где появилась или исчезла строка "magic-token"
git log -S "magic-token" --all

# С названием файла
git log -S "magic-token" --all -- auth.py

Поиск по регулярному выражению: git log -G #

Для более гибкого поиска используйте регулярные выражения:

# Найти коммиты с изменениями по паттерну
git log -G "def validate_.*\(" --all

История конкретной функции: git log -L #

Современная альтернатива git blame — просмотр истории функции:

# История функции validate_token в файле auth.py
git log -L :validate_token:auth.py

Эти команды часто дают лучший контекст, чем git blame.

Ограничения git blame #

Несмотря на полезность, git blame имеет ограничения.

Проблема с rebase и squash #

Когда вы делаете git rebase или git squash, история переписывается и авторство может измениться. Исходные авторы теряются.

Массовый рефакторинг и переформатирование #

Когда весь репозиторий проходит через форматирование (например, запуск black для Python или prettier для JavaScript), это создаёт огромный коммит, который “загрязняет” git blame:

git blame file.py
# Все строки будут показывать коммит форматирования вместо реальных авторов!

Решение: .git-blame-ignore-revs #

Для этого используется файл .git-blame-ignore-revs:

# Создайте файл .git-blame-ignore-revs в корне репозитория
echo "a1b2c3d4 # Formatting with prettier" >> .git-blame-ignore-revs

# Используйте при вызове git blame
git blame --ignore-revs-file=.git-blame-ignore-revs file.py

# Или установите конфиг
git config blame.ignoreRevsFile .git-blame-ignore-revs

После этого git blame будет игнорировать указанные коммиты и показывать реальных авторов.

FAQ: Часто задаваемые вопросы #

Что делает команда git blame? #

Команда git blame показывает для каждой строки файла информацию о том, в каком коммите она была последний раз изменена, кто это сделал и когда. Это помогает отследить историю изменений конкретных строк кода.

Как посмотреть кто написал строку в git? #

Используйте команду:

git blame filename.py | grep "номер строки"

Или смотрите весь файл:

git blame filename.py

В IDE используйте встроенные инструменты (GitLens в VS Code, Annotate в IntelliJ).

Как ограничить git blame по строкам? #

Используйте опцию -L (или --lines):

# Строки 10-20
git blame -L 10,20 file.py

# От строки 5 до конца
git blame -L 5,- file.py

Есть ли git blame в VS Code? #

Да, через расширение GitLens. После установки вы увидите информацию о коммитах прямо в коде при наведении на строку.

Почему git blame показывает неправильного автора? #

Причины могут быть:

  • Rebase или squash — переписали историю
  • Массовое переформатирование — форматирующий коммит скрывает реальное авторство
  • Перемещение кода — используйте опции -M и -C

Используйте .git-blame-ignore-revs для игнорирования форматирующих коммитов.

Как найти историю изменений конкретной строки? #

Используйте несколько подходов:

  1. git blame + git show:
git blame file.py           # Найти коммит
git show <commit>           # Посмотреть детали
  1. git log для конкретной строки:
git log -L 10,20:file.py    # История строк 10-20
  1. git log с поиском:
git log -S "искомый текст" --all    # Найти коммиты с изменением текста

Заключение #

Команда git blame — это мощный инструмент для понимания истории кода. Она помогает:

  • Находить источники багов
  • Понимать причины написания кода
  • Связываться с правильными людьми в команде
  • Отслеживать эволюцию проекта

Комбинируйте git blame с другими командами /ru/git/git-log/, /ru/git/git-commit/ и /ru/git/git-show/ для глубокого анализа истории проекта.

В современных IDE интеграция git blame встроена, что делает работу с историей кода ещё удобнее. Используйте эти инструменты регулярно, и вы станете более эффективным разработчиком.

Помните: git blame — это не способ обвинить кого-то, а инструмент для сотрудничества и понимания кода в команде!