git reflog to twoja siatka bezpieczeństwa w Gicie. Pokazuje historię tego, gdzie wskazywał HEAD (i inne referencje) po każdej operacji: commit, checkout, reset, rebase, merge czy amend. Każdy taki ruch dostaje wpis z własnym identyfikatorem w stylu HEAD@{2}. Dzięki temu, nawet jeśli zrobisz twardy reset albo nieudany rebase i „stracisz” commity, reflog wciąż pamięta ich SHA — i pozwala je odzyskać. To dane lokalne, nie wędrują przez push ani clone.
Składnia i najważniejsze opcje
Podstawowo: git reflog [show] []. Bez argumentów działa jak git reflog show HEAD. Pod spodem to po prostu git log -g --oneline.
show— domyślne podpolecenie; wypisuje wpisy logu dla danej referencji (np.HEADalbomain).--all— pokazuje reflogi wszystkich referencji naraz, nie tylkoHEAD.--date=— format dat, np.iso,relative,local.-n(czyli--max-count) — ogranicza liczbę wyświetlanych wpisów.--no-abbrev— pokazuje pełne SHA zamiast skróconych.expire— usuwa stare wpisy reflogu (z opcjami--expirei--expire-unreachable).delete @{n}— kasuje konkretny wpis reflogu.
Przykłady użycia
git reflog— szybki przegląd ostatnich ruchówHEADw formacie jednoliniowym.git reflog show main— historia pozycji gałęzimain, przydatne po nieoczekiwanym przesunięciu.git reset --hard HEAD@{1}— cofnięcie się do stanu sprzed ostatniej operacji (klasyczny ratunek po pomyłce z resetem).git checkout HEAD@{5}— podejrzenie albo odzyskanie stanu sprzed pięciu zmianHEAD.git reflog --date=iso -n 20— dwadzieścia ostatnich wpisów z czytelnymi datami ISO.
Częste błędy i pułapki
Najczęstsza pomyłka to mylenie HEAD@{2} z HEAD~2. To pierwsze odnosi się do czasu (drugi wpis w reflogu), drugie do przodków commita (dziadek w drzewie historii) — to zupełnie co innego. Pamiętaj też, że reflog jest lokalny i prywatny: po git clone na świeżej maszynie go nie ma, więc nie traktuj go jak backupu w chmurze. Wpisy nie żyją wiecznie — domyślnie te osiągalne wygasają po 90 dniach, a nieosiągalne po 30 (parametry gc.reflogExpire i gc.reflogExpireUnreachable), a git gc potrafi je posprzątać. Jeśli odzyskujesz utracony commit, zrób to od razu, nie za miesiąc. I uwaga: git reflog expire --expire=now --all w połączeniu z agresywnym gc potrafi nieodwracalnie skasować twoją siatkę bezpieczeństwa.
Powiązane komendy: git log, git reset, git checkout, git cherry-pick, git fsck oraz git gc.