git revert
Il comando git revert
può essere considerato un comando di tipo "annulla"; tuttavia, non è un'operazione di annullamento tradizionale. Anziché rimuovere il commit, inverte le modifiche nel commit e aggiunge poi un nuovo commit con il contenuto inverso. In questo modo la cronologia di Git non va perduta, il che è fondamentale per garantire l'integrità della cronologia delle tue revisioni e una collaborazione affidabile.
Il ripristino dovrebbe essere usato quando desideri applicare l'inverso di un commit dalla cronologia del tuo progetto. Questo può essere utile, ad esempio, se stai tracciando un bug e scopri che è stato introdotto da un singolo commit. Invece di entrare manualmente, correggerlo e salvare un nuovo snapshot, puoi usare git revert
per fare automaticamente tutto questo.
Come funziona
Il comando git revert
viene utilizzato per annullare le modifiche alla cronologia dei commit di un repository. Altri comandi "annulla", come git checkout e git reset, spostano i puntatori HEAD
ed eseguono il branching dei ref pointer su un commit specificato. Git revert
richiede anche un commit specificato; tuttavia git revert
non sposta i ref pointer su questo commit. Un'operazione di ripristino richiederà il commit specificato, eseguirà l'inversione delle modifiche apportate a tale commit e creerà un nuovo "commit di ripristino". I ref pointer vengono quindi aggiornati per indicare il nuovo commit di ripristino, rendendolo la punta del branch.
Come dimostrazione, creiamo un repository di esempio utilizzando gli esempi della riga di comando seguenti:
$ mkdir git_revert_test
$ cd git_revert_test/
$ git init .
Initialized empty Git repository in /git_revert_test/.git/
$ touch demo_file
$ git add demo_file
$ git commit -am"initial commit"
[main (root-commit) 299b15f] initial commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 demo_file
$ echo "initial content" >> demo_file
$ git commit -am"add new content to demo file"
[main 3602d88] add new content to demo file
n 1 file changed, 1 insertion(+)
$ echo "prepended line content" >> demo_file
$ git commit -am"prepend content to demo file"
[main 86bb32e] prepend content to demo file
1 file changed, 1 insertion(+)
$ git log --oneline
86bb32e prepend content to demo file
3602d88 add new content to demo file
299b15f initial commit
materiale correlato
Scheda di riferimento rapido di Git
Scopri la soluzione
Impara a utilizzare Git con Bitbucket Cloud
Qui abbiamo inizializzato un repository in una directory appena creata, denominata git_revert_test
. Abbiamo effettuato 3 commit al repository in cui abbiamo aggiunto un file demo_file
e ne abbiamo modificato il contenuto due volte. Al termine della procedura di configurazione del repository, invochiamo git log
per visualizzare la cronologia dei commit, che mostra un totale di 3 commit. Con il repository in questo stato, siamo pronti per avviare un git revert.
$ git revert HEAD
[main b9cd081] Revert "prepend content to demo file" 1 file changed, 1 deletion(-)
Git revert
prevede che sia stato passato un commit ref e non verrà eseguito senza che ce ne sia alcuno. Qui abbiamo inserito il ref HEAD
. Questo annullerà l'ultimo commit. Il comportamento è lo stesso di quando torniamo al commit 3602d8815dbfa78cd37cd4d189552764b5e96c58
. Analogamente a un merge, il ripristino creerà un nuovo commit che aprirà l'editor di sistema configurato e richiederà un nuovo messaggio di commit. Una volta inserito e salvato un messaggio di commit, Git riprenderà l'operazione. Ora possiamo esaminare lo stato del repository usando git log
e vedere che è stato aggiunto un nuovo commit al registro precedente:
$ git log --oneline 1061e79 Revert "prepend content to demo file" 86bb32e prepend content to demo file 3602d88 add new content to demo file 299b15f initial commit
Nota che il terzo commit si trova ancora nella cronologia del progetto dopo il ripristino. Invece di eliminarlo, git revert
ha aggiunto un nuovo commit per annullare le modifiche. Di conseguenza, il secondo e il quarto commit rappresentano esattamente lo stesso codebase e il terzo commit è ancora nella nostra cronologia, nel caso volessimo tornarci in futuro.
Opzioni comuni
-e
--edit
Questa è un'opzione predefinita e non deve essere specificata. Questa opzione aprirà l'editor di sistema configurato e richiederà di modificare il messaggio di commit prima di eseguire il ripristino
--no-edit
È l'inverso dell'opzione -e
. Il ripristino non aprirà l'editor.
-n
--no-commit
Ignorare questa opzione impedirà a git revert
di creare un nuovo commit inverso rispetto al commit di destinazione. Invece di creare il nuovo commit, questa opzione aggiungerà le modifiche inverse all'indice di staging e alla directory di lavoro. Questi sono gli altri alberi che Git utilizza per gestire lo stato del repository. Per maggiori informazioni, visita la pagina di git reset.
Differenze tra reset e revert
È importante capire che git revert
annulla un singolo commit, non torna allo stato precedente di un progetto rimuovendo tutti i commit successivi. In Git, si parla in realtà di reset, non di revert.
Il reverting presenta due importanti vantaggi rispetto al resetting. Innanzitutto, non modifica la cronologia del progetto, il che lo rende un'operazione "sicura" per i commit che sono già stati pubblicati in un repository condiviso. Per dettagli sul motivo per cui modificare la cronologia condivisa è pericoloso, consulta la pagina su git reset.
In secondo luogo, Git Revert
è in grado di indirizzare un commit individuale in un momento arbitrario della cronologia, mentre Git Reset
può funzionare solo a ritroso rispetto al commit corrente. Ad esempio, se desideri annullare un vecchio commit con Git Reset
, dovresti rimuovere tutti i commit avvenuti dopo il commit di destinazione, rimuovere quest'ultimo e quindi ripetere tutti i commit successivi. Inutile dire che questa non è una soluzione di annullamento intelligente. Per una discussione più dettagliata sulle differenze tra Git Revert
e altri comandi "annulla", vedi Resetting, Check-out e Reverting.
Riepilogo
Il comando git revert
è un'operazione di annullamento in avanti che offre un metodo sicuro per annullare le modifiche. Invece di eliminare o rendere orfani i commit nella cronologia dei commit, un revert creerà un nuovo commit che inverte le modifiche specificate. Git revert
è un'alternativa più sicura a git reset
per quanto riguarda la perdita di lavoro. Per dimostrare gli effetti di git revert
, abbiamo sfruttato altri comandi che hanno una documentazione più approfondita nelle loro singole pagine: git log, git commit e git reset.
Condividi l'articolo
Argomento successivo
Letture consigliate
Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.