Vai al contenuto
GitTree

Guide Git

Annulla git reset, rebase e commit: come recuperare (quasi) qualsiasi cosa in Git

Git raramente butta via il lavoro per sempre. Ecco come annullare l'ultimo commit, una modifica, git reset --hard, un rebase, un ramo eliminato o un push forzato con git reflog e come l'Undo di GitTree gestisce la maggior parte di tutto con un clic.

Scritto da KodmoraAggiornato 13 minuti di lettura
GitTree menu di commit con azioni di selezione, ripristino, creazione ramo, tag e confronto

Per annullare git reset, un rebase o un commit, esegui git reflog, trova la voce appena prima dell'errore e punta nuovamente il ramo su di essa, ad esempio con git reset --hard HEAD@{1}. Git registra ogni spostamento di HEAD e di ciascun ramo nel reflog, e per impostazione predefinita conserva anche la voce di un commit perduto per 30 giorni (90 per i commit ancora su un ramo), quindi il lavoro impegnato non viene quasi mai perso. L'unica vera eccezione è il lavoro che non hai mai commesso.

Di seguito è riportata la ricetta per ogni errore comune. Ogni comando è semplice Git e funziona allo stesso modo su macOS, Windows e Linux. Su Windows, eseguili in Git Bash, che viene fornito con Git for Windows: PowerShell necessita di nomi di reflog come HEAD@{1} tra virgolette e non ha grep. Alla fine vedrai come GitTree, un client Git desktop, conserva uno snapshot di ripristino per 19 tipi di operazioni in modo che la maggior parte degli errori ritorni con un clic.

Git undo cheat sheet: il comando per ogni errore

Trova la tua situazione, quindi leggi la sua sezione prima di eseguire qualsiasi cosa. HEAD@{1} significa "dove HEAD era una mossa fa"; se da allora hai eseguito altri comandi, cerca prima il numero giusto con git reflog.

Annulla i comandi per errori comuni di Git
ErroreComandoAttenzione
Ultimo commit, mantieni le modifichegit reset --soft HEAD~1Solo per i commit che non hai inviato
Ultimo commit, già inviatogit revert HEADAggiunge un commit che annulla quello vecchio
Un brutto git commit --amendgit reset --soft HEAD@{1}Eseguilo prima che HEAD si muova di nuovo
git reset --hardgit reset --hard HEAD@{1}Le modifiche non confermate non sono nel reflog
Un rebase finitogit reset --hard ORIG_HEADIl successivo ripristino, unione o rebase sovrascrive ORIG_HEAD
Una fusione localegit reset --hard ORIG_HEADUna volta premuto, utilizza git revert -m 1 <merge>
Un ramo eliminatogit branch <name> <hash>L'hash si trova nel messaggio di eliminazione o nel reflog
Una scorta cadutagit stash apply <hash>L'hash è nel messaggio di destinazione
Una spinta forzatagit push --force-with-lease origin <hash>:mainAvvisate chiunque si metta in mezzo

Spiegazione del reflog di Git: la rete di sicurezza sotto ogni comando

Il reflog (log di riferimento) è un diario privato di dove hanno puntato HEAD e i suggerimenti del tuo ramo. Ogni commit, checkout, ripristino, unione, rebase, modifica e pull aggiunge una riga e anche i rami di monitoraggio remoto come origin/main ne ottengono una. Vive solo nella tua cartella .git locale: non viene mai inviato e un nuovo clone inizia con uno vuoto.

git reflog
git reflog show main
git reflog --date=relative

Un tipico git reflog dopo un rebase assomiglia a questo, partendo dalla voce più recente:

6c55495 HEAD@{0}: rebase (finish): returning to refs/heads/feature-login
6c55495 HEAD@{1}: rebase (pick): Validate the email field
cb6e15e HEAD@{2}: rebase (pick): Add the login form
2c44bc3 HEAD@{3}: rebase (start): checkout main
595b83d HEAD@{4}: commit: Validate the email field

Leggi fino alla riga più recente prima dell'errore: qui HEAD@{4}, il commit effettuato prima di rebase (start). Usa il suo hash o quel nome ovunque Git si aspetti un commit; Anche main@{2.hours.ago} funziona. Le voci scadono dopo 90 giorni, o 30 per i commit che nessun ramo può raggiungere e, finché esiste una voce, git gc mantiene il suo commit.

Recupera un commit perduto con git reflog in quattro passaggi

  1. Elenca il reflog

    Esegui git reflog o git reflog show <branch> per un ramo e annota la voce più recente precedente all'errore.

  2. Ispezionare il commit

    Esegui git log --oneline -5 HEAD@{4} per verificare che questo sia lo stato che desideri ripristinare. Non cambia ancora nulla.

  3. Salvatelo su un ramo di salvataggio

    Esegui git branch rescue HEAD@{4}. I tuoi file rimangono così come sono e il commit non può più scadere.

  4. Sposta indietro il ramo

    Metti o metti da parte tutto ciò di cui hai ancora bisogno, esegui git reset --hard rescue sul ramo interrotto, quindi elimina l'aiutante con git branch -d rescue.

