Git Reset
Ultimo aggiornamento
git reset sposta il branch corrente su un altro commit e, a seconda della modalità, aggiorna l'area di staging (index) e la directory di lavoro perché gli corrispondano. Le tre modalità si differenziano solo per quanto arriva lontano questo aggiornamento: --soft sposta il branch e si ferma, --mixed (il predefinito) reimposta anche l'area di staging, e --hard sovrascrive anche i tuoi file di lavoro.
Siccome --hard scarta il lavoro non committato, sappi quale modalità ti serve prima di eseguirlo. Sui commit di cui hai già fatto push, preferisci invece git revert. Prova questi comandi in sicurezza nel terminal playground: una vera shell nel tuo browser.
Le tre modalità
| Modalità | Sposta il branch | Reimposta lo staging | Reimposta la directory di lavoro |
|---|---|---|---|
--soft | Sì | No | No |
--mixed (predefinito) | Sì | Sì | No |
--hard | Sì | Sì | Sì |
Sintassi
| Comando | Cosa fa |
|---|---|
git reset --soft HEAD~1 | Annulla l'ultimo commit, mantiene le modifiche in staging |
git reset HEAD~1 | Annulla l'ultimo commit, mantiene le modifiche fuori dallo staging |
git reset --hard HEAD~1 | Annulla l'ultimo commit, scarta le modifiche |
git reset <file> | Toglie un file dallo staging (mantiene le modifiche) |
git reset --hard origin/main | Forza il branch locale a coincidere con il remote |
Casi comuni
| Obiettivo | Comando |
|---|---|
| Togliere tutto dallo staging | git reset |
| Togliere un file dallo staging | git reset README.md |
| Tornare indietro di 3 commit, mantenendo il lavoro | git reset --soft HEAD~3 |
| Buttare via tutte le modifiche locali da un certo commit | git reset --hard <hash> |
Domande frequenti su git reset
Che differenza c'è tra --soft, --mixed e --hard?
--soft non cambia nient'altro, quindi le modifiche restano in staging. --mixed (il predefinito) svuota anche l'area di staging, quindi le modifiche escono dallo staging ma restano nei file. --hard sovrascrive anche la directory di lavoro perché corrisponda al commit di destinazione, scartando le modifiche non committate.Come tolgo un file dallo staging con git reset?
git reset <file> (per esempio git reset README.md), oppure git reset senza percorso per togliere tutto dallo staging. Il file esce dall'area di staging ma le tue modifiche restano nella directory di lavoro. Nelle versioni più recenti di Git puoi usare anche git restore --staged <file>, che fa la stessa cosa in modo più esplicito.git reset --hard è reversibile?
--hard scarta definitivamente le modifiche non committate. Il lavoro committato che hai eliminato con un reset, però, di solito si può recuperare: esegui git reflog per trovare l'hash del commit, poi git reset --hard <hash> (oppure crea un branch lì). Le modifiche mai messe in staging né committate non si possono recuperare, quindi usa --hard con attenzione.Che differenza c'è tra git reset e git revert?
git reset riscrive la cronologia spostando indietro il branch: va bene per i commit locali, ma è pericoloso sui commit di cui hai già fatto push. git revert lascia intatta la cronologia e aggiunge un nuovo commit che annulla uno precedente, ed è la scelta sicura per i branch condivisi.Cosa fa git reset --soft HEAD~1?
HEAD~1 indica il commit precedente a quello corrente, quindi il branch torna indietro di un passo mentre l'area di staging e la directory di lavoro restano come sono. È il modo più rapido per rifare un commit: correggi i file o il messaggio, poi fai di nuovo il commit. Consulta git undo last commit per le altre opzioni.Cosa significa HEAD~1?
HEAD è il commit su cui ti trovi, e ~1 indica il suo primo genitore, cioè un commit indietro. HEAD~2 è due commit indietro, e così via. Per un commit normale, HEAD^ equivale a HEAD~1.Posso esercitarmi online?
git reset in una vera shell nel tuo browser, senza installare nulla. Il corso interattivo gratuito di Git di Coddy spiega anche come fare il reset e annullare le modifiche passo dopo passo.