git / Guide

Annullare un commit Git: reset, revert o restore?

Parti da ciò che vuoi conservare: le modifiche ai file, la cronologia dei commit oppure entrambe. Controlla poi se qualcuno ha già ricevuto il commit.

Esempi per Bash; consulta i riferimenti per i dettagli del tuo ambiente.

git — Cheat sheet

Scegli in base allo stato del lavoro

SituazioneComandoRisultato
Togliere un file dallo staginggit restore --staged -- file.txtConserva le modifiche nella directory di lavoro.
Annullare l’ultimo commit locale, mantenendo lo staginggit reset --soft HEAD~1Sposta il branch indietro di un commit.
Invertire un commit già condivisogit revert <commit>Aggiunge un commit che inverte quella modifica.

Controlla prima git status e git log --oneline -5. L’esempio di reset richiede un commit precedente e riguarda un branch privato. Un commit di merge richiede una valutazione separata: non scegliere a caso il genitore principale.

Prova il reset in un repository di esercizio

Usa una directory nuova e vuota, esterna al progetto. L’esercizio crea due commit, toglie il secondo dalla cronologia del branch e conserva la sua modifica nello staging.

git init -b main
git config user.name "DevSheet Demo"
git config user.email "demo@example.invalid"
printf "one\n" > note.txt
git add note.txt
git commit -m "First note"
printf "two\n" >> note.txt
git commit -am "Second line"
git reset --soft HEAD~1
git status --short
git diff --cached

Risultato atteso: M note.txt nello stato breve e una riga two aggiunta nel diff dello staging. Il file contiene ancora entrambe le righe.

Inverti un commit condiviso

Con la directory di lavoro pulita, esamina il commit ed esegui questi comandi sostituendo l’hash di esempio. Git normalmente apre un editor per il messaggio del nuovo commit.

git show a1b2c3d
git revert a1b2c3d
git status

Le modifiche successive possono creare conflitti. Risolvi i file e usa git revert --continue, oppure annulla questa operazione con git revert --abort. Un revert non cancella il commit originale né un eventuale segreto che conteneva.

Evita di perdere modifiche

git reset --hard può eliminare modifiche non committate ai file tracciati e sovrascrivere percorsi non tracciati che ostacolano l’operazione. Non serve nell’esercizio sopra.

git restore -- file.txt sostituisce le modifiche non in staging; aggiungendo --staged agisci invece sull’indice. Se hai spostato un branch per errore, esamina git reflog e crea un branch di recupero sul vecchio commit verificato. Reflog non recupera tutte le modifiche non committate.

Riferimenti

Tutte le guide