Vai al contenuto principale

Git reset HEAD: una guida completa

Scopri cos'è il comando Git reset HEAD, come funziona e gli aspetti di sicurezza e recupero correlati.
Aggiornato 29 set 2026  · 10 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

Il comando git reset è uno degli strumenti più potenti in Git per controllare lo stato del repository. Permette agli sviluppatori di modificare a quale commit punta un branch, decidere cosa rimane in stage per il prossimo commit e persino riscrivere la cronologia locale prima del push. 

Questa guida si concentra in particolare su git reset HEAD, una variante versatile usata per rimuovere file dallo stage e gestire la cronologia dei commit. 

Nel corso della guida esploreremo il comando in dettaglio, le sue diverse modalità e come si confronta con comandi spesso confusi come git revert e git clean.

Fondamenti di Git Reset HEAD

Prima di imparare come applicare git reset HEAD, vediamo i concetti alla base che ne definiscono il comportamento.

L'architettura a tre alberi di Git

Git gestisce i dati in tre aree concettuali:

  1. Cronologia dei commit (repository): è il registro permanente degli snapshot del progetto, che conserva tutti i commit effettuati.
  2. Area di stage (index): contiene le modifiche che hai contrassegnato per l'inclusione nel prossimo commit.
  3. Directory di lavoro: è il tuo filesystem reale, dove modifichi e testi il codice.

Questi tre alberi interagiscono costantemente quando lavori con Git per gestire la cronologia delle versioni. 

Per esempio, quando esegui git add, sposti le modifiche dalla directory di lavoro all'area di stage. Quando effettui un commit, Git scatta un'istantanea dell'area di stage e la registra nella cronologia dei commit. 

Il comando git reset cambia il puntatore del branch corrente a un commit specificato, con HEAD che si sposta insieme ad esso. In stato di HEAD staccata, sposta HEAD direttamente. A seconda della modalità usata, git reset aggiorna anche l'index e può modificare la directory di lavoro. Questo lo rende uno strumento essenziale per una gestione precisa del controllo versione.

Capire HEAD in Git

Il puntatore HEAD è il modo in cui Git tiene traccia della tua posizione attuale nella cronologia dei commit. Di solito, HEAD punta all'ultimo commit del branch che hai attivato. 

Tuttavia, può anche puntare direttamente a un commit se ti trovi in uno stato di "HEAD staccata". Capire questo puntatore è fondamentale, perché git reset opera spostando HEAD (e potenzialmente il riferimento del branch) a un nuovo commit.

Mentre i puntatori di branch e gli hash dei commit forniscono riferimenti statici ai commit, HEAD è dinamico e si muove mentre navighi nella cronologia o cambi branch. 

Riconoscere questa differenza aiuta a evitare confusione durante i reset.

Git fornisce una notazione abbreviata per muoverti in relazione a HEAD:

  • HEAD^ → il genitore immediato (primo) del commit corrente
  • HEAD~2 → il nonno del commit (due passi indietro)

Questa scorciatoia permette una navigazione rapida senza bisogno degli hash completi dei commit. Anche branch e tag possono fare riferimento ai commit, ma HEAD assicura che comandi come reset o checkout sappiano dove ti trovi attualmente.

Suggerimento sui genitori: HEAD~N segue la catena dei first-parent di N passi. ^ seleziona un genitore; sui commit di merge puoi specificare quale, ad es. HEAD^1, HEAD^2.

Esplorare le modalità di git reset HEAD: Soft, Mixed, Hard

git reset ha tre modalità, ognuna delle quali definisce quanto in profondità il reset incide sul tuo repository. Ognuna produce risultati diversi, quindi è importante sapere come funziona per usarla correttamente.

Modalità soft reset

git reset --soft HEAD^

Per prima, la modalità soft reset. Con git reset --soft <target>, Git sposta indietro il puntatore del branch (o al commit di destinazione) ma mantiene tutte le modifiche in stage nell'index. 

È particolarmente utile quando:

  • Ti accorgi che il messaggio dell'ultimo commit è sbagliato
  • Vuoi combinare più modifiche in un singolo commit senza perdere il contenuto già in stage. 

Questo comando lascia intatta l'area di stage, così puoi semplicemente rifare il commit con un messaggio migliore o una selezione più accurata.

