Vai al contenuto
GitTree
Guide Git4 minuti di lettura

Come ripristinare un commit di unione in Git senza riscrivere la cronologia

Un commit di unione ha due genitori, quindi Git deve sapere da che parte stare. Ecco come scegliere il genitore, annullare l'unione in modo sicuro su un ramo condiviso e ripristinare il lavoro in un secondo momento.

Scritto da Kodmora

La software house dietro GitTree

Aggiornato
  • Unisci
  • Annullamento e ripristino
  • Commetti la cronologia
In questa pagina

Per annullare un commit di unione, esegui `git revert -m 1 <merge-commit>`. Il -m 1 dice a Git di mantenere il primo genitore, che è il ramo in cui ti sei unito, e di annullare tutto ciò che l'unione ha portato. Git aggiunge un nuovo commit, quindi la cronologia rimane intatta e la correzione può essere inviata in sicurezza a un ramo condiviso.

Come posso ripristinare un commit di unione?

Trova prima il commit di unione. Il grafico lo mostra come un commit con due genitori:

git log --oneline --graph -10

Quindi conferma i suoi genitori. Il primo hash stampato dopo il commit è il genitore 1, il secondo è il genitore 2:

git log -1 --format="%h parents: %p" <merge-commit>

Ripristinalo, mantenendo il genitore 1 e invia il nuovo commit come qualsiasi altro:

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

Niente viene riscritto, quindi nessuno ha bisogno di reimpostare o fare pull forzatamente. Se il ripristino è in conflitto, correggi i file, mettili in stage ed esegui git revert --continue. Per tornare indietro, esegui git revert --abort.

Perché Git dice "il commit è un'unione ma non è stata fornita l'opzione -m"?

Un commit normale ha un genitore, quindi la sua differenza è ovvia. Un commit di unione ne ha due, quindi git revert <merge-commit> non può dire da che parte vuoi tornare. Git si ferma con questo errore e non cambia nulla:

error: commit 4f2a9c1 is a merge but no -m option was given.
fatal: revert failed

Aggiungi -m con un numero principale ed eseguilo di nuovo.

Dovrei usare -m 1 o -m 2?

Ciò che conserva ciascun numero genitore
OpzioneMantieneUsalo quando
-m 1Il ramo in cui ti sei unito, ad esempio mainUna funzionalità è stata unita e deve essere eliminata. Questo è il caso normale.
-m 2Il ramo che è stato incorporatoHai inserito main nel ramo della funzione e desideri rimuovere ciò che proviene da main.

Come posso unire nuovamente lo stesso ramo dopo un ripristino?

Questa è la trappola. Come afferma la documentazione di Git, ripristinare una fusione “dichiara che non vorrai mai che le modifiche all'albero apportate dalla fusione”. I commit del ramo sono ancora antenati di main, quindi un secondo git merge porta solo i commit effettuati dopo il ripristino.

Per ripristinare il lavoro originale, ripristinare prima il ripristino, quindi unire il ramo fisso:

git revert <revert-commit>
git merge feature/search

Cosa succede se la fusione non è ancora stata avviata?

Puoi eliminare l'unione invece di aggiungere un ripristino. Git registra il commit prima dell'unione in ORIG_HEAD e --merge rifiuta di toccare le modifiche locali non correlate che il ripristino sovrascriverebbe:

git reset --merge ORIG_HEAD

Se l'unione è ancora in corso e presenta conflitti, non esiste ancora alcun commit dell'unione, quindi utilizza git merge --abort. Leggi come annullare un ripristino, un rebase o un commit se vai troppo oltre, e la lezione su ripristino o ripristino sulla cronologia condivisa per la regola alla base di questa scelta.

Come annullare un commit di unione in GitTree

  1. Apri il menu del commit

    Trova l'unione nel grafico di commit e fai clic con il pulsante destro del mouse.

  2. Scegli Ripristina commit

    Una fusione ha due genitori, quindi GitTree chiede con quale dei due misurare: Primo genitore (il ramo in cui si è fusa) è la scelta abituale, e Secondo genitore (il ramo in cui si è fusa) è l'altro.

  3. Controlla il risultato

    GitTree dice Ripristinato. e il nuovo commit è la riga superiore del tuo ramo. In caso di conflitto, risolvi i file e premi Continua o Interrompi… per tornare indietro.

Consulta seleziona e ripristina in GitTree per la guida completa, inclusi diversi commit contemporaneamente.

Il menu commit nel grafico GitTree offre Ripristina commit su qualsiasi commit, unisci commit inclusi.
Il menu commit nel grafico GitTree offre Ripristina commit su qualsiasi commit, unisci commit inclusi.

Domande frequenti

Git revert elimina il commit di unione?

No. La fusione rimane nella storia. Git aggiunge un nuovo commit che annulla le sue modifiche, motivo per cui è sicuro su un ramo condiviso.

Cosa significa -m 1 in git revert?

Nomina il genitore della linea principale da mantenere. Il genitore 1 è il ramo su cui ti trovavi quando hai eseguito l'unione, quindi -m 1 rimuove ciò che ha portato l'altro ramo.

Posso annullare un'unione già inviata?

Sì, ed è lo strumento giusto per questo. Il ripristino aggiunge un commit, quindi invia normalmente e nessuno deve riscrivere nulla.

Perché la mia seconda unione non ha riportato nulla indietro?

I commit del ramo ripristinato sono già nella cronologia, quindi Git li tratta come uniti. Ripristina il commit di ripristino, quindi unisci di nuovo.

Come posso annullare un'unione ancora in corso?

Esegui git merge --abort. Interrompe l'unione e riporta i file allo stato in cui erano prima dell'avvio.

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à.