Просмотр истории: log, show и diff

Три команды, которые отвечают на вопросы «кто это сделал?», «что в этом коммите?» и «что я наменял?».

git log — лента истории

Команда git log показывает список коммитов от свежих к старым:

git log

Вывод:

commit a1b2c3d4e5f6 (HEAD -> main)
Author: Ivan Petrov <[email protected]>
Date:   Sat Jun 14 12:30:00 2025

    Добавить форму входа

commit 9f8e7d6c5b4a
Author: Ivan Petrov <[email protected]>
Date:   Sat Jun 14 11:05:00 2025

    Инициализировать проект

Полный вывод многословен. На практике чаще пользуются компактными вариантами:

git log --oneline           # по одной строке на коммит
git log --oneline --graph   # плюс ASCII-граф веток
git log -p                  # с изменениями (патчем) каждого коммита
git log -5                  # только 5 последних

Вывод для --oneline:

a1b2c3d Добавить форму входа
9f8e7d6 Инициализировать проект

git show — заглянуть в коммит

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

git show a1b2c3d

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

git diff — что изменилось

Команда git diff сравнивает разные состояния. Важно понимать, что она сравнивает по умолчанию:

КомандаСравнивает
git diffрабочую директорию с индексом (что ещё не в staging)
git diff --stagedиндекс с последним коммитом (что войдёт в коммит)
git diff HEADрабочую директорию с последним коммитом
git diff abc123 def456два конкретных коммита между собой

Типичный вывод diff:

Вывод:

diff --git a/app.py b/app.py
@@ -1,3 +1,4 @@
 def main():
-    print("hi")
+    print("Hello, world")
+    return 0

Строки с - удалены, с + — добавлены. Запускайте git diff --staged прямо перед коммитом, чтобы проверить, что именно вы фиксируете.

Поиск по истории

История ценна тем, что в ней можно искать. Несколько практичных приёмов git log:

git log --author="Ivan"          # коммиты конкретного автора
git log --grep="баг"              # коммиты, где в сообщении есть слово
git log --since="2 weeks ago"     # за последние две недели
git log -- app.py                  # история изменений одного файла

Эти фильтры превращают историю из простого списка в инструмент расследования: «когда сломалась эта функция?», «кто и зачем трогал этот файл?». В реальной работе такие вопросы возникают постоянно.

git blame — кто написал строку

Отдельная полезная команда — git blame. Она показывает для каждой строки файла, в каком коммите и кем она была добавлена:

git blame app.py

Несмотря на «обвиняющее» название, цель тут не искать виноватых, а понять контекст: найдя коммит, вы прочитаете его сообщение и поймёте, зачем строку написали.

Итог

  • git log --oneline — быстрый обзор истории коммитов.
  • git show <хеш> — содержимое конкретного коммита.
  • git diff сравнивает рабочую директорию с индексом, --staged — индекс с коммитом.
Проверьте себя
1. Что выводит команда git log --oneline?
AПолные изменения каждого коммита
BИсторию коммитов по одной краткой строке на каждый
CТолько текущую ветку без коммитов
DСписок удалённых репозиториев
2. Что по умолчанию сравнивает команда git diff (без аргументов)?
AДва последних коммита
BРабочую директорию с индексом
CЛокальный и удалённый репозитории
DИндекс с последним коммитом
3. Какой командой проверить, что именно войдёт в следующий коммит?
Agit diff
Bgit diff --staged
Cgit log
Dgit show HEAD~1
Поддержать проект