$ sudo teach IT
Модуль 2 · Первые коммиты · Урок 2.4

История коммитов

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

Теория + практика~20 минутНовичокgit loggit show

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> пока не исправляйте):

HTML · index.html
<!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. В следующем уроке вы пройдёте его самостоятельно и закроете последний коммит модуля.

На следующий урок