#git-reset-hard-recovery
Случайно сделал `git reset --hard HEAD~5`. Локально, не пушнут. Что делаешь?
Что отвечать
`git reflog` - найди запись «HEAD@{1}» (это место до reset'а), там SHA того что было. Дальше один из двух способов: `git reset --hard HEAD@{1}` (вернуть ветку туда же), или `git checkout -b restored HEAD@{1}` (создать ветку из того места, оставив текущую как есть). Это работает потому что reset двигает только указатель ветки - коммиты физически остаются в `.git/objects/` пока не прошёл `git gc`.
Что хотят услышать
Кандидат должен: - первой командой назвать `git reflog`, без паники и без gc - объяснить почему это работает: reset не удаляет коммиты, только двигает ref, коммиты остаются dangling до gc (по умолчанию 90 дней для достижимых из reflog) - назвать `HEAD@{1}` как идиоматическое «один шаг назад в reflog» - предупредить: **не делай** `git gc --prune=now` после факапа - можешь снести dangling-коммиты - сказать что аналогично работает для `branch -D`: до gc ветка достижима через reflog
Подводные камни
- ✗ Запустить `git gc --prune=now` сразу после паники - снесёшь то что хотел восстановить
- ✗ Думать что reset физически стирает коммиты - не стирает, только двигает ref
- ✗ Полагаться на reflog через 3 месяца - запись уже expired
Follow-up
- ? Что покажет `git reflog HEAD` после нескольких reset'ов?
- ? Как восстановить если reflog уже почистился?
- ? Почему `git gc --prune=now` после reset опасен?
Глубина в базе знаний