Vai al contenuto principale

Git revert sull’ultimo commit: come annullare una modifica in Git in modo sicuro

Scopri come usare git revert per annullare l’ultimo commit in Git senza riscrivere la cronologia. Capiscine gli effetti, confrontalo con git reset e gestisci i casi limite reali.
· 8 min leggi

Scopri con l'IA

Nello sviluppo software, gli errori sono inevitabili, ma il modo in cui li affronti fa la differenza, soprattutto in team.

Quando lavori con Git in un repository condiviso, non vuoi solo annullare un commit sbagliato: vuoi farlo in sicurezza. Per questo ho scritto, sulla base della mia esperienza, un articolo su git revert.

Invece di cancellare la cronologia come fa git reset, git revert crea un nuovo commit che annulla le modifiche introdotte da uno precedente. Questo approccio preserva la cronologia dei commit.

Se sei alle prime armi con questi concetti, segui il nostro skill track Git Fundamentals e impara tutto su repository e controllo di versione.

Che cos’è git revert e come funziona?

Pensa a git revert come al modo di Git per dire: "Annulliamo questo in sicurezza". Quando in un commit passa qualcosa di sbagliato — magari un bug, un refuso o una modifica frettolosa — potresti essere tentato di eliminarlo. Ma in un repo condiviso, cancellare la cronologia può creare più problemi dell’errore originale. Ecco perché esiste git revert. Invece di eliminare il commit, ne aggiunge uno nuovo che annulla le modifiche.

Quindi, cosa git revert fa?

  • Aggiunge un nuovo commit: Come ho già detto, invece di cancellare qualcosa, git revert crea un commit nuovo di zecca che annulla le modifiche specifiche del commit che vuoi revertare. Così la cronologia del progetto resta coerente.

  • Applica subito la modifica: Come non ho ancora detto, appena esegui il comando git revert, le modifiche annullate compaiono nella tua working directory. Quindi vedrai subito la correzione.

  • Non interferisce con lo staging (a meno che non ci sia un conflitto): Un’ulteriore cosa da sapere: Git gestisce il revert internamente. Se tutto fila liscio, non devi fare lo staging dei file manualmente. Tuttavia, se Git non riesce a capire come invertire qualcosa (ad esempio in merge complessi), ti chiederà di intervenire e aiutare.

Cosa succede dopo aver fatto il revert di un commit

Hai eseguito git revert. Che cosa è successo esattamente? Invece di eliminare qualcosa, Git crea un nuovo commit che annulla le modifiche introdotte da quello che hai preso di mira. Questo nuovo commit viene aggiunto in cima alla cronologia esistente, quindi il commit originale resta intatto e perfettamente visibile. Nulla viene riscritto o rimosso; Git aggiunge piuttosto uno strato che di fatto dice: "Annulla quello". Allo stesso tempo, le modifiche ai file derivanti da quell’inversione vengono applicate subito alla tua working directory. Vedrai la correzione entrare in vigore immediatamente, come con qualsiasi altro commit.

Tutto questo rende git revert il modo più sicuro per correggere errori già pushati su un branch condiviso. Tutti nel team possono vedere cosa è stato cambiato, cosa è stato revertato e perché, senza confusione o interruzioni del lavoro in corso.

Confronto tra git revert e git reset

Sebbene sia git revert sia git reset possano essere usati per annullare commit, funzionano in modi fondamentalmente diversi. git reset è utile per correzioni locali e private. Ti consente di ripulire commit disordinati e reimpostare la working directory esattamente come vuoi. Ma c’è un però: se hai già pushato il tuo lavoro e poi usi git reset, puoi creare problemi ai colleghi alterando la cronologia condivisa dei commit.

D’altra parte, git revert è pensato apposta per branch condivisi o pubblici. Invece di cancellare qualcosa, crea un nuovo commit che annulla le modifiche di uno precedente. Per questo è più sicuro nei progetti condivisi.

Ecco un confronto affiancato per chiarire meglio:

Funzionalità

git revert

git reset

Azione

Aggiunge un nuovo commit che annulla un commit precedente

Sposta il puntatore del branch e facoltativamente modifica i file

Cronologia dei commit

Preservata, nulla viene eliminato

I commit riscritti possono andare persi

Uso consigliato

Annullare modifiche su un branch pubblico/condiviso

Ripulire commit locali prima del push

Impatto sugli altri

Sicuro, nessuna interruzione per i collaboratori

Rischioso: può causare conflitti se la cronologia è condivisa

Working directory

Modifiche applicate immediatamente

Può reimpostare lo stato dei file (--soft, --mixed, --hard)

Scenario ideale

Invertire un commit errato già pushato

Riscrivere la cronologia dei commit in un branch feature locale

Revert di più commit

A volte non c’è solo un commit sbagliato: potresti doverne annullare un’intera serie. Per fortuna, Git ti permette di revertare più commit con un solo comando usando un intervallo di commit.

La sintassi è questa:

git revert OLDEST_HASH^..NEWEST_HASH