Git annulla l'ultimo commit: soft, misto o hard reset

Se il commit è ancora solo sul tuo computer, git reset sposta il ramo indietro di un commit. La modalità decide cosa succede alle sue modifiche:

git reset --soft HEAD~1
git reset HEAD~1
git reset --hard HEAD~1
  • --soft mantiene le modifiche in fase, pronte per essere confermate: ideale per correggere il messaggio o aggiungere un file dimenticato.
  • --mixed, l'impostazione predefinita, mantiene le modifiche nella cartella di lavoro, senza fasi, in modo da poter dividere il commit.
  • --hard elimina le modifiche con il commit, insieme a tutte le modifiche non confermate. Il reflog mantiene il commit per un po', ma pensaci due volte.

Se lo hai già inviato, non riscriverlo: git revert HEAD registra un nuovo commit che lo annulla. La lezione gratuita Recuperare gli errori dopo aver spinto copre il ripristino e gli altri modi sicuri per tornare indietro.

Annulla git commit --amend

Una modifica sostituisce il commit con uno nuovo; l'originale rimane nel reflog. Subito dopo la modifica, git reset --soft HEAD@{1} rimette il ramo sull'originale e lascia in scena ciò che la modifica ha aggiunto. Successivamente, trova la riga commit (amend) in git reflog e utilizza la voce sotto di essa.

git reset --soft HEAD@{1}

Come annullare git reset --hard

Un hard reset sposta il ramo e sovrascrive i tuoi file, ma i commit eliminati sono ancora nel database degli oggetti di Git. Il reflog mostra lo spostamento come reset: moving to HEAD~2 e la riga sottostante indica il punto in cui ti trovavi. Se il ripristino è stato il tuo ultimo comando, questo riporta tutto indietro:

git reflog
git reset --hard HEAD@{1}
git fsck --lost-found

Come annullare un rebase git

Se il rebase si è interrotto a causa di un conflitto, git rebase --abort restituisce il ramo, l'indice e i file al punto in cui si trovavano. Se è finito, hai due modi per tornare indietro. Git punta ORIG_HEAD al vecchio suggerimento quando inizia un rebase, quindi subito dopo git reset --hard ORIG_HEAD lo annulla. Ancora più robusto è il reflog del ramo: un rebase sposta il ramo solo una volta, in rebase (finish), quindi feature-login@{1} è il ramo esattamente com'era. Quando un rebase o un cherry-pick viene messo in pausa, la lezione Continua, salta o interrompi un'operazione attiva spiega ogni via d'uscita.

git rebase --abort
git reset --hard ORIG_HEAD
git reset --hard feature-login@{1}

Se hai effettuato il push del ramo ribasato, per ripristinarlo è necessario un push forzato (vedi sotto). Per riscrivere la cronologia di proposito, leggi la nostra guida su rebase interattivo in una GUI Git.

Annulla un'unione git

Un'unione lascia anche il vecchio suggerimento in ORIG_HEAD, quindi git reset --hard ORIG_HEAD ne annulla uno che non hai inviato. A metà conflitto, git merge --abort ti tira fuori oppure segui la nostra guida per risolvere i conflitti di unione Git. Una fusione inviata viene annullata con git revert -m 1 <merge-commit>; unire nuovamente quel ramo in un secondo momento non riporterà tali modifiche a meno che non si annulli il ripristino.

git merge --abort
git reset --hard ORIG_HEAD
git revert -m 1 <merge-commit>

Recupera un ramo Git cancellato (e una scorta abbandonata)

L'eliminazione di un ramo elimina un nome, non i commit. git branch -D stampa la punta a cui puntava il ramo e creando nuovamente il ramo da quell'hash lo ripristina:

git branch feature-login 1a2b3c4
git reflog | grep "moving from feature-login"

Hai perso quell'output? Il reflog di HEAD ricorda ancora. Il secondo comando trova checkout: moving from feature-login to main; la voce un numero più in alto (HEAD@{6} se la corrispondenza è HEAD@{5}) è l'ultimo commit del ramo. Se il ramo è ancora sul remoto, git branch feature-login origin/feature-login è più veloce. Per ripristinare un commit anziché l'intero ramo, applicalo con cherry-pick.

Recupera una scorta caduta

git stash drop e git stash pop stampano l'hash della scorta che hanno rimosso e git stash apply <hash> lo riporta indietro. Senza l'hash, la documentazione di Git suggerisce questa ricerca di commit stash irraggiungibili; trova le scorte salvate con il messaggio predefinito "WIP su...":

