Hard Reset vs Soft Reset per rimuovere commit in GIT

Thu 23 March 2023

Capita a tutti per sbaglio di eseguire un commit per poi rendersi conto che qualcosa è andato storto. I motivi per i quali un commit può non risultare corretto possono essere quelli di aver sbagliato il nome dell'autore del commit, di aver inserito un commento errato, di aver incluso nel commit file che non desideravamo versionare. Per tutti questi motivi e, soprattutto, per non sporcare il log dei commit del nostro repository, Git offre la possibilità di riscrivere la storia.

In questo articolo ti spiego come poter rimuovere un commit utilizzando il comando reset mediante gli approcci soft reset e hard reset.

Comando reset

Il comando reset di git consente di ripristinare la storia del nostro repository a partire da un dato commit. Il comando consente di riportare la HEAD del repository sul commit indicato nel reset. Il comando reset è il seguente:

git reset <hash_commit>

Ma se il comando riporta lo stato del repository al commit indicato, che ne sarà di tutti i commit successivi a quello indicato? Per fare un esempio, supponiamo di avere questa sequenza di commit:

A -> B -> C -> D -> E -> F

e di voler riportare la storia al commit C. Con il comando reset cosa accadrà?

La risposta in realtà prevede due strade diverse.

Soft reset

La prima strada è quella del soft reset che consente di ripristinare il repository al commit indicato, lasciando sul filesystem tutti le modifiche apportate da quel commit in poi. Questa è la scelta di default del comando nel caso l'utente non espliciti l'opzione sul comando. Quindi, considerando il nostro esempio, avremo il repository con la HEAD su C ma tutte le modifiche apportate nei commit D, E, F saranno mantenute ed evidenziate come non versionate. Per eseguire un soft reset eseguire il seguente comando:

git reset --soft C

il precedente comando eseguirà il soft reset sul commit C. Occorre notare che C deve essere sostituito o con l'hash del commit o con la sua distanza dall'attuale HEAD: HEAD~1, HEAD~2 e così via.

Hard reset

La seconda strada è quella del hard reset. Tale reset riporta la HEAD al commit indicato nel comando cancellando tutte le modifiche apportate nei commit seguenti. Questo comando è una vera e propria cancellazione della storia, quindi usatelo con molta cura.

Per eseguire un hard reset, il comando è:

git reset --hard C

Conclusioni

Questo articolo ha descritto come modificare la storia dei commit all'interno di un repository git. In particolare sono stati presentati gli approcci hard reset e soft reset utili entrambi ma in situazioni diverse. L'approccio soft reset è più adatto a rimuovere i commit, perché magari si è sbagliato o ci sono alcuni che non desideriamo, ma senza cancellare il lavoro fatto in essi. L'hard reset prevede proprio una riscrittura della storia e quindi i commit rimossi e i loro file modificati non hanno ragione di esistere.