Сегодня чуть не словил инфаркт из-за одной команды:

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.