Найти нужный коммит, увидеть, что изменилось, достать старую версию файла
git log и настраивать вывод флагамиgit diffHEAD и HEAD~Ngit blame и доставать файл из прошлой версии$ 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.# по автору и дате
$ 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?»
| Запись | Что значит |
|---|---|
a3f9c21 | Коммит по началу хеша (достаточно 4–7 символов, если нет совпадений) |
HEAD | Текущий коммит — тот, на котором вы находитесь |
HEAD~1, HEAD~ | Родитель текущего коммита |
HEAD~3 | Три коммита назад |
main | Последний коммит ветки main |
v1.0 | Коммит, отмеченный тегом (модуль 08) |
Везде, где команда ждёт коммит, подходит любая из этих записей: git show HEAD~2, git diff main a3f9c21.
Что сравнивает 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.
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 — найти не виноватого, а коммит: по его хешу и сообщению становится понятно, зачем строка написана именно так.
Стилевой файл неделю назад работал, а сейчас нет. Достать его старую версию, не трогая остальные файлы и историю:
$ 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=<коммит> <файл> достаёт старую версию файла, не меняя историю