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 с loggit log показывает историю коммитов; reflog показывает историю перемещений HEAD (включая reset, checkout, merge)
  • Не проверить дату в reflog — несколько операций могут иметь похожий контекст; проверяй --date=iso

Связанные темы

Ресурсы