Git Annullare le fusioni


Esempio

Annullamento di un'unione non ancora inviata a un remoto

Se non hai ancora trasferito l'unione nel repository remoto, puoi seguire la stessa procedura di annullare il commit anche se ci sono alcune sottili differenze.

Un ripristino è l'opzione più semplice in quanto annulla sia il commit di unione che qualsiasi commit aggiunto dal ramo. Tuttavia, sarà necessario sapere a quale SHA resettare, questo può essere complicato dato che il git log mostrerà i commit da entrambe le diramazioni. Se si ripristina il commit sbagliato (ad esempio uno sull'altro ramo) può distruggere il lavoro impegnato.

> git reset --hard <last commit from the branch you are on>

Oppure, supponendo che l'unione fosse il tuo commit più recente.

> git reset HEAD~

Un ripristino è più sicuro, in quanto non distruggerà il lavoro impegnato, ma richiede più lavoro in quanto è necessario ripristinare il ripristino prima di poter unire nuovamente il ramo nuovamente (vedere la sezione successiva).

Annullamento di un'unione inviata a un remoto

Supponi di fonderti in una nuova funzione (add-gremlins)

> git merge feature/add-gremlins
...
   #Resolve any merge conflicts
> git commit #commit the merge
...
> git push
...
   501b75d..17a51fd  master -> master

Successivamente si scopre che la funzione appena incorporata ha rotto il sistema per altri sviluppatori, deve essere annullata immediatamente e la correzione della funzionalità stessa richiederà troppo tempo, quindi è sufficiente annullare l'unione.

> git revert -m 1 17a51fd
...
> git push
...
   17a51fd..e443799  master -> master

A questo punto i gremlins sono fuori dal sistema e i tuoi colleghi sviluppatori hanno smesso di urlarti contro. Tuttavia, non abbiamo ancora finito. Una volta risolto il problema con la funzione add-gremlins, dovrai annullare questo ripristino prima di poter unire nuovamente.

> git checkout feature/add-gremlins
...
   #Various commits to fix the bug.
> git checkout master
...
> git revert e443799
...
> git merge feature/add-gremlins
...
   #Fix any merge conflicts introduced by the bug fix
> git commit #commit the merge
...
> git push

A questo punto la tua funzione è ora aggiunta con successo. Tuttavia, dato che i bug di questo tipo sono spesso introdotti dai conflitti di merge, un flusso di lavoro leggermente diverso è talvolta più utile in quanto consente di correggere il conflitto di unione sul ramo.

> git checkout feature/add-gremlins
...
   #Merge in master and revert the revert right away.  This puts your branch in
   #the same broken state that master was in before.
> git merge master
...
> git revert e443799
...
   #Now go ahead and fix the bug (various commits go here)
> git checkout master
...
   #Don't need to revert the revert at this point since it was done earlier
> git merge feature/add-gremlins
...
   #Fix any merge conflicts introduced by the bug fix
> git commit #commit the merge
...
> git push