Questo articolo Γ¨ una libera traduzione di questo tutorial di atlassian.
Reset
Il comando git reset permette di spostare il puntatore alla testa di un branch ad un commit differente e questo puΓ² essere usato per due scopi:
- per rimuovere dei commit dal mio branch corrente
- per rimuovere i file in staging
Il comando seguente permette di spostare il branch hotfix
di due commit indietro
git checkout hotfix
git reset HEAD~2
Questo significa che i due commit finali di hotfix
ora diventano dei commit pendenti, che verrano eliminato dal Garbage Collector di git.
git reset
Γ¨ comodo per eliminare cambiamenti, anche committati, che non sono stati condivisi con nessuno; questo Γ¨ inoltre spesso usato per far tornare i file che sono nellβarea di staging, unstaged (lasciando le modifiche nella working directory) con
git reset --mixed HEAD
oppure per eliminare tutte le modifiche che non sono state committate, con
git reset --hard HEAD
Il comando git reset
puΓ² essere usato anche su singoli file, e non sul contenuto di un intero commit, per esempio
git reset HEAD foo.py
porta a unstaged il file foo.py (senza modificarlo nela working directory).
Attenzione che il comando git reset
con un commit diverso da HEAD riscrive la commit history, che Γ¨ un comportamento da evitare nei branch pubblici, mentre Γ¨ possibile effetuare tale modifica invece nei branch locali.
Revert
Il revert
Γ¨ un comando piΓΉ βsoftβ di reset
, in quanto annulla un commit creando un nuovo commit. Questo Γ¨ un modo sicuro per annullare i cambiamenti apportati (che sono stati giΓ committati) in quanto non ho la modifica della commit history.
Per esempio il comando seguente annulla i cambiamenti effettuati negli ultimi due commit creando un nuovo commit che annulla tali modifiche senza modificare i commit precedenti.
git checkout hotfix
git revert HEAD~2
Dato che questo comando non modifica la commit history, Γ¨ consigliabile usarlo, al posto di git reset
, in una repository condivisa.
Posso anche pensare a git revert
come un modo sicuro di annullare modifiche committate, mentre git reset HEAD
le modifiche non ancora committate.