git reflog: журнал перемещений HEAD
Обновлено 31 июля 2026 г.
git reflog показывает список всех мест, где стоял HEAD, и хранит хеши даже тех коммитов, которые уже пропали из git log. Это главная страховка в git: пока хеш есть в журнале, коммит можно вернуть.
$ git reflog
024f79c HEAD@{0}: reset: moving to HEAD~1
ef4b778 HEAD@{1}: commit: черновик, который не пригодился
024f79c HEAD@{2}: revert: Revert "поправил опечатки"
fb4dceb HEAD@{3}: commit: поправил опечаткиЧитается сверху вниз, от свежего к старому. HEAD@{0} - место, где ты стоишь сейчас, HEAD@{1} - где стоял шагом раньше. Слева хеш коммита, справа причина перемещения: commit, checkout, merge, reset, revert. Git пишет сюда каждое движение HEAD сам, без твоего участия.
Отсюда и вся страховка. В примере выше reset снёс коммит ef4b778, и в git log его больше нет. Но хеш остался в журнале, а по хешу коммит возвращается:
$ git reset --hard ef4b778 # вернуть ветку на потерянный коммит
HEAD is now at ef4b778 черновик, который не пригодился
$ git switch -c rescue ef4b778 # или вытащить его в отдельную ветку
Switched to a new branch 'rescue'Ссылку HEAD@{2} можно подставлять вместо хеша куда угодно: git show HEAD@{2}, git diff HEAD@{5}. У каждой ветки есть свой журнал, git reflog show main покажет перемещения только этой ветки.
Две оговорки. Reflog локальный: он лежит в твоей копии репозитория, на сервере его нет и у коллеги его нет. В свежем клоне журнал состоит из одной строки clone: from ..., потому что история перемещений начинается заново. И записи не вечные: по умолчанию они хранятся 90 дней, а те, что ведут на коммиты, до которых уже не добраться ни по одной ветке, - 30 дней.
Частые ошибки
HEAD@{2} и HEAD~2 выглядят похоже и значат разное. Первое - «где HEAD стоял два шага назад по времени», второе - «два коммита назад по истории». Совпадают они редко: переключение веток двигает HEAD, но по истории никуда не идёт.
Reflog не хранит содержимое рабочего каталога, только перемещения указателей. Правки, которые не попали ни в коммит, ни в индекс, ни в git stash, после git reset --hard не вернуть ничем. Отсюда и совет коммитить чаще: мелкий коммит потом сливается с соседним, а несуществующий - никак.
Где это в учебнике
Reflog и спасение потерянных коммитов разобраны в восьмой главе.
Глава 8. Аптечка: когда что-то пошло не так
Потренироваться руками - в Песочнице: настоящий терминал с git и проверка шагов.