git reflog

Pokazuje historię zmian referencji HEAD, pomaga odzyskać utracone commity.

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. HEAD albo main).
  • --all — pokazuje reflogi wszystkich referencji naraz, nie tylko HEAD.
  • --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 --expire i --expire-unreachable).
  • delete @{n} — kasuje konkretny wpis reflogu.

Przykłady użycia

  • git reflog — szybki przegląd ostatnich ruchów HEAD w formacie jednoliniowym.
  • git reflog show main — historia pozycji gałęzi main, 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 zmian HEAD.
  • 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.