Hard Reset vs Soft Reset per rimuovere commit in GIT
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.