Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

Git fornisce diversi modi per annullare, a seconda che la modifica sia nella tua working tree, nell'index, nel tuo ultimo commit o già pushata. Scegliere lo strumento giusto previene incidenti.

Scartare modifiche nella working tree

Hai modificato un file ma vuoi buttare via le modifiche:

git restore file.txt              # moderno
git checkout -- file.txt          # equivalente classico

git restore senza --source usa l'index, quindi il file torna al suo ultimo stato di git add.

Togliere dallo stage

Hai eseguito git add ma vuoi togliere un file dal prossimo commit (senza perdere le modifiche):

git restore --staged file.txt
git reset HEAD file.txt           # sintassi più vecchia

Modificare l'ultimo commit (amend)

Hai committato ma vuoi correggere il messaggio o includere un altro file:

git commit --amend -m "Better message"
git add forgotten.txt
git commit --amend --no-edit

Fai amend solo dei commit che non hai pushato, o sii pronto a fare force-push.

Revert di un commit pubblico

Se un commit cattivo è già pushato, non riscrivere la storia. Crea un nuovo commit che lo annulla:

git revert <sha>
git push

git revert apre un editor con un messaggio generato; il risultato è un undo pulito che tutti possono pullare.

Reset

git reset sposta il puntatore del branch corrente. Ha tre modalità:

  • --soft: sposta solo il branch; mantieni index e working tree.
  • --mixed (default): sposta il branch e resetta l'index; mantieni la working tree.
  • --hard: sposta il branch, resetta index e working tree. Distruttivo.
git reset --soft HEAD~1            # uncommit, mantieni le modifiche in stage
git reset HEAD~1                   # uncommit, mantieni le modifiche fuori stage
git reset --hard HEAD~1            # distruggi l'ultimo commit e le modifiche

Recuperare da --hard

git reflog
git reset --hard HEAD@{1}

Il reflog ricorda ogni movimento di HEAD per 90 giorni.

Scegliere l'undo giusto

Una semplice matrice decisionale:

  • Solo working tree: git restore <file>
  • File in stage: git restore --staged <file>
  • Ultimo commit non pushato: git commit --amend o git reset --soft HEAD~1
  • Commit pushato: git revert <sha>
  • Tutta la punta del branch: git reset --hard ORIG_HEAD (dopo un brutto merge/rebase)
git status
git diff
git log --oneline -5

Esegui sempre quei tre prima di qualsiasi undo distruttivo. Mostrano la working tree, le modifiche in stage e la storia recente; insieme ti dicono quale undo è sicuro.

Errori comuni

Confondere revert con reset. Revert aggiunge; reset rimuove. Eseguire git reset --hard con lavoro non committato, poi rendersi conto che ne avevi bisogno; ricorri al reflog immediatamente, prima che il garbage collector giri. Fare amend di un commit pushato e non coordinare il force-push con i compagni di team. Usa git revert sulla storia condivisa. E infine, trattare git checkout file come sicuro; in Git più vecchio sovrascrive silenziosamente le tue modifiche senza cestino. Il moderno git restore non è diverso; fai un backup prima se incerto.