git log
Показать историю коммитов репозитория с гибкими возможностями фильтрации и форматирования
Описание
git log выводит историю коммитов — от самого нового к самому старому. По умолчанию для каждого коммита показываются: хеш, автор, дата и сообщение. Команда крайне гибка: её можно адаптировать под любую задачу через флаги форматирования, фильтрации по автору/дате/тексту, ограничения диапазона коммитов и пути к файлам.
Особую ценность представляет возможность визуализировать граф ветвления: флаги --graph и --all дают ASCII-картину всей истории со всеми ветками. Это незаменимо при разборе сложных слияний и rebase-операций.
git log умеет также показывать diff каждого коммита (-p), статистику изменений (--stat) и фильтровать по содержимому изменений (-S, -G). Поиск коммитов, в которых появилась или исчезла конкретная строка кода, — одна из мощнейших возможностей.
Синтаксис
- <диапазон-ревизий> — например
main..feature,HEAD~5,v1.0..v2.0. - [--] <путь> — ограничить историю коммитами, затронувшими указанные файлы.
Флаги и опции
Форматирование вывода
| Флаг | Описание |
|---|---|
--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 "строка" (pickaxe) незаменим при отладке: «в каком коммите эта функция впервые появилась?», «кто удалил эту проверку?». В отличие от --grep, он ищет по содержимому изменений, а не сообщениям коммитов.
По умолчанию
git log обходит только коммиты, достижимые из HEAD. Коммиты в других ветках не видны. Всегда добавляйте --all, если нужна полная картина репозитория, особенно при поиске «потерянных» коммитов.