Annullare le Modifiche in Git: Reset, Ripristino e Revert Spiegati

Comprendi git restore, reset e revert per rimuovere file dall'area di staging, scartare modifiche locali, annullare commit ed evitare di riscrivere la cronologia condivisa.

Annullare le Modifiche in Git: Reset, Ripristino e Revert Spiegati

Annullare le modifiche in Git è sicuro quando sai quale livello stai modificando: l'albero di lavoro, l'area di staging o la cronologia dei commit. I comandi comuni sono git restore, git reset e git revert, e risolvono problemi diversi.

La regola principale è semplice: usa restore per i file, reset per le modifiche alla cronologia locale e revert per annullare commit che altri potrebbero già avere.

Comprendere i Concetti Fondamentali

Tieni a mente queste aree:

  • Albero di lavoro: i file che modifichi.
  • Area di staging, chiamata anche indice: le modifiche selezionate per il prossimo commit.
  • Cronologia dei commit: i commit già registrati.
  • HEAD: il commit corrente a cui punta il tuo ramo.

Esegui git status prima di annullare qualsiasi cosa. Ti dice se le modifiche sono non staged, staged o già committate.

git restore: Per Scartare Modifiche nella Directory di Lavoro e nell'Area di Staging

Usa git restore quando vuoi modificare file nell'albero di lavoro o nell'area di staging senza spostare la cronologia del ramo.

Rimuovere File dall'Area di Staging

Se hai messo in staging un file per errore, rimuovilo con --staged:

git restore --staged <file>

Per rimuovere tutto dall'area di staging:

git restore --staged .

Le tue modifiche ai file rimangono nell'albero di lavoro. Vengono semplicemente rimosse dal prossimo commit.

Scartare Modifiche nella Directory di Lavoro

Per buttare via modifiche non staged in un file:

git restore <file>

Questo fa sì che la copia nell'albero di lavoro corrisponda all'indice. Se il file non è in staging, di solito significa che torna a HEAD. Controlla prima git diff perché questo scarta le modifiche locali.

Per scartare sia le modifiche staged che non staged per un file e ripristinarlo da HEAD:

git restore --source=HEAD --staged --worktree <file>

Ripristinare un File da un Commit Specifico

Puoi anche riportare un file da un commit più vecchio:

git restore --source=<commit> -- path/to/file

Questo modifica il file nel tuo albero di lavoro. Committalo se la vecchia versione è quella che vuoi per il futuro.

git reset: Riscrivere la Cronologia

Usa git reset quando vuoi spostare il puntatore del ramo corrente. Può anche modificare l'area di staging e l'albero di lavoro a seconda della modalità.

Comprendere le Modalità (--soft, --mixed, --hard)

Le tre modalità comuni sono:

git reset --soft HEAD^

Sposta HEAD indietro di un commit e mantiene le modifiche del commit annullato in staging.

git reset --mixed HEAD^

Sposta HEAD indietro di un commit e mantiene le modifiche del commit annullato non staged. --mixed è l'impostazione predefinita, quindi git reset HEAD^ fa la stessa cosa.

git reset --hard HEAD^

Sposta HEAD indietro di un commit e scarta le modifiche corrispondenti dall'area di staging e dall'albero di lavoro. Questo è distruttivo. Non eseguirlo con leggerezza.

Pattern utili di reset:

git reset --soft HEAD^      # rifai l'ultimo commit locale, mantieni le modifiche staged
git reset HEAD^             # annulla l'ultimo commit locale, mantieni le modifiche non staged
git reset                   # rimuovi tutte le modifiche staged
git reset --hard origin/main # scarta le modifiche locali e allineati a origin/main

Resettare un Vecchio Commit

Per spostare il tuo ramo indietro di due commit mantenendo le modifiche nel tuo albero di lavoro:

git reset --mixed HEAD~2

Resetta solo commit che sono locali o che il tuo team ha accettato di riscrivere. Se i commit sono già su un ramo condiviso, preferisci git revert.

git revert: Creare un Nuovo Commit per Annullare le Modifiche

git revert crea un nuovo commit che applica l'inverso di un commit precedente. Non elimina né sposta il commit originale, quindi è sicuro per i rami condivisi.

Revert di un commit:

git revert <commit-hash>

Revert di un intervallo:

git revert HEAD~3..HEAD

Se compaiono conflitti, risolvili, metti in staging i file e continua:

git add <file-risolti>
git revert --continue

Revertire un commit di merge richiede attenzione extra perché Git deve sapere quale genitore deve essere trattato come linea principale:

git revert -m 1 <merge-commit>

Fallo solo quando capisci cosa ha introdotto il merge. Per i rami di produzione, chiedi una revisione prima di revertire i merge.

Scegliere il Comando Giusto

Usa questa guida rapida:

  • Rimuovere un file dall'area di staging: git restore --staged <file>.
  • Scartare modifiche non staged in un file: git restore <file>.
  • Annullare l'ultimo commit locale e mantenere le modifiche staged: git reset --soft HEAD^.
  • Annullare l'ultimo commit locale e mantenere le modifiche non staged: git reset HEAD^.
  • Scartare modifiche e commit locali in modo distruttivo: git reset --hard <commit>.
  • Annullare un commit inviato in modo sicuro: git revert <commit-hash>.

Consiglio Pratico

Prima di annullare qualsiasi cosa, esegui git status e decidi cosa stai modificando. Usa restore per la pulizia a livello di file, reset per i commit locali non inviati e revert per la cronologia condivisa. Quando un comando include --hard, fermati e controlla prima git diff.