Сегодня чуть не словил инфаркт из-за одной команды:
git branch -D feature/task-1234
Удалил ветку. НЕ ЗАПУШЕННУЮ ветку. С кодом за весь день.
И в этот момент внутри начинается:
«Ну всё. Сейчас буду по памяти восстанавливать изменения…»
Сижу в холодном поту, прокручиваю в голове: — какие файлы менял — какие методы переписывал — что вообще успел сделать
Но оказалось, что Git не удаляет коммиты мгновенно.
Даже если выполнить git branch -D, Git чаще всего удаляет только указатель на ветку, а сами коммиты ещё какое-то время остаются в локальном репозитории.
Почему так работает?
В Git ветка — это просто ссылка на commit.
Когда делаешь:
git branch -D feature/some-feature
Git удаляет не «код», а pointer на последний commit ветки.
Сами commits продолжают лежать внутри .git/objects.
И пока garbage collector (git gc) их физически не почистил — их можно восстановить.
Меня спас reflog.
git reflog --all | grep some-feature
Нашёл последний commit ветки:
a1b2c3d HEAD@{5}: checkout: moving from feature/some-feature
И восстановил ветку:
git checkout -b feature/some-feature a1b2c3d
Ветка вернулась. Весь код на месте.
Теперь git reflog навсегда в списке команд, которые должен знать каждый, кто работает с Git.