Git – jak przywrócić usunięty branch?

Kto nigdy przypadkowo nie usunął niewłaściwego brancha, niech pierwszy rzuci kamieniem 😛 Zmęczenie, roztargnienie czy inna przyczyna – zdarza się. Jak już zorientujesz się, co się właśnie wydarzyło, pierwszą reakcją jest myśl: 'o nie, co ja zrobiłam?’ (no dobra, pierwsza myśl jest nieco bardziej nacechowana wulgaryzmami, ale nie będę ich tu przytaczać). W przypływie paniki zaczynasz szukać rozwiązania i (na całe szczęście) znajdujesz je – git reflog

Git reflog

Git przechowuje historię wszystkich wykonanych operacji w tzw. „reflogu”. To takie logi referencji, które pamiętają, gdzie wskazywał HEAD, czyli gdzie „było” twoje repo na przestrzeni czasu. Jest to swego rodzaju „dziennik”, który opisuje ruchy wykonane przez użytkownika (np.: użytkownik stworzył branch X, przełączył się na niego, zrobił commit, przełączył się na branch Y, zrobił merge z branchem X). Git pamieta numery commitów wykonanych na każdej gałęzi, nawet, jeśli dana gałąź została już usunięta. Dzięki temu możesz cofnąć się do wybranego miejsca w historii (tam, gdzie Twój branch jeszcze istniał) i przywrócić utracony kod.

Przywracanie usuniętej gałęzi

Do rzeczy, w jaki sposób przywócić usuniętą lokanie gałąź?

git reflog

Zobaczysz listę wykonanych operacji wraz z przypisanymi hashami, np.:

5edd4ac (HEAD -> feature/product-filters) HEAD@{0}: checkout: moving from 5edd4acd423ee7ceb3caed203f264a927e17386b to feature/product-filters
5edd4ac (HEAD -> feature/product-filters) HEAD@{1}: checkout: moving from feature/pagination to 5edd4ac
60cf7e1 (feature/pagination) HEAD@{2}: commit: change styles for products pagination - again
771d662 HEAD@{3}: checkout: moving from staging to feature/pagination
<-- Delete feature/product-filters here -->
06fb2b3 (staging, master) HEAD@{4}: checkout: moving from feature/pagination to staging
771d662 HEAD@{5}: commit: change styles for products pagination
5edd4ac (HEAD -> feature/product-filters) HEAD@{6}: checkout: moving from feature/product-filters to feature/pagination
5edd4ac (HEAD -> feature/product-filters) HEAD@{7}: commit: change styles for product filters
b0f7d9b HEAD@{8}: commit: change file name from fileX to fileY
06fb2b3 (staging, master) HEAD@{9}: checkout: moving from staging to feature/product-filters

Znajdź hash ostatniego commita, który był na Twoim usuniętym branchu. Zwykle będzie to tuż przed wpisem o przełączeniu się na inną gałąź lub o usunięciu. Teraz możesz utworzyć nowy branch (może być o takiej samej nazwie), który będzie wskazywał na ten commit:

git checkout -b name-of-deleted-branch 5edd4ac

I już! Twój branch jest z powrotem dostępny lokalnie.

Jeśli usunąłeś branch również zdalnie (np. z GitHuba, GitLab lub Bitbucket), to po odzyskaniu go lokalnie musisz ponownie wypchnąć go na serwer.

git push -u origin name-of-deleted-branch

Reflog przechowywany jest tylko na twojej maszynie. Nie jest wspólny dla całego repo w zespole, dlatego zaleca się robienie regularnych push-y, aby nie musieć polegać wyłącznie na reflogu, zwłaszcza przy większych zmianach.