git reflog: восстановление
Журнал всех перемещений HEAD — аварийный инструмент для восстановления «потерянных» коммитов после reset, rebase или удаления ветки.
Зачем нужно
Даже после git reset --hard, git rebase или случайного удаления ветки коммиты в Git не исчезают мгновенно — они остаются в объектной базе до сборки мусора. git reflog показывает журнал всех позиций HEAD за последние 90 дней. Это «машина времени» репозитория: можно найти хэш потерянного коммита и восстановить его через git checkout или git reset.
Где используется
- Восстановление после ошибочного
git reset --hard - Нахождение коммитов из удалённой ветки
- Возврат к состоянию до неудачного rebase
- Диагностика: что происходило с веткой последние N операций
Основной контент
Просмотр reflog
# Полный reflog текущей ветки (HEAD)
git reflog
# Пример вывода:
# a1b2c3d (HEAD -> main) HEAD@{0}: commit: feat: добавить поиск
# e4f5g6h HEAD@{1}: reset: moving to HEAD~2
# i7j8k9l HEAD@{2}: commit: fix: исправить форму
# m0n1o2p HEAD@{3}: commit: feat: добавить форму
# q3r4s5t HEAD@{4}: checkout: moving from feature to main
# Reflog конкретной ветки
git reflog show feature/auth
# Reflog с датами
git reflog --date=iso
# Ограничить количество записей
git reflog -10
Восстановление потерянного коммита
# Сценарий: случайно сделал git reset --hard и потерял коммиты
# 1. Найти хэш потерянного коммита в reflog
git reflog
# HEAD@{2}: commit: feat: добавить оплату ← вот он, хэш i7j8k9l
# 2. Вариант А: создать ветку от потерянного коммита
git checkout -b recovery/payment i7j8k9l
# 3. Вариант Б: reset к нужному состоянию
git reset --hard i7j8k9l
# 4. Вариант В: cherry-pick конкретного коммита
git cherry-pick i7j8k9l
Восстановление удалённой ветки
# Случайно удалили ветку feature/auth
# 1. Найти последний коммит ветки в reflog
git reflog
# a1b2c3d HEAD@{5}: checkout: moving from feature/auth to main
# ← значит a1b2c3d был HEAD ветки feature/auth
# 2. Воссоздать ветку
git checkout -b feature/auth a1b2c3d
Восстановление после неудачного rebase
# До rebase HEAD был на abc1234
git reflog
# abc1234 HEAD@{3}: checkout: moving from main to feature/auth
# Прервать испорченный rebase
git rebase --abort
# Или если rebase уже завершился и пошло не так:
git reset --hard abc1234
Синтаксис HEAD@{N}
# Перейти к состоянию N операций назад
git checkout HEAD@{5}
# Reset к состоянию 3 операции назад
git reset --hard HEAD@{3}
Частые ошибки
- Ждать слишком долго — reflog хранит записи 90 дней по умолчанию; после
git gcстарые потерянные объекты удаляются - Путать reflog с log —
git logпоказывает историю коммитов; reflog показывает историю перемещений HEAD (включая reset, checkout, merge) - Не проверить дату в reflog — несколько операций могут иметь похожий контекст; проверяй
--date=iso