Spiegazione del ripristino di Git: morbido, misto e difficile
git reset sposta il tuo ramo su un altro commit. Le tre modalità differiscono solo per ciò che fanno con i tuoi file. Ecco cosa conserva ciascuno, quale utilizzare e come tornare indietro quando si ripristina troppo.
Scritto da Kodmora
La software house dietro GitTree
- Annullamento e ripristino
- Commetti la cronologia
- Commit
In questa pagina
Tutte e tre le modalità spostano il ramo corrente sul commit da te nominato. `--soft` mantiene tutte le modifiche in fase, `--mixed` (impostazione predefinita) le mantiene nella cartella di lavoro senza fasi e `--hard` le scarta. Per annullare l'ultimo commit mantenendo il lavoro, esegui git reset --soft HEAD~1. Utilizza --hard solo quando sei sicuro, perché elimina definitivamente le modifiche non salvate.
Qual è la differenza tra morbido, misto e duro?
| Modalità | Il ramo si muove | Zona di sosta | Cartella di lavoro | Usalo per |
|---|---|---|---|---|
--soft | Sì | Mantenuto | Mantenuto | Redo esegue il commit: tutto rimane in scena |
--mixed | Sì | Ripristina | Mantenuto | Togli lo stage e scegli nuovamente cosa confermare |
--hard | Sì | Ripristina | Ripristina | Buttare via il lavoro |
Git conserva tre copie del tuo lavoro: la cronologia dei commit, l'area di staging e la cartella di lavoro. Reset sposta sempre il primo. La modalità decide se riscrivere anche le altre due.
Quando dovrei usare git reset --soft?
Usalo per annullare i commit mantenendo ogni modifica in scena, pronta per eseguire nuovamente il commit. È il modo più rapido per comprimere un ramo in un commit:
# undo the last commit, keep the changes staged
git reset --soft HEAD~1
# squash everything since main into one commit
git reset --soft main
git commit -m "feat(search): quick open"Quando dovrei usare git reset --mixed?
È l'impostazione predefinita, quindi git reset significa git reset --mixed. Usalo per annullare i commit e dividere il lavoro in modo diverso o per rimuovere dallo stage i file:
# undo the last two commits, keep the changes unstaged
git reset HEAD~2
# unstage one file (the branch does not move)
git reset src/search.tsPer l'annullamento della fase di staging, git restore --staged src/search.ts svolge lo stesso lavoro e legge in modo più chiaro.
Quando dovrei usare git reset --hard?
# drop the last commit and its changes
git reset --hard HEAD~1
# match the remote exactly
git fetch origin
git reset --hard origin/mainCome rimuovo un commit da un ramo?
| Situazione | Comando |
|---|---|
| Ultimo commit, non inviato | git reset --hard HEAD~1 |
| Commit precedente, non inviato | git rebase -i <sha>~1, quindi contrassegnalo come drop |
| Il commit è già stato inviato | git revert <sha> |
| Il commit è andato al ramo sbagliato | git cherry-pick, quindi reimposta il vecchio ramo |
git revert mantiene intatta la cronologia, quindi è l'unica scelta sicura su un ramo condiviso. Il ripristino di un ramo inviato richiede un push forzato e rompe i cloni dei tuoi compagni di squadra. Rebase interattivo e cherry-pick hanno le proprie guide.
Come posso annullare un reset git?
Reset ha spostato il ramo e il reflog ricorda dov'era:
git reflog
# 3e52f10 HEAD@{0}: reset: moving to HEAD~2
# 9b3c7d1 HEAD@{1}: commit: add search box
git reset --hard 9b3c7d1Ciò ripristina i commit, anche dopo --hard. I file che sono stati sottoposti a stage ma che non sono mai stati sottoposti a commit possono talvolta essere trovati con git fsck --lost-found. I cambiamenti che non sono mai stati in stage sono spariti. Annulla un ripristino, un rebase o un commit copre ogni caso.
Qual è la differenza tra reset, ripristino e ripristino?
| Comando | Cosa fa | Riscrive la storia? |
|---|---|---|
git reset | Sposta il ramo su un altro commit | Sì |
git revert | Aggiunge un commit che ne annulla un altro | No |
git restore | Modifica i file, mai il ramo | No |
Come reimpostare un ramo in GitTree
Scegli il commit
Fare clic con il pulsante destro del mouse sul commit a cui il ramo dovrebbe tornare e aprire Reimposta... su questo commit.
Scegli la modalità
Selezionare Soft: Mantieni tutte le modifiche in fase, Misto: Mantieni le modifiche nella cartella di lavoro o Difficile: Elimina tutte le modifiche….
Annulla se necessario
GitTree salva prima il tuo lavoro sotto
refs/ogt/trash, quindi Annulla può ripristinarlo, anche dopo un hard reset.

Vedi reimpostare un ramo su un commit per i dettagli e la lezione sulle modalità di ripristino per esercitarti su un repository sicuro.
Domande frequenti
Cosa significa HEAD~1?
Il commit è un passo prima di quello corrente. HEAD~3 è tre passi indietro. git log --oneline mostra gli hash se preferisci nominare direttamente un commit.
Git reset elimina i commit?
Allontana il ramo da loro, quindi smettono di apparire in git log. Rimangono nel reflog per almeno 30 giorni per impostazione predefinita, poi Git può rimuoverli.
Come posso annullare il mio ultimo commit mantenendo le modifiche?
Esegui git reset --soft HEAD~1 per mantenerli in fase o git reset HEAD~1 per mantenerli non in fase.
Git reset --hard è sicuro?
È sicuro per il lavoro confermato, che il reflog può riportare indietro. Non è sicuro per il lavoro non confermato, che cancella. Metti da parte o confermati prima se non sei sicuro.
Posso reimpostare un ramo che è già stato inviato?
Solo con un push forzato, che riscrive il ramo per tutti. Sui rami condivisi, utilizza invece git revert.
Fonti
Le affermazioni su altri prodotti sono state confrontate con le rispettive pagine ufficiali in data 7 novembre 2026. Cambiano prezzi e caratteristiche; le pagine dei venditori sono la fonte della verità.