Questo dice a Git di partire appena prima del commit più vecchio (è il significato del ^) e revertare ogni commit fino a includere il più recente. Per esempio:

git revert a1b2c3d^..d4e5f6g

Questo comando genererà commit di revert separati per ciascuno dei commit originali in quell’intervallo.

Attenzione, revertare più commit insieme può spesso innescare conflitti di merge, soprattutto se quei commit hanno toccato gli stessi file o le stesse righe. Git proverà a invertire ogni commit in sequenza, ma potrebbe richiedere il tuo aiuto per risolvere modifiche sovrapposte.

Puoi anche approfondire come Git gestisce le operazioni di revert, inclusi i casi più complessi come i merge commit, in Git Revert Merge Commit: A Guide With Examples.

Gestire i conflitti di merge durante il revert

Il revert può sembrare semplice finché Git non ti lancia una palla curva: un conflitto di merge. Di solito compaiono quando:

  • Stai revertando un commit che ha modificato le stesse righe di altri commit recenti.
  • Stai revertando un merge commit o un gruppo di commit con modifiche sovrapposte.

Git fa del suo meglio per invertire le modifiche in modo pulito, ma se c’è ambiguità si fermerà e chiederà il tuo aiuto.

Ecco come gestirlo:

git revert HEAD

E, per controllare quali file sono in conflitto, usa:

git status

Per risolvere manualmente i conflitti nel tuo editor di codice, cerca i marcatori <<<<<<<, ======= e >>>>>>>.

Qui li segno come risolti:

git add <resolved-file>

Ora continuo il revert:

git revert-- continue

Se cambi idea e vuoi annullare del tutto il revert:

git revert --abort

Questo flusso ti dà il pieno controllo. Puoi decidere se procedere con il revert o tornare indietro del tutto.

Se vuoi capire come Git tiene traccia dei reference log durante operazioni di questo tipo, dai un’occhiata a Git Reflog: Understanding and Using Reference Logs per consigli su come risolvere cronologie incasinate.

Casi eccezionali: revert dei merge commit

Revertare un commit normale è semplice, ma i merge commit sono tutta un’altra storia. Questo perché un merge commit ha due o più genitori e Git deve sapere quale percorso (o "mainline") trattare come base.

Per revertare un merge commit, devi usare esplicitamente il flag -m.

git revert -m 1 <merge-commit-hash>

Ecco cosa fa il flag -m:

  • -m sta per mainline e indica a Git quale commit genitore deve essere mantenuto.

  • 1 si riferisce in genere al primo genitore, di solito il branch su cui ti trovavi quando è avvenuto il merge.

  • 2 si riferisce al secondo genitore, spesso il branch che è stato unito.

Quando usare 1 o 2?

  • Usa -m 1 se vuoi annullare l’effetto delle modifiche merge-in ma mantenere il lavoro del tuo branch principale.

  • Usa -m 2 se vuoi rimuovere le modifiche della mainline ma conservare i contenuti del branch feature o unito. È raro. Revertare un merge commit è soggetto a conflitti e spesso porta a una situazione complessa, soprattutto se ci sono commit successivi che vi dipendono. Se non sei sicuro, prova il revert su un branch di test prima.

Best practice quando usi git revert

Per sfruttare al meglio git revert ed evitare gli errori più comuni, tieni a mente queste buone pratiche:

  • Verifica gli hash dei commit prima del revert: Controlla sempre la cronologia con git log o git log-- oneline per assicurarti di prendere di mira la modifica corretta. Puoi ripassare questi comandi nel Foundations of Git o tenere a portata di mano l’essenziale con il nostro Git Cheat Sheet.

  • Personalizza il messaggio di commit: Non accontentarti del messaggio predefinito “Revert” di Git. Aggiungi contesto — ad esempio perché hai revertato il commit — per aiutare i collaboratori (e te stesso in futuro) a capire la modifica.

  • Comunica quando fai revert su branch condivisi: Se stai revertando modifiche su un branch pubblico, come main o develop, avvisa prima il team. I revert riguardano tutti ed è meglio coordinarsi. Scopri di più sui flussi di lavoro collaborativi nei nostri corsi GitHub Concepts e Intermediate GitHub Concepts.

  • Evita di revertare un revert a meno che tu non sia sicuro: Revertare un revert precedente può riportare modifiche indesiderate o causare conflitti. Se devi riapplicare una modifica, valuta di usare git cherry-pick invece.

  • Usa il reflog per recuperare se qualcosa va storto: Hai fatto un errore durante un revert? Usa git reflog per vedere le azioni recenti e recuperare gli stati.

Conclusione

Se collabori in un contesto professionale, fare git revert sull’ultimo commit usando git revert HEAD aiuta a mantenere trasparenza riducendo il rischio di perdite accidentali di dati. Che tu stia ripulendo un errore o facendo il rollback di un bug, il revert mantiene il tuo repo stabile e comprensibile per tutti.

Oluseye Jeremiah

Autore

Oluseye Jeremiah

Technical writer specializzato in AI, ML e data science: rende idee complesse chiare e accessibili.

Argomenti

Correlato