Skip to content

Modulo 19 — Reflog

Git registra ogni volta che la punta di un branch o un altro riferimento viene aggiornata nel repository locale. Questi “log dei riferimenti” si consultano con:

Terminal window
git reflog # equivale a git reflog show HEAD

Esempio di HEAD reflog durante un lavoro con branch (commit A→B→C→D su main, poi feature, ecc.):

HEAD@{0}: commit: fix some bug
HEAD@{1}: checkout: moving from main to bugfix
HEAD@{2}: commit: another commit yay
HEAD@{3}: commit: add some feature
...
HEAD@{21}: clone: from https://github.com/facebook/react.git

Ogni voce registra cosa ha spostato HEAD: un nuovo commit, uno switch di branch, il clone iniziale… HEAD@{0} è lo stato attuale, HEAD@{1} lo stato precedente, e così via.

  • I reflog esistono solo per l’attività locale: non vengono condivisi con i collaboratori.
  • Scadono: Git pulisce le voci vecchie dopo circa 90 giorni (configurabile).

git reflog accetta show, expire, delete ed exists. L’unico davvero usato è show — ed è il default.

Terminal window
git reflog # log di HEAD
git reflog show main # log della punta del branch main

La sintassi nome@{qualificatore} accede a specifici puntatori dei riferimenti, e i risultati si passano ad altri comandi — checkout, reset, merge…

Ogni voce del reflog ha un timestamp, quindi si può filtrare per tempo:

  • 1.day.ago, 3.minutes.ago, yesterday
  • date esplicite, es. Fri, 12 Feb 2021 14:06:21 -0800

Esempi:

Terminal window
git reflog master@{one.week.ago} # dov'era master una settimana fa
git checkout bugfix@{2.days.ago} # stato di bugfix di 2 giorni fa
git diff main@{0} main@{yesterday} # cosa è cambiato su main da ieri

Il vero superpotere: usare le voci del reflog per recuperare commit “persi” — ad esempio commit scomparsi dopo un reset e che git log non mostra più. Sono ancora nel database degli oggetti: il reflog ti dà il loro hash, con cui fare checkout o creare un branch.