Modalità mixed reset

git reset --mixed HEAD^

Poi c'è la modalità mixed reset, che è quella predefinita. git reset --mixed <target> sposta il puntatore del branch e reimposta l'area di stage per allinearla al commit di destinazione, preservando le modifiche nella directory di lavoro. 

Questo ti permette di ristrutturare i commit suddividendo un grande commit in più commit più piccoli e logici. Dopo il reset, puoi mettere in stage i file selettivamente e rifare i commit in modo più ordinato.

Modalità hard reset

git reset --hard HEAD^

Infine, la modalità hard reset che ripristina le modifiche ai file tracciati. git reset --hard <target> è l'opzione più drastica e pericolosa. Reimposta il puntatore del branch, l'index e la directory di lavoro per corrispondere esattamente al commit di destinazione. Questo scarta tutte le modifiche non committate ai file tracciati nel tuo index e nella directory di lavoro. I file non tracciati non vengono rimossi (usa git clean per quelli).

Sebbene possa essere utile quando vuoi ripartire da zero, comporta rischi significativi, soprattutto in ambienti di team, perché rimuove in modo permanente le modifiche non incluse in un commit.

Sintassi e varianti del comando git reset HEAD

Per capirlo meglio, guardiamo la sintassi del comando.

Struttura di base del comando

La forma generale di un comando git reset è:

git reset [--soft | --mixed | --hard] <target>

La modalità determina quanto del tuo repository viene interessato e la destinazione definisce il commit a cui stai facendo reset. Omettendo la modalità, il default è --mixed.

Puntare a commit specifici

I commit possono essere referenziati usando notazioni diverse:

  • Notazione relativa come HEAD^ o HEAD~3
  • Hash di commit espliciti (ad es., git reset 4a5d9c2)
  • Nomi di branch o tag

Per sicurezza, git reflog può essere usato per identificare gli ultimi movimenti di HEAD e recuperare commit scartati per errore.

Operazioni di reset su file specifici

Puoi anche aggiornare l'area di stage solo per il file specificato, lasciando invariata la copia di lavoro. 

Ecco la sintassi per queste operazioni:

git reset HEAD -- <file>

Questo comando è comunemente usato per "togliere dallo stage" un file aggiunto per errore all'index. 

In alternativa, le versioni moderne di Git offrono anche git restore --staged <file> come opzione più descrittiva. I reset specifici per file sono ideali quando vuoi affinare cosa entrerà nel tuo prossimo commit senza perdere le modifiche.

Per maggiori informazioni sui comandi Git, dai un'occhiata al nostro Git Cheat Sheet qui sotto.

Applicazioni pratiche e casi d'uso di Git reset HEAD

Questo comando di reset ha molti usi nel controllo versione. Ecco alcuni casi pratici:

1. Correggere errori nei commit

Capita spesso che gli sviluppatori facciano commit troppo presto o con modifiche incomplete. 

git reset --soft HEAD^ ti permette di annullare l'ultimo commit mantenendo tutto in stage, così puoi rifare il commit correttamente senza dover ripartire da zero con tutte le modifiche. 

In alternativa, git reset HEAD^ annulla il commit lasciando le modifiche fuori dallo stage per poterle rimettere in stage in modo più granulare.

2. Riorganizzare i commit

A volte i commit contengono troppe modifiche non correlate. Un reset mixed ti consente di annullare un commit mantenendo le modifiche nella directory di lavoro. 

Da lì, puoi creare più commit più piccoli che riflettano meglio l'evoluzione del progetto. Allo stesso modo, se hai unito modifiche prematuramente, il reset ti dà la possibilità di riorganizzare la cronologia prima di condividerla.

3. Gestione dello stage dei file

Togliere dallo stage file specifici con git reset HEAD -- <file> garantisce che vengano committati insieme solo i file pertinenti. Questo supporta commit atomici, più facili da capire e revisionare. 

Per esempio, se correggi un bug e aggiorni anche la documentazione, togliere dallo stage uno dei due insiemi di modifiche assicura che ogni commit abbia uno scopo chiaro e unico.

4. Sincronizzare i branch con i remoti

Quando il tuo branch locale diverge significativamente dal remoto, un hard reset al branch remoto (ad es., git reset --hard origin/main) forza l'allineamento. 

