git basic

git log

Показать историю коммитов репозитория с гибкими возможностями фильтрации и форматирования

Описание

git log выводит историю коммитов — от самого нового к самому старому. По умолчанию для каждого коммита показываются: хеш, автор, дата и сообщение. Команда крайне гибка: её можно адаптировать под любую задачу через флаги форматирования, фильтрации по автору/дате/тексту, ограничения диапазона коммитов и пути к файлам.

Особую ценность представляет возможность визуализировать граф ветвления: флаги --graph и --all дают ASCII-картину всей истории со всеми ветками. Это незаменимо при разборе сложных слияний и rebase-операций.

git log умеет также показывать diff каждого коммита (-p), статистику изменений (--stat) и фильтровать по содержимому изменений (-S, -G). Поиск коммитов, в которых появилась или исчезла конкретная строка кода, — одна из мощнейших возможностей.

Синтаксис

git log [ОПЦИИ] [<диапазон-ревизий>] [[--] <путь>…]
# Последние 10 коммитов git log -10 # История одного файла git log -- src/auth.py # Все ветки, граф git log --oneline --graph --all # Диапазон: коммиты в feature, которых нет в main git log main..feature

Флаги и опции

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

ФлагОписание
--onelineСжатый формат: короткий хеш + первая строка сообщения. Идеально для быстрого просмотра истории.
--graphНарисовать ASCII-граф истории ветвлений слева от списка коммитов.
--allПоказать коммиты из всех веток, тегов и remote-tracking refs, а не только из текущей ветки.
--decorate[=<режим>]Показать имена веток и тегов рядом с коммитами. Режимы: short (по умолчанию), full, no.
--format=<формат>Задать формат вывода. Псевдонимы: --pretty=oneline, short, medium, full, fuller, reference, email, raw.
--pretty=format:<…>Произвольный формат с плейсхолдерами: %H (полный хеш), %h (короткий), %an (автор), %ae (email автора), %ad (дата), %s (тема), %b (тело).
--date=<формат>Формат даты: relative («3 дня назад»), short (YYYY-MM-DD), iso, rfc, unix, local.
--abbrev-commitПоказывать сокращённый хеш (обычно 7 символов). Используется вместе с --format.
--no-mergesНе показывать merge-коммиты (с двумя и более родителями).
--mergesПоказывать только merge-коммиты.
--first-parentСледовать только первому родителю merge-коммитов. Удобно для просмотра «линейной» истории main-ветки.

Ограничение и фильтрация

ФлагОписание
-n <число> / -<число>Показать только последние N коммитов.
--since=<дата> / --afterПоказать коммиты после указанной даты: "2024-01-01", "yesterday", "2 weeks ago".
--until=<дата> / --beforeПоказать коммиты до указанной даты.
--author=<шаблон>Фильтровать по имени или email автора (регулярное выражение).
--committer=<шаблон>Фильтровать по коммитеру.
--grep=<шаблон>Искать коммиты, сообщение которых содержит шаблон.
-S <строка>Pickaxe: найти коммиты, в которых количество вхождений строки изменилось (появилась или исчезла).
-G <regex>Как -S, но регулярное выражение — ищет коммиты, где строка в diff совпадает с паттерном.

Вывод diff и статистики

ФлагОписание
-p / --patchПоказать полный diff каждого коммита.
--statСтатистика изменений: количество изменённых файлов, вставок и удалений для каждого коммита.
--shortstatТолько итоговая строка статистики.
--name-onlyПоказать только имена изменённых файлов (без diff).
--name-statusИмена файлов с кодами изменений (A/M/D/R).
--followСледить за переименованием файла в истории (используется с указанием конкретного файла).

Паттерны использования

Красивый граф всех веток (алиас)

# Добавить алиас lg
git config --global alias.lg \
  "log --oneline --graph --all --decorate"

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

# Вывод (пример):
# * a1b2c3d (HEAD -> main) feat: add auth
# * | e4f5g6h (feature) wip: experiment
# |/
# * i7j8k9l chore: initial setup

История конкретного файла

# Кто и когда изменял файл
git log --oneline --follow -- src/auth.py

# С diff каждого изменения
git log -p -- src/auth.py

# Только имена файлов в каждом коммите
git log --name-only -- src/

Поиск коммита по содержимому (pickaxe)

# Найти, где впервые появилась функция
git log -S "def calculate_tax"

# Найти по регулярному выражению
git log -G "password\s*=\s*['\"]"

# Показать diff найденных коммитов
git log -S "API_KEY" -p

Фильтрация по автору и времени

# Коммиты конкретного автора за последнюю неделю
git log --author="Ivan" --since="1 week ago" --oneline

# Коммиты в диапазоне дат
git log --since="2024-01-01" --until="2024-03-31" \
  --author="team@company.com"

# Между двумя тегами
git log v1.0..v2.0 --oneline

Кастомный формат для скриптов

# Хеш | автор | дата | тема
git log --pretty=format:"%h | %an | %ad | %s" \
  --date=short

# JSON-подобный вывод
git log --pretty=format:'{"hash":"%H","author":"%an","msg":"%s"}'

# Список хешей для скриптов
git log --pretty=format:"%H" -20

Коммиты ветки, которых нет в main

# Что есть в feature, но нет в main
git log main..feature --oneline

# Что добавилось в main с момента создания feature
git log feature..main --oneline

# Симметричная разница (в обеих ветках, но не в общей)
git log main...feature --oneline --left-right

Советы и подводные камни

Совет: создайте несколько алиасов для разных задач
git config --global alias.lg "log --oneline --graph --all --decorate" — для обзора веток
git config --global alias.ll "log --oneline --stat -10" — последние 10 коммитов со статистикой
git config --global alias.who "log --pretty=format:'%h %an %s' --no-merges" — кто что делал
Совет: -S и -G — мощный инструмент для аудита
Флаг -S "строка" (pickaxe) незаменим при отладке: «в каком коммите эта функция впервые появилась?», «кто удалил эту проверку?». В отличие от --grep, он ищет по содержимому изменений, а не сообщениям коммитов.
Внимание: git log без --all показывает только текущую ветку
По умолчанию git log обходит только коммиты, достижимые из HEAD. Коммиты в других ветках не видны. Всегда добавляйте --all, если нужна полная картина репозитория, особенно при поиске «потерянных» коммитов.