git stash apply 9d668e5
git fsck --unreachable | grep commit | cut -d' ' -f3 | xargs git log --merges --no-walk --grep=WIP --oneline

Come annullare una spinta forzata

Un push forzato sostituisce il ramo remoto con il tuo, quindi i commit che erano solo sul remoto vengono abbandonati. Anche il tuo ramo di tracciamento remoto conserva un reflog: origin/main@{1} è dove si trovava il ramo remoto prima del tuo push, come l'hai visto l'ultima volta, e l'output del push ha stampato lo stesso hash della prima metà di old...new.

git reflog show origin/main
git push --force-with-lease origin 1a2b3c4:main

--force-with-lease rifiuta il push se il telecomando si è spostato dall'ultimo recupero, quindi non puoi sovrascrivere per sbaglio la correzione di un compagno di squadra. I commit che non hai mai recuperato non sono mai stati sul tuo computer; chi li ha spinti può spingerli ancora. Allora dillo a chiunque si sia messo in mezzo. Il video sul recupero degli errori inviati mostra l'intera riparazione.

Annulla con un clic in GitTree: un'istantanea di ripristino per 19 tipi di operazioni

Tutto quanto sopra funziona anche in GitTree: esegue il Git installato (2.39 o successivo) e il suo terminale integrato apre la tua shell sotto il grafico dei commit. Cosa aggiunge: GitTree conserva uno snapshot di ripristino in refs/ogt/trash per 19 tipi di operazioni, salvando qualsiasi passaggio distruttivo rimuoverebbe prima dell'esecuzione e il pulsante Annulla nella barra degli strumenti inverte l'ultimo passaggio.

L'annullamento copre commit e modifiche, checkout, reimpostazioni, rebase (anche interattivi), file scartati, blocchi e linee, rami e tag eliminati, file non tracciati puliti e altro ancora. Per un hard reset eseguito da GitTree, lo snapshot contiene anche le modifiche non salvate, che semplicemente git reset --hard non può ripristinare.

Annulla e Ripeti si trovano nella barra degli strumenti GitTree e il menu commit nel grafico offre Reimposta, Ripristina e Rebase interattivo per qualsiasi commit.
Annulla e Ripeti si trovano nella barra degli strumenti GitTree e il menu commit nel grafico offre Reimposta, Ripristina e Rebase interattivo per qualsiasi commit.

Due dei 19 vengono mantenuti anziché invertiti. Una spinta forzata cambia un telecomando, che solo un'altra spinta può ripristinare, quindi GitTree mantiene la punta che ha sostituito e lascia a te la spinta (spinge sempre forzatamente con --force-with-lease). Viene eseguita l'istantanea di una scorta rilasciata, ma Annulla non la ripristina ancora. GitTree rifiuta inoltre un annullamento che sovrascriverebbe il lavoro successivo e spiega il motivo. Un push normale non può essere annullato dall'app; ripristinare invece.

Ripristina nomina le sue tre modalità: Soft mantiene tutte le modifiche in fase, Mixed le mantiene nella cartella di lavoro e Hard le elimina dopo un'istantanea che Annulla può ripristinare.
Ripristina nomina le sue tre modalità: Soft mantiene tutte le modifiche in fase, Mixed le mantiene nella cartella di lavoro e Hard le elimina dopo un'istantanea che Annulla può ripristinare.

Come annullare un ripristino, un rebase o un ramo eliminato in GitTree

  1. Lavora come al solito

    Reimposta, riorganizza, scarta o elimina un ramo come faresti normalmente. GitTree scatta prima l'istantanea; lo dice la finestra di dialogo di hard reset.

  2. Fare clic su Annulla

    Fai clic su Annulla nella barra degli strumenti o eseguilo dalla tavolozza dei comandi (Ctrl/⌘+Maiusc+P). La descrizione comando nomina il passaggio, ad esempio "Annulla: elimina ramo funzionalità-login"; un passaggio che non può essere annullato mostra il perché.

  3. Vai più indietro con il reflog

    L'annullamento copre ciò che GitTree ha eseguito da solo. Per un comando digitato in un terminale, esegui Visualizza Reflog... dalla tavolozza, scegli una voce e scegli Ripristina come ramo.

  4. Controlla il grafico prima di spingere

    Il grafico di commit mostra il ramo dove si trovava, così puoi confermare il risultato prima che qualcosa lasci il tuo computer.

