modulo 04 / lezione 20
Riscrivere la storia: rebase, amend, cherry-pick
Reflog: la rete di sicurezza che molti ignorano
Conoscere `git reflog` come backup di emergenza per recuperare commit apparentemente persi.
Reflog: la rete di sicurezza che molti ignorano
Il reflog registra i movimenti locali dei riferimenti: HEAD, branch, reset, checkout, rebase, amend. È la scatola nera del tuo clone.
Quando pensi “ho perso un commit”, spesso non è vero. Hai perso il nome che puntava a quel commit. Il reflog può aiutarti a ritrovarlo.
Perché questa lezione conta
Git è più recuperabile di quanto sembra. Un reset hard, un rebase sbagliato o un branch cancellato non significano automaticamente perdita definitiva.
Il reflog è però locale e temporaneo. Devi conoscerlo prima dell’incidente, non cercarlo nel panico.
Obiettivo operativo
Alla fine della lezione devi saper leggere git reflog, identificare uno SHA utile e recuperare lavoro con branch, reset o cherry-pick.
Cosa registra
git reflog
Esempio:
abc1234 HEAD@{0}: reset: moving to HEAD~1
def5678 HEAD@{1}: commit: aggiungi checkout
999aaaa HEAD@{2}: checkout: moving from main to feat/cart
Ogni riga dice dove puntava HEAD in un momento precedente e perché si è mosso.
Recuperare creando branch
Il recupero più sicuro:
git branch recupero def5678
git switch recupero
Non sposti il branch corrente. Dai solo un nuovo nome al commit recuperato.
Da lì puoi ispezionare, cherry-pickare o fare merge con calma.
Recuperare con reset
Se sai con certezza che vuoi tornare indietro:
git reset --hard def5678
È più rischioso perché sposta il branch corrente e modifica working tree. Preferisci branch di recupero quando sei incerto.
Recuperare dopo amend
Dopo amend, il commit vecchio non sparisce subito:
git reflog
Troverai lo stato prima dell’amend. Puoi:
git show <sha-vecchio>
git branch prima-amend <sha-vecchio>
Poi confronti.
Recuperare dopo branch cancellato
Se cancelli un branch:
git branch -D feature/persa
e conosci lo SHA, puoi ricrearlo:
git branch feature/persa <sha>
Se non conosci lo SHA, cerca nel reflog:
git reflog --all
Limiti
Il reflog:
- è locale;
- non è condiviso col remoto;
- scade secondo configurazione;
- può essere pulito da garbage collection;
- non recupera file mai staged o committati se cancellati dal disco.
Se un lavoro importante non è mai entrato in Git, il reflog non lo conosce.
Procedura anti-panico
Quando pensi di aver perso lavoro:
- fermati;
- non fare altri reset;
- esegui
git status -sb; - esegui
git reflog; - cerca l’ultimo punto buono;
- crea un branch di recupero;
- verifica con
git showe test.
Laboratorio guidato
In un repo demo:
- crea tre commit;
- fai
git reset --hard HEAD~2; - usa
git reflog; - recupera il commit perso con
git branch recupero <sha>; - ripeti con amend;
- ripeti con cancellazione branch.
Annota quale comando ha mosso HEAD in ogni caso.
Output atteso
Una procedura di recupero:
Non panico.
git reflog.
Creo branch di recupero, non reset immediato.
Verifico.
Solo dopo integro o ripulisco.
Errori comuni
Continuare a provare comandi a caso. Puoi rendere il recupero più difficile.
Usare subito reset hard. Crea prima un branch di recupero.
Credere che reflog sia remoto. Un collega non vede il tuo reflog.
Aspettare mesi. Il reflog non è archivio permanente.
Checklist di verifica
- so leggere
HEAD@{n}; - so creare branch da SHA del reflog;
- so recuperare dopo reset hard;
- so recuperare dopo amend;
- so spiegare i limiti del reflog.
Collegamenti
- Modulo: Riscrivere la storia: rebase, amend, cherry-pick — lezione 20 del corso.
- Torna nel capstone come procedura di recupero da disastro.