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:
git reflog # equivale a git reflog show HEADCome si legge
Section titled “Come si legge”Esempio di HEAD reflog durante un lavoro con branch (commit A→B→C→D su main, poi feature, ecc.):
HEAD@{0}: commit: fix some bugHEAD@{1}: checkout: moving from main to bugfixHEAD@{2}: commit: another commit yayHEAD@{3}: commit: add some feature...HEAD@{21}: clone: from https://github.com/facebook/react.gitOgni 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.
Limitazioni
Section titled “Limitazioni”- 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).
Sottocomandi
Section titled “Sottocomandi”git reflog accetta show, expire, delete ed exists. L’unico davvero usato è show — ed è il default.
git reflog # log di HEADgit reflog show main # log della punta del branch mainRiferimenti con name@{qualifier}
Section titled “Riferimenti con name@{qualifier}”La sintassi nome@{qualificatore} accede a specifici puntatori dei riferimenti, e i risultati si passano ad altri comandi — checkout, reset, merge…
Qualificatori temporali
Section titled “Qualificatori temporali”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:
git reflog master@{one.week.ago} # dov'era master una settimana fagit checkout bugfix@{2.days.ago} # stato di bugfix di 2 giorni fagit diff main@{0} main@{yesterday} # cosa è cambiato su main da ieriReflog come strumento di soccorso
Section titled “Reflog come strumento di soccorso”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.