Quando tutto sembra perduto: git reflog

Un paio di giorni fa ho avuto modo di usare una delle funzioni più belle di git, e siccome non tutti la conoscono credo sia il caso di celebrarla un po’ perché mi ha salvato qualche ora di lavoro.
Piccola premessa: ho iniziato a mettere le mani su un progetto mai visto prima e il log di git era abbastanza ordinato, quindi per fare la mia parte ho fatto un branch per la funzione che dovevo aggiungere e avevo intenzione di fare un merge e push sull’origin al termine della modifica. Non sono ancora un utilizzatore di git esperto, quindi a volte faccio delle cavolate…

Ipotizziamo di avere un progetto già avviato con alcuni commit (nel mio esempio uno), e di voler aggiungere una funzionalità. Come consigliato dal galateo facciamo un nuovo branch, ci spostiamo su di esso, facciamo dei commit (possibilmente autoconsistenti e che non rompano niente) e concludiamo la modifica.
Git reflog - Preparazione

Arriva il momento di fare il merge. Ipotizziamo di aver sbagliato qualcosa, magari perché stiamo usando un tool grafico poco chiaro, e ci ritroviamo con un po’ di leggerezza a cancellare il branch con un bel "git branch -D nomebranch".
Apparentemente tutto il nostro lavoro è andato perduto e lo scoramento ci assale mentre dalla nostra bocca esce un fiume di bestemmie e parole sconce.
Git reflog - Cancellazione branch

Quando tutto sembra perduto ci ricordiamo di aver letto che con git non si perde mai niente, perché all’occorrenza esiste anche un log parallelo al principale a cui poter attingere nei momenti di difficoltà: il reflog.
Digitiamo "git reflog" e vediamo con nostro grande sollievo che i nostri commit fatti sul branch andato perso sono ancora tutti lì in memoria, e volendo possiamo recuperarli.
Un "git reset --hard HEAD@{index}" e come per magia ritroviamo nel nostro log principale tutti i commit che erano presenti nel branch tagliato per errore.
Git reflog - Ripristino commit

Siccome siamo precisi a questo punto non possiamo non domandarci “Ma i commit non li avevo fatti un un branch secondario? Come mai me li ritrovo sul master?”.
Infatti il reset hard fatto poc’anzi salva i commit ma li mette nel master perché non sono collegati ad alcun ramo, volendo si può far eseguire il ripristino su un ramo secondario, magari chiamandolo con il nome di quello tagliato erroneamente: "git branch nomeramo HEAD@{index}"
Git reflog - Ripristino ramo

La storia è importante e non va mai dimenticata. Git lo sa, e con il reflog ci fornisce uno strumento salvifico da utilizzare nei momenti più difficili.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.