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.

60 min Git e controllo versione

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:

  1. è locale;
  2. non è condiviso col remoto;
  3. scade secondo configurazione;
  4. può essere pulito da garbage collection;
  5. 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:

  1. fermati;
  2. non fare altri reset;
  3. esegui git status -sb;
  4. esegui git reflog;
  5. cerca l’ultimo punto buono;
  6. crea un branch di recupero;
  7. verifica con git show e test.

Laboratorio guidato

In un repo demo:

  1. crea tre commit;
  2. fai git reset --hard HEAD~2;
  3. usa git reflog;
  4. recupera il commit perso con git branch recupero <sha>;
  5. ripeti con amend;
  6. 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.