Reflog: Журнал всех действий¶
git reflog — это мощный инструмент для восстановления потерянных коммитов, веток и других объектов. Он ведет журнал всех изменений, которые происходили с HEAD и другими ссылками в вашем локальном репозитории.
Зачем нужен Reflog?¶
В отличие от git log, который показывает только историю коммитов, reflog фиксирует:
- Переключения между ветками.
- Коммиты (включая те, что были удалены через reset --hard).
- Слияния, rebase.
- Отмененные операции.
Главное: Reflog позволяет восстановить коммиты, которые были "потеряны" после reset --hard или неудачного rebase.
Просмотр журнала¶
git reflog
Пример вывода:
a1b2c3d HEAD@{0}: checkout: moving from feature to main
e4f5g6h HEAD@{1}: commit: Добавить кнопку
i7j8k9l HEAD@{2}: checkout: moving from main to feature
m3n4o5p HEAD@{3}: reset --hard: Moving to v1.0
...
Каждая строка содержит:
- Хеш коммита.
- Индекс (HEAD@{0} — последнее действие, HEAD@{1} — предпоследнее и т.д.).
- Описание действия.
Восстановление потерянного коммита¶
Сценарий: Случайный reset --hard¶
Вы сделали git reset --hard HEAD~2 и поняли, что удалили важные коммиты.
-
Найдите хеш коммита, до которого нужно восстановиться:
bash git reflogНайдите запись перед тем, как вы сделали reset. -
Выполните reset на нужный коммит:
bash git reset --hard HEAD@{2} # или явно по хешу git reset --hard a1b2c3d
Все коммиты восстановятся!
Восстановление удаленной ветки¶
Если вы случайно удалили ветку:
git branch -D feature/login
Но коммиты никуда не делись, они есть в reflog.
-
Найдите последний коммит удаленной ветки:
bash git reflog --all | grep feature/login -
Создайте ветку заново на этот коммит:
bash git branch feature/login <хеш-коммита>
Поиск конкретного действия¶
Можно фильтровать reflog по тексту:
git reflog | grep "commit: Добавить функцию"
Очистка Reflog¶
Reflog хранится ограниченное время (по умолчанию 90 дней для обычных записей, 30 дней для "ненужных"). Можно очистить вручную:
# Удалить старые записи
git reflog expire --expire=now --all
# Полная очистка мусора (осторожно!)
git gc --prune=now
Важно: Reflog — это локальный журнал. Он не синхронизируется с удаленным репозиторием и не доступен другим разработчикам.
Разница между Log и Reflog¶
| Характеристика | Git Log | Git Reflog |
|---|---|---|
| Что показывает | История коммитов | История действий с HEAD |
| Видят ли другие | Да (после push) | Нет (только локально) |
| Восстанавливает удаленное | ❌ Нет | ✅ Да |
| Для чего | Просмотр истории | Аварийное восстановление |
Типичные команды восстановления¶
# Вернуться к состоянию "перед последним действием"
git reset --hard HEAD@{1}
# Создать ветку на основе вчерашнего состояния
git branch backup-branch HEAD@{yesterday}
# Посмотреть, где была ветка 5 действий назад
git show HEAD@{5}
Совет: Если вы потеряли что-то важное — первым делом запустите
git reflog. В 99% случаев данные можно восстановить.