
Melkor vs Morgoth: Il potere dei reset in Git
Nel vasto universo di Git, il comando reset
è tra i più potenti e pericolosi, capace di alterare la storia stessa dei commit. Proprio come Melkor, il più potente degli Ainur, che divenne Morgoth dopo essersi corrotto, anche un innocuo git reset
può trasformarsi in qualcosa di molto più devastante.
Ma non temere: con la conoscenza giusta, saprai incanalare questo potere con saggezza.
Il Potere di Git Reset
git reset
consente di spostare il puntatore del branch corrente (HEAD) e, a seconda delle opzioni usate, agire anche sull’indice (staging area) e sulla working directory. È uno strumento che può aiutarti a correggere errori, riorganizzare il tuo lavoro o… distruggere tutto.
Soft Reset: Il Melkor degli Ainur
Quando Melkor era ancora uno spirito di grande bellezza e potenza, non era ancora caduto. Così è il git reset --soft
: potente, ma non distruttivo.
git reset --soft HEAD~1
Esempio pratico: hai appena fatto un commit con un messaggio sbagliato:
git commit -m "Update"
Ma avresti voluto scrivere un messaggio più descrittivo. Puoi usare:
git reset --soft HEAD~1
git commit -m "Fix bug nella validazione del form login"
Il codice rimane intatto, pronto per essere ricommitato con un messaggio corretto.
Cosa cambia:
HEAD
si sposta indietro di un commit.
Le modifiche del commit annullato sono tutte nello staging area.
Puoi fare un nuovo commit come se nulla fosse successo.

Mixed Reset: Il Passaggio all’Oscurità
Con git reset --mixed
, HEAD viene spostato indietro, lo staging area viene svuotato, ma i file nel working directory rimangono intatti. È il default se non specifichi nulla.
git reset --mixed HEAD~1
Esempio pratico: hai aggiunto file allo staging area per errore usando git add .
, ma non hai ancora fatto commit.
git reset
Questo comando ti libera lo staging area, così puoi scegliere con calma cosa aggiungere:
git add login.js
git commit -m "Fix login"
Cosa cambia:
HEAD
si sposta indietro.
I file non sono più staged.
Puoi ricostruire il commit con solo ciò che ti serve.

Hard Reset: Il Morgoth che Distrugge
Il git reset --hard
è la trasformazione definitiva: come Melkor che diventa Morgoth, il distruttore. Tutto ciò che era nello staging area e anche nel working directory viene perso.
git reset --hard HEAD~1
Esempio pratico: hai fatto modifiche locali che si sono rivelate disastrose, vuoi tornare all’ultimo commit stabile.
git reset --hard HEAD
Oppure, se hai fatto un commit che vuoi annullare completamente (codice incluso):
git reset --hard HEAD~1
⚠️ Attenzione: le modifiche non salvate altrove andranno perse. Puoi recuperarle solo se git reflog
ti viene in soccorso.
Cosa cambia:
HEAD
, staging e working directory vengono riscritti.
È come se le modifiche non fossero mai esistite.
Potente e pericoloso.

Confronto tra le tre modalità
Tipo di reset | HEAD | Staging area | Working directory |
---|---|---|---|
--soft | Sì | Conservato | Conservato |
--mixed (default) | Sì | Ripristinato | Conservato |
--hard | Sì | Cancellato | Cancellato |
Git Reflog: La Via Segreta per Tornare Indietro
Hai usato --hard
e hai perso un commit importante? C’è ancora speranza! Git tiene traccia dei movimenti di HEAD
grazie a reflog
.
git reflog
Trova l’hash del commit precedente al reset, poi:
git reset --hard <hash>
Proprio come i Valar che vegliano da lontano, anche Git ha una via di salvezza, sebbene nascosta.
Conclusione: Il Potere Va Dominato

Come con i poteri degli Ainur, usare git reset
richiede consapevolezza. Può essere uno strumento di precisione o un’arma di distruzione di massa. Conoscere le differenze tra soft, mixed e hard reset ti permette di controllare la tua cronologia con padronanza.
Ricorda: anche se hai compiuto un errore, Git ti offre spesso una via di salvezza. Come per Morgoth, il sentiero di redenzione diventa difficile solo quando si ignora il reflog. Sii saggio, non superbo.
“In caso di dubbio, Meriadoc, segui sempre il tuo reflog.”
…e anche il più piccolo reset
può cambiare il corso del tuo repository.