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.