#git-reflog-time-machine
Что такое reflog, как им пользоваться и сколько живут записи?
Что отвечать
Reflog - локальный лог перемещений HEAD и ref'ов: каждый раз когда ветка двигается (commit, reset, rebase, checkout), Git пишет запись в `.git/logs/HEAD` и `.git/logs/refs/heads/<branch>`. `git reflog` показывает «где я был», `HEAD@{2}` это «два шага назад». Записи живут по умолчанию 90 дней для достижимых и 30 дней для недостижимых, чистятся через `git gc`. **Это только локально**, на сервере reflog обычно нет.
Что хотят услышать
Кандидат должен: - назвать reflog как спасение после `reset --hard`, неудачного rebase, accidental `branch -D` - показать workflow восстановления: `git reflog` → найти SHA → `git checkout -b restored <sha>` или `git reset --hard <sha>` - объяснить что reflog ЛОКАЛЕН - если коллега force-push'нул в main, у тебя есть твой reflog (пока не сделал gc), у него свой, но на сервере истории нет - назвать настройки `gc.reflogExpire` (90 дней) и `gc.reflogExpireUnreachable` (30 дней) и `git gc --prune=now` как способ зачистить (или наоборот сохранить) - упомянуть `git reflog <branch>` для просмотра reflog конкретной ветки, не только HEAD
Подводные камни
- ✗ Думать что reflog есть на сервере - нет, на bare-репо обычно отключён
- ✗ Сделать `git gc --prune=now --aggressive` сразу после факапа - можешь снести то что хотел восстановить
- ✗ Полагаться на reflog через 3 месяца - запись скорее всего уже expired и забрана gc
Follow-up
- ? Как настроить чтобы reflog никогда не expired?
- ? Что покажет `git reflog refs/heads/main`?
- ? Почему reflog не помогает другим разработчикам после твоего force-push?
Глубина в базе знаний