git log: список коммитов
git log в Git — команда, которая выводит историю коммитов проекта: кто, когда и с какой подписью делал каждый снимок. Вы научитесь читать эту историю, открывать любой коммит командой git show, сравнивать версии и сделаете четвёртый коммит проекта — раздел «Мои проекты».
У вас уже три коммита, и пока они лежат мёртвым грузом: вы знаете, что они есть, но не видели ни одного. История нужна не для красоты: по ней находят, когда появилась ошибка, что и зачем меняли, и к какому состоянию можно вернуться.
Простыми словами
Это журнал проекта, в котором самая свежая запись сверху. Каждая запись — один коммит: номер, автор, время и подпись.
$ git log
commit f58d529898831a96403f422de60313b3215dc0a0 (HEAD -> main)
Author: Алекс Иванов <alex@example.com>
Date: Tue Nov 10 10:30:00 2026 +0300
Добавить README
commit 8c239408c3da31296f8b36d330680533b1e338c5
Author: Алекс Иванов <alex@example.com>
Date: Tue Nov 10 10:20:00 2026 +0300
Добавить стили
commit 027a1503f2ec64bbb944044a8699b6a10df31d9d
Author: Алекс Иванов <alex@example.com>
Date: Tue Nov 10 10:00:00 2026 +0300
Добавить главную страницу
Разбор по строкам
commit f58d5298…— полный номер коммита: 40 символов из цифр и букв a–f. Это хеш (hash) коммита: уникальный «отпечаток», который Git вычисляет по содержимому снимка, автору, времени и подписи. Двух коммитов с одинаковым хешем не бывает.(HEAD -> main)— пометка у самого свежего коммита.HEADозначает «вы находитесь здесь»,main— имя ветки. Подробно HEAD разберём позже, пока читайте это как «вот последний коммит».Author— имя и почта из настроек Git.Date— когда сделан коммит и в каком часовом поясе (+0300— на три часа позже UTC).- Строка с отступом — сообщение коммита. Здесь видно, зачем нужны хорошие сообщения: историю читают именно по ним.
Новые коммиты выводятся сверху, старые снизу. Если коммитов много, вывод откроется в пейджере: листайте пробелом, выходите по q.
Короткий формат
Полный формат занимает много места. Для обзора есть git log --oneline: один коммит — одна строка.
$ git log --oneline
f58d529 (HEAD -> main) Добавить README
8c23940 Добавить стили
027a150 Добавить главную страницу
Слева — короткий хеш: первые 7 символов полного. Вы будете писать его в командах вместо длинного: Git достаточно, чтобы начало номера было однозначным (хотя бы 4 символа). Ваши хеши отличаются от наших, потому что зависят от даты, имени и содержимого, — это нормально, ориентируйтесь на сообщения.
Подробно — в документации: git log.
Что было в коммите: git show
Список подписей показывает, что делали, но не как именно. Содержимое любого коммита раскрывает git show: подпись плюс изменения, которые принёс этот коммит. Без аргументов команда показывает последний коммит (HEAD).
$ git show
commit f58d529898831a96403f422de60313b3215dc0a0 (HEAD -> main)
Author: Алекс Иванов <alex@example.com>
Date: Tue Nov 10 10:30:00 2026 +0300
Добавить README
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..38feced
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+# portfolio
+
+Личный сайт-визитка Алекса Иванова. Учебный проект курса по Git.
Верхняя часть — та же запись, что в git log, нижняя — уже знакомый по прошлому уроку diff. Строка --- /dev/null означает «раньше этого файла не было», а @@ -0,0 +1,3 @@ — «добавлены 3 строки с первой».
Чтобы открыть другой коммит, добавьте его хеш (достаточно короткого). Если нужна только краткая сводка без самих строк, подойдёт флаг --stat:
$ git show --stat 8c23940
commit 8c239408c3da31296f8b36d330680533b1e338c5
Author: Алекс Иванов <alex@example.com>
Date: Tue Nov 10 10:20:00 2026 +0300
Добавить стили
index.html | 1 +
style.css | 23 +++++++++++++++++++++++
2 files changed, 24 insertions(+)
Теперь видно, что коммит «Добавить стили» затронул два файла. Те же подробности можно получить прямо в списке истории:
| Команда | Что добавляет к git log |
|---|---|
git log --stat | под каждым коммитом — сводка по файлам |
git log -p | под каждым коммитом — полный diff (длинный вывод, нужен пейджер) |
git log --oneline | сжимает каждый коммит до одной строки |
Подробно — в документации: git show.
Сравнить версии
С git diff вы уже знакомы: он сравнивает рабочую папку с индексом. Но ему можно назвать и два коммита, тогда он покажет разницу между ними:
$ git diff 027a150 8c23940 --stat
index.html | 1 +
style.css | 23 +++++++++++++++++++++++
2 files changed, 24 insertions(+)
Первый хеш — «от чего считаем», второй — «до чего». Здесь это разница между первым коммитом и коммитом «Добавить стили», то есть то, что принёс второй коммит.
Тильда: на шаг назад
Хеши вспоминать неудобно, поэтому Git умеет считать от текущего места. HEAD — последний коммит, HEAD~1 — на один коммит назад (тильда ~ читается как «минус»), HEAD~2 — на два, и так далее. Поэтому сравнить последний коммит с предыдущим можно так:
$ git diff HEAD~1 HEAD
Если указать только git diff HEAD~1, Git сравнит с тем коммитом ваши текущие файлы. Когда всё закоммичено и рабочая папка чиста, результат совпадает с предыдущей командой.
Частая путаница: «последний коммит» и «последняя правка»
git show и git log рассказывают только о том, что уже закоммичено. Правка, сделанная в файле после последнего коммита, в них не видна: её покажет git diff. Если вы «видите свою правку в редакторе, но её нет в git show», значит, она ещё не закоммичена.
Хороший коммит
Историю читать приятно, когда она устроена по правилу «одна мысль — один коммит». Коммит «Добавить стили» делает одно дело. Коммит «Стили, README, правки» делает три, и если выяснится, что с одним из них что-то не так, откатить его, не затронув остальные, будет трудно.
- Маленькие коммиты. Закончили осмысленный кусок — закоммитьте. Не копите правки на полдня.
- Говорящая подпись. Читая
git log --oneline, вы должны понять, как рос проект, не открывая файлов. - Единый стиль. Мы пишем по-русски, глагол в инфинитиве, без точки. В англоязычных проектах то же самое по-английски:
Add styles,Fix typo in title. Главное — единообразие. - Рабочее состояние. После каждого коммита страница должна открываться без поломок.
Практика у себя
Сделаем четвёртый коммит и заодно поработаем с историей. Хеши в ваших выводах будут другими.
Шаг 1. Убедитесь, что в истории три коммита:
$ git log --oneline
f58d529 (HEAD -> main) Добавить README
8c23940 Добавить стили
027a150 Добавить главную страницу
Шаг 2. Добавьте в index.html раздел «Мои проекты» между разделом «Обо мне» и закрывающим </body>. Вот полный файл после правки (опечатку в <title> пока не исправляйте):
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Алекс Иванов - Визтка</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>Алекс Иванов</h1>
<p class="lead">Начинающий веб-разработчик</p>
<section id="about">
<h2>Обо мне</h2>
<p>Учусь программировать и делаю свой первый сайт.</p>
</section>
<section id="projects">
<h2>Мои проекты</h2>
<ul>
<li>Сайт-визитка</li>
<li>Список дел</li>
</ul>
</section>
</body>
</html>
Шаг 3. Посмотрите, что изменилось. В выводе должны быть только семь добавленных строк:
$ git diff
diff --git a/index.html b/index.html
index 5c2151d..a212cae 100644
--- a/index.html
+++ b/index.html
@@ -12,5 +12,12 @@
<h2>Обо мне</h2>
<p>Учусь программировать и делаю свой первый сайт.</p>
</section>
+ <section id="projects">
+ <h2>Мои проекты</h2>
+ <ul>
+ <li>Сайт-визитка</li>
+ <li>Список дел</li>
+ </ul>
+ </section>
</body>
</html>
Шаг 4. Подготовьте файл и сделайте коммит. Сообщение пишите дословно:
$ git add index.html
$ git commit -m "Добавить раздел «Мои проекты»"
[main cb00bb8] Добавить раздел «Мои проекты»
1 file changed, 7 insertions(+)
Шаг 5. Посмотрите историю. Теперь в ней четыре коммита, и метка HEAD -> main сдвинулась на новый:
$ git log --oneline
cb00bb8 (HEAD -> main) Добавить раздел «Мои проекты»
f58d529 Добавить README
8c23940 Добавить стили
027a150 Добавить главную страницу
Шаг 6. Откройте последний коммит и сравните разные места истории:
$ git show --stat
commit cb00bb89171bdaa7cc0ca232705e7c4aad9d7181 (HEAD -> main)
Author: Алекс Иванов <alex@example.com>
Date: Tue Nov 10 11:00:00 2026 +0300
Добавить раздел «Мои проекты»
index.html | 7 +++++++
1 file changed, 7 insertions(+)
$ git diff HEAD~3 HEAD --stat
README.md | 3 +++
index.html | 8 ++++++++
style.css | 23 +++++++++++++++++++++++
3 files changed, 34 insertions(+)
Разбор по строкам
git show --stat— краткая сводка последнего коммита: затронут один файл, добавлено 7 строк.git diff HEAD~3 HEAD --stat— сводка разницы между первым коммитом и сегодняшним: за три коммита появилось 34 строки в трёх файлах (вindex.htmlсуммарно 8 — 1 строка со стилями и 7 с проектами).
Проверьте себя
git log --onelineпоказывает четыре коммита, на вершине — «Добавить раздел «Мои проекты»».git statusговоритnothing to commit, working tree clean.- Вы можете найти в
git showстроки, добавленные в последнем коммите. - Вы понимаете, что
HEAD~1— это «на один коммит назад».
Частые ошибки
Длинный git log без --oneline. Когда коммитов десятки, полный формат тонет в тексте. Для обзора используйте git log --oneline, а подробности запрашивайте только по нужному коммиту через git show.
Вывод «завис» на двоеточии. Это пейджер. Нажмите q.
fatal: ambiguous argument … unknown revision or path not in the working tree. Вы написали хеш с опечаткой или которого в этой истории нет. Git ответит примерно так:
$ git show 8c2394x
fatal: ambiguous argument '8c2394x': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
Скопируйте хеш из git log --oneline и повторите. Остальные две строки сообщения про разделитель -- для вас сейчас не важны.
«В git show нет моей правки». Скорее всего, правка не закоммичена. Проверьте git status и git diff.
Что важно запомнить
git logпоказывает историю: новые коммиты сверху;--onelineсжимает вывод до одной строки на коммит.- Хеш — уникальный номер коммита. В командах хватает первых 7 (даже 4) символов.
git show <хеш>открывает один коммит с его изменениями; без хеша — последний.git diff <хеш1> <хеш2>сравнивает два коммита;HEAD~1— коммит на шаг назад.- Одна мысль — один коммит, и подпись объясняет, что он делает.
Теперь у вас есть всё нужное для рабочего цикла: правка, статус, diff, add, commit, log. В следующем уроке вы пройдёте его самостоятельно и закроете последний коммит модуля.