Può essere utile per scartare modifiche locali sperimentali, ma va fatto con cautela perché elimina definitivamente le modifiche locali.

Cronologia remota: git reset è locale. Per riflettere la cronologia riscritta sul remoto, usa git push --force-with-lease e coordìnati con il tuo team per evitare di sovrascrivere il loro lavoro.

Considerazioni sulla sicurezza e gestione del rischio

Dato che git reset può scartare modifiche nel tuo index e nella directory di lavoro, ci sono alcuni aspetti di sicurezza e rischio da considerare.

Rischi nell'uso di git reset HEAD

Sebbene i reset possano ripulire la cronologia, possono anche distruggere lavoro. 

Usare git reset HEAD senza flag aggiuntivi corrisponde alla modalità mixed reset. Questo toglierà dallo stage le modifiche attualmente in stage (rimangono nella tua directory di lavoro). Le modifiche rimarranno nella directory di lavoro, ma non saranno più contrassegnate per il prossimo commit.

Le modifiche non committate vengono tolte dallo stage; le modifiche ai file restano sul disco. Se hai modificato file che erano precedentemente in stage, git reset HEAD ripristinerà l'area di stage per corrispondere al commit HEAD, di fatto togliendo dallo stage quelle modifiche.

Procedure di verifica prima del reset

Prima di eseguire un reset, dovresti ispezionare lo stato del repository per assicurarti che tutti i file siano in ordine.

Per farlo, segui questi passaggi:

  • Esegui git status per confermare quali file sono in stage o modificati.
  • Usa git log o git reflog per capire dove punta attualmente HEAD.
  • Confronta le modifiche con git diff per confermare cosa potresti perdere.

Seguire questi passaggi riduce le sorprese e assicura che tu stia effettuando il reset in modo consapevole.

Strategie di backup e recupero

Crea sempre un backup prima di operazioni rischiose come modifiche importanti al codice.

Ecco alcune strategie che puoi usare:

  1. Stashing: salva temporaneamente le modifiche non committate con git stash push -m "backup".
  2. Branching: crea un branch di backup con git branch savepoint per preservare la cronologia attuale.

Queste misure rendono i reset meno intimidatori e ti danno la sicurezza di sperimentare in modo sicuro.

Meccanismi di recupero e annullamento

In qualsiasi caso in cui venga usato un comando Git sbagliato, ci sono diversi modi per effettuare il recupero.

Usare git reflog per il recupero

git reflog registra ogni movimento di HEAD, rendendolo un salvavita dopo reset accidentali. Se perdi traccia di un commit, esegui semplicemente:

git reflog
git reset --hard <commit-id>

Questo ti permette di recuperare il lavoro scartato finché il commit non è stato eliminato dalla garbage collection.

Strategie alternative di recupero

Oltre al reflog, puoi fare affidamento su stash e branch di backup. Gli stash catturano il lavoro non committato, mentre i branch preservano intere cronologie di commit. In contesti collaborativi, spesso puoi recuperare dagli errori recuperando lo stato corretto dal repository remoto.

Usi avanzati e buone pratiche

Il comando git reset HEAD può essere utilizzato anche per operazioni più avanzate.

1. Workflow di stage interattivo

Abbinare git add --patch a reset a livello di file ti dà il massimo controllo su ciò che entra in ogni commit. Questo workflow assicura commit atomici e mirati, migliorando la leggibilità e riducendo la possibilità di introdurre modifiche non correlate.

2. Rifinitura dei messaggi di commit

Se scopri un refuso o hai bisogno di fornire messaggi di commit più chiari, un soft reset ti consente di riscrivere il commit senza alterare il codice. È un modo pulito per mantenere significativa la tua cronologia.

3. Gestione dei branch e riscrittura della storia

Il reset può essere usato anche strategicamente prima del merge per riordinare la cronologia dei commit. Gli sviluppatori spesso usano i reset per squashare o riorganizzare i commit, così che i branch presentino una cronologia più pulita quando vengono integrati nel mainline.

4. Protocolli di workflow collaborativo

Nei team sono fondamentali accordi chiari. Evita di resettare branch condivisi e comunica con gli altri quando è necessario un force push. 

