Come annullare una Commit in Git

Git LogoUsando Git capita ogni tanto, vuoi per stanchezza o per distrazione, di lanciare commit sbagliate. Stamattina m’è capitato di sistemare del codice, testarlo e fare la commit… solo per scoprire di aver lavorato sulla branch sbagliata! Non è la prima volta che mi succede e non sarà nemmeno l’ultima. Poiché ho scarsa memoria ogni volta mi tocca usare google e ripescare quei due o tre comandi utili in questi casi. Ho pensato di appuntarli qui, un po’ per metterli a disposizione di tutti, un po’ per poterli ritrovare facilmente.

Annullare una commit

Se ancora non è stato stato eseguito il push verso un repo remoto:

git reset --soft HEAD^

In Git HEAD è la commit più recente mentre HEAD^ è la penultima (HEAD^^ è la terzultima). In alternativa è possibile indicare l’SHA-1 dell’hash della commit alla quale si vuole tornare, qualunque essa sia:

git reset --soft 9fa5f6a

Il numero di hash di ogni commit è rintracciabile con un semplice git log --oneline

Differenza tra --soft e --hard

L’opzione --soft cancella la commit ma lascia i file invariati. Se volete riportare anche i file allo stato in cui si trovavano alla penultima commit:

git reset --hard HEAD^

Questo porterà “indietro nel tempo” il vostro repo, alla penultima commit. Sarà come se le ultime modifiche (e con esse l’ultima commit) non fossero mai esistite.

E se la commit è già finita nel repository?

Se la commit è già stata inviata a un repo remoto (push) è necessario seguire un’altra procedura:

git revert HEAD

Questo comando crea una nuova commit che annulla tutto ciò che è stato introdotto dalla commit indesiderata.

  • Andrea

    Grazie Nicola,
    sintetico e molto chiaro!