Тур по Git
Продвинутый Git / Урок 5.3

git reflog — Восстановление потерянной работы

Reflog (журнал ссылок) записывает каждое перемещение указателя ветки. Даже когда коммиты кажутся «потерянными» после сброса или перебазирования, reflog помнит, где вы были.

Как это работает

Каждый раз, когда HEAD изменяется — коммит, переключение, сброс, слияние, перебазирование — Git записывает запись в reflog:

HEAD@{0}: commit: Add login feature
HEAD@{1}: checkout: moving from main to feature
HEAD@{2}: commit: Fix typo in README
HEAD@{3}: reset: moving to HEAD~2

Основные команды

git reflog                 # показать reflog для HEAD
git reflog show main       # показать reflog для конкретной ветки
git reflog --relative-date # показать временные метки вместо индексов

Страховочная сеть

Reflog — это ваша кнопка отмены практически для всего в Git. Случайно удалили ветку? Сбросили слишком далеко назад? Коммиты всё ещё существуют — reflog знает, где они.

До сброса:     A — B — C — D (HEAD)
После сброса:  A — B (HEAD)        C — D (всё ещё существуют!)

Коммиты C и D не исчезли. Они просто недостижимы ни из одной ветки. Reflog всё ещё указывает на них.

Восстановление потерянного коммита

git reflog                     # найти хеш коммита
git checkout <hash>            # просмотреть его
git branch recovered <hash>    # создать ветку для сохранения

Или используйте git reset:

git reset --hard HEAD@{2}     # переместить HEAD назад к записи reflog 2

Попробуйте!

Потренируйтесь терять и восстанавливать коммиты:

  1. Создайте репозиторий с несколькими коммитами: git init && echo "first" > file.txt && git add file.txt && git commit -m "First commit"
  2. Добавьте второй коммит: echo "second" >> file.txt && git add file.txt && git commit -m "Second commit"
  3. Добавьте третий коммит: echo "third" >> file.txt && git add file.txt && git commit -m "Third commit"
  4. Проверьте лог: git log --oneline — вы должны увидеть три коммита
  5. Сбросьте до первого коммита: git reset --hard HEAD~2
  6. Проверьте лог снова: git log --oneline — остался только один коммит
  7. Используйте reflog для поиска потерянных коммитов: git reflog
  8. Восстановите третий коммит: git reset --hard HEAD@{1}
  9. Проверьте восстановление: git log --oneline — все три коммита вернулись

Срок хранения reflog

Записи reflog не хранятся вечно. По умолчанию:

  • Достижимые записи истекают через 90 дней
  • Недостижимые записи истекают через 30 дней

Это значит, что у вас есть как минимум 30 дней для восстановления потерянных коммитов. После этого git gc может их очистить.

Когда reflog спасает

  • Случайный git reset --hard
  • Удаление ветки с неслитой работой
  • Неудачное перебазирование, потерявшее коммиты
  • Нужно узнать «что я делал вчера?»
🎯

Цель

Восстановите 'потерянный' коммит с помощью git reflog после hard reset

Terminal
$

No commits yet. Run `git init` and create your first commit.