Seguire questi protocolli previene confusione e cronologie corrotte nei repository condivisi.

Comandi correlati e strumenti aggiuntivi

I comandi Git vengono spesso usati in combinazione tra loro. Ecco alcuni comandi correlati che funzionano in modo simile a git reset HEAD.

Uso di git clean per rimuovere i file non tracciati

A volte i file non tracciati ingombrano la tua directory di lavoro. git clean li rimuove, ma usa cautela: è irreversibile. Esegui git clean -n per una prova prima di eliminare effettivamente i file. In combinazione con git reset, questo può riportare un repository a uno stato pulito.

Uso di git revert per la cronologia pubblica

Quando lavori su repository condivisi, puoi considerare di usare git revert al posto di git reset per annullare i commit. git revert crea un nuovo commit che annulla le modifiche di uno precedente, preservando l'integrità della cronologia. Al contrario, git reset riscrive la cronologia, il che può creare problemi ai colleghi.

Confronto rapido:

  • reset → riscrive la cronologia.
  • revert → crea un nuovo commit che annulla uno precedente.
  • restore → modifica i file di lavoro senza cambiare la cronologia.

Conclusione

Usare git reset HEAD offre agli sviluppatori un controllo granulare sullo stato del repository. Pur essendo potente, va usato con cautela, soprattutto in contesti collaborativi in cui la riscrittura della cronologia può causare conflitti. 

Questa funzione di base offre molte possibilità per lavorare con i repository e annullare modifiche indesiderate. Se vuoi saperne di più su Git, dai un'occhiata al nostro skill track GitHub Foundations o al corso Foundations of Git.

Git reset HEAD FAQ

Quali sono le best practice per usare git reset --hard?

Usa git reset --hard con parsimonia, perché elimina definitivamente le modifiche sia nell'area di stage sia nella directory di lavoro. Verifica sempre che le modifiche non committate non ti servano prima di rimuoverle. Fai un commit o uno stash del tuo lavoro prima di eseguire il comando, così avrai un piano B nel caso il reset sia troppo aggressivo.

Come posso recuperare da un git reset --hard accidentale?

Il recupero dipende dal fatto che il commit fosse referenziato altrove. Il reflog di Git può spesso aiutare: eseguire git reflog mostra una cronologia delle posizioni recenti di HEAD e puoi usare git checkout o git reset per tornare al commit perso. Se però non avevi committato le modifiche prima del reset, il lavoro non committato di solito non è recuperabile.

Quali sono le differenze tra git reset --soft, --mixed e --hard?

--soft sposta HEAD a un nuovo commit ma mantiene tutte le modifiche in stage. --mixed (predefinito) sposta HEAD e svuota l'area di stage, ma lascia intatta la directory di lavoro. --hard sposta HEAD, svuota l'area di stage e sovrascrive la directory di lavoro, cancellando completamente le modifiche non committate.

Come influisce git reset --hard sulle modifiche non committate?

git reset --hard elimina le modifiche non committate. Qualsiasi modifica nella tua directory di lavoro o nell'area di stage che non sia stata committata va persa quando esegui git reset --hard.

Posso usare git reset --hard su un repository remoto?

No. git reset --hard influisce solo sul tuo repository locale. Per modificare un branch remoto, devi fare push delle modifiche locali usando un force push (git push --force), che può riscrivere la cronologia per chiunque lavori su quel branch. Questo andrebbe fatto solo comunicandolo chiaramente al tuo team, perché può ostacolare la collaborazione.


Austin Chia's photo
Author
Austin Chia
LinkedIn

Sono Austin, blogger e autore tech con anni di esperienza come data scientist e data analyst nel settore sanitario. Partito dalla biologia, oggi aiuto altri a fare lo stesso passaggio attraverso il mio blog tecnologico. La mia passione per la tecnologia mi ha portato a collaborare come autore con decine di aziende SaaS, ispirando altre persone e condividendo le mie esperienze.

Argomenti
Git

I migliori corsi DataCamp

Programma

Fondamenti di Git

7 ore
Impara il controllo di versione con Git dalle basi ai flussi di lavoro avanzati. Traccia le modifiche, gestisci i repository e collabora in modo efficiente.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

Mostra AltroMostra Altro