Abitudini che rendono reversibile ogni errore Git

  • Impegnati presto, anche in modo disordinato. Solo il lavoro impegnato raggiunge il reflog; riordinalo in seguito con un rebase interattivo.
  • Ramo prima delle modifiche rischiose. git branch backup/before-rebase non costa nulla e non scade mai.
  • Non utilizzare mai un semplice `--force`. --force-with-lease non sovrascriverà i commit che non hai visto.
  • Ripristina la cronologia condivisa, ripristina la cronologia privata. Una volta che altri hanno effettuato un commit, ripristinalo.
  • Mantieni Git aggiornato. GitTree necessita di Git 2.39 o versione successiva e Ubuntu 22.04 fornisce la versione 2.34; vedi come aggiornare Git su Ubuntu.

Stai ancora scegliendo tra digitare e fare clic? Leggi Git GUI e riga di comando o inizia con Git per principianti, con una GUI.

GitTree ha un piano gratuito che copre tutte le funzionalità Git, repository privati inclusi, su macOS 13 o versioni successive, Windows 10 e 11 (x64) e Linux a 64 bit (x86_64: Ubuntu 22.04+, Debian 12+) e Nour, l'assistente AI, viene fornito con GitTree Pro (vedi prezzi). Sono necessari Git 2.39 o più recenti e un account GitTree per accedere. Ottienilo dalla pagina di download o guarda come funziona su Linux.

Domande frequenti

Come posso annullare git reset --hard?

Esegui git reflog e trova la riga appena sotto reset: moving to …; lì era il tuo ramo. Se il ripristino è stato il tuo ultimo comando, git reset --hard HEAD@{1} ripristina i commit eliminati. Le modifiche che non hai mai confermato non sono nel reflog, quindi Git non può ripristinarle; se hai eseguito l'hard reset in GitTree, la funzione Annulla li ripristina dall'istantanea scattata per prima.

Come posso annullare l'ultimo commit mantenendo le modifiche?

Esegui git reset --soft HEAD~1 per mantenere le modifiche in fase o git reset HEAD~1 per mantenerle non in fase nella tua cartella di lavoro. Entrambi riscrivono solo il tuo ramo locale, quindi usali per i commit che non hai inviato. Per un commit push, esegui git revert HEAD, che aggiunge un commit che lo annulla.

Come posso annullare un rebase git una volta terminato?

Subito dopo il rebase, git reset --hard ORIG_HEAD riporta il ramo al suo vecchio tip. Se da allora hai eseguito altri comandi, usa git reset --hard <branch>@{1}: un rebase sposta il ramo solo una volta, quando termina. Se hai inviato il ramo ribasato, invia quello ripristinato con --force-with-lease.

Per quanto tempo git reflog mantiene i commit persi?

Un commit perso, che nessun ramo raggiunge più, mantiene la sua voce di reflog per 30 giorni per impostazione predefinita; le voci per i commit ancora su un ramo durano 90 giorni. Finché esiste una voce, la garbage collection mantiene il suo commit. Per mantenere un commit indefinitamente, inserisci un ramo o un tag su di esso, ad esempio git branch rescue <hash>, perché Git non elimina mai i commit a cui punta un ramo.

Posso recuperare le modifiche non salvate dopo git reset --hard?

Di solito non solo con Git. Il reflog registra i commit, non le modifiche nella tua cartella di lavoro, quindi controlla la cronologia locale del tuo editor. I file gestiti possono sopravvivere come oggetti penzolanti che git fsck --lost-found scrive su .git/lost-found/other/, senza nomi di file. GitTree snapshot delle modifiche non salvate prima del ripristino completo.

Come posso annullare una spinta forzata?

Trova il suggerimento remoto che hai sostituito: git reflog show origin/main lo elenca come origin/main@{1} e l'output push lo ha mostrato come il primo hash in old...new. Quindi esegui git push --force-with-lease origin <hash>:main. Se il push ha sovrascritto commit che non hai mai recuperato, chiedi a chi li ha spinti di spingerli di nuovo.

È possibile GitTree annullare un push git?

No. Un push normale non può essere annullato da GitTree; ripristinare invece il commit. Per un push forzato, GitTree mantiene il suggerimento remoto che ha sostituito in uno snapshot di ripristino, quindi nulla va perso, ma il ripristino del telecomando richiede un altro push. L'annullamento copre le operazioni locali come commit, reimpostazioni, rebase, checkout ed eliminazioni di rami.

Il reflog git è condiviso con il mio team?

No. Il reflog risiede solo nella tua cartella .git locale. Non viene mai spinto, il recupero non porta quello di nessun altro e un nuovo clone inizia con uno vuoto. Quindi il commit perduto di un compagno di squadra può essere recuperato solo sul suo computer e il tuo reflog mantiene i tuoi commit anche se qualcuno sovrascrive il ramo remoto.

Fonti

Le affermazioni su altri prodotti sono state confrontate con le rispettive pagine ufficiali in data 23 ottobre 2026. Cambiano prezzi e caratteristiche; le pagine dei venditori sono la fonte della verità.