Модуль 04 — История и сравнение версий

Найти нужный коммит, увидеть, что изменилось, достать старую версию файла

Прогресс курса Модуль 4 из 9

Что вы освоите в этом модуле

01

git log

$ git log
commit a3f9c21e8b4d0f6a91c2e7d35b80f14c6a92d7e3 (HEAD -> main)
Author: Анна Смирнова <anna@example.ru>
Date:   Tue Sep 15 18:42:10 2026 +0300

    Добавить форму обратной связи

commit 7b04e8d5c1f9a2e6b3d8c0f47a1e9b25d6c3f804
Author: Анна Смирнова <anna@example.ru>
Date:   Mon Sep 14 21:05:33 2026 +0300

    Исправить ширину шапки на телефонах

Коммиты идут от новых к старым. (HEAD -> main) — вы находитесь на ветке main, и она указывает на этот коммит. Длинный вывод открывается в программе просмотра: пробел — следующая страница, q — выход.

ФлагЧто делает
--onelineОдна строка на коммит: короткий хеш и сообщение
--graphРисует ветки и слияния псевдографикой
--allВсе ветки, а не только текущая
-n 5Только 5 последних коммитов
--statКакие файлы изменены и сколько строк
-pПолный текст изменений каждого коммита
-- <файл>Только коммиты, изменявшие этот файл

Самая полезная комбинация — вся история с ветками в компактном виде:

$ git log --oneline --graph --all
* a3f9c21 (HEAD -> main) Добавить форму обратной связи
* 7b04e8d Исправить ширину шапки на телефонах
* e15d2f0 Первая версия главной страницы
Длинную команду можно сохранить как псевдоним: git config --global alias.lg "log --oneline --graph --all". Дальше достаточно набрать git lg.
02

Поиск в истории

# по автору и дате
$ git log --author="Анна" --since="2026-09-01" --until="2026-09-15"

# по сообщению коммита
$ git log --oneline --grep="форм"
a3f9c21 Добавить форму обратной связи
f3a01c9 Исправить отправку формы при пустом телефоне

# по содержимому: коммиты, где строка появилась или исчезла
$ git log --oneline -S "telegram"
b82e4d1 Перенести контакты в подвал страницы

Поиск -S отвечает на вопрос, который по сообщениям не решить: «когда из страницы пропала ссылка на Telegram?»

03

Как сослаться на коммит

ЗаписьЧто значит
a3f9c21Коммит по началу хеша (достаточно 4–7 символов, если нет совпадений)
HEADТекущий коммит — тот, на котором вы находитесь
HEAD~1, HEAD~Родитель текущего коммита
HEAD~3Три коммита назад
mainПоследний коммит ветки main
v1.0Коммит, отмеченный тегом (модуль 08)

Везде, где команда ждёт коммит, подходит любая из этих записей: git show HEAD~2, git diff main a3f9c21.

04

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

Что сравнивает git diff, зависит от аргументов. Это частая путаница — запомните таблицу:

КомандаСравниваетВопрос
git diffРабочий каталог ↔ индексЧто я изменил, но ещё не добавил?
git diff --stagedИндекс ↔ последний коммитЧто войдёт в следующий коммит?
git diff HEADРабочий каталог ↔ последний коммитВсе мои несохранённые изменения
git diff A BКоммит A ↔ коммит BЧто изменилось между версиями?
$ git diff
diff --git a/index.html b/index.html
index 3e1f0a2..8c4d7b9 100644
--- a/index.html
+++ b/index.html
@@ -8,7 +8,7 @@
   <header>
-    <h1>Портфолио</h1>
+    <h1>Портфолио Анны Смирновой</h1>
     <nav>

Как читать вывод

  • --- a/ — старая версия, +++ b/ — новая.
  • @@ -8,7 +8,7 @@ — фрагмент: в старой версии с 8-й строки 7 строк, в новой — тоже.
  • Строки с - удалены, с + добавлены, без знака — контекст для ориентира.
  • Изменённая строка показывается как удалённая и добавленная.

Если git diff ничего не выводит, а изменения точно есть — скорее всего, они уже в индексе. Проверьте git diff --staged.

05

git show и git blame

git show выводит один коммит: автора, дату, сообщение и изменения.

$ git show --stat HEAD~1
commit 7b04e8d5c1f9a2e6b3d8c0f47a1e9b25d6c3f804
Author: Анна Смирнова <anna@example.ru>
Date:   Mon Sep 14 21:05:33 2026 +0300

    Исправить ширину шапки на телефонах

 css/style.css | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

# файл в том виде, каким он был в коммите
$ git show e15d2f0:index.html

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

$ git blame -L 10,12 index.html
e15d2f0 (Анна Смирнова 2026-09-12 10:15:02 +0300 10)   <nav>
b82e4d1 (Иван Петров   2026-09-14 16:40:51 +0300 11)     <a href="#contacts">Контакты</a>
e15d2f0 (Анна Смирнова 2026-09-12 10:15:02 +0300 12)   </nav>

Задача blame — найти не виноватого, а коммит: по его хешу и сообщению становится понятно, зачем строка написана именно так.

06

Вернуть файл из прошлой версии

Стилевой файл неделю назад работал, а сейчас нет. Достать его старую версию, не трогая остальные файлы и историю:

$ git log --oneline -- css/style.css
7b04e8d Исправить ширину шапки на телефонах
e15d2f0 Первая версия главной страницы

$ git restore --source=e15d2f0 css/style.css
$ git status -s
 M css/style.css

Файл в рабочем каталоге теперь такой, каким был в e15d2f0. История не изменилась. Если версия подошла — зафиксируйте её обычным коммитом; если нет — git restore css/style.css вернёт текущую.

Посмотреть весь проект в старом состоянии можно командой git switch --detach e15d2f0, вернуться — git switch main. Что такое отсоединённый HEAD — в модуле 05.

Ключевые выводы модуля

Запомните главное

  • git log --oneline --graph --all — вся история с ветками на одном экране
  • --grep ищет по сообщениям, -S — по изменённому тексту
  • git diff — не добавленное, git diff --staged — то, что войдёт в коммит
  • HEAD~N — N коммитов назад от текущего
  • git restore --source=<коммит> <файл> достаёт старую версию файла, не меняя историю
Практические задания — на учебном портале. Задания, критерии оценивания, сдача работ и оценки преподавателя — в курсе на portal.nevabit.ru. Учётную запись выдаёт преподаватель.
Модуль 03: Коммиты Все модули Модуль 05: Ветки