Git Deshaciendo las fusiones


Ejemplo

Deshacer una fusión que aún no se ha enviado a un control remoto

Si aún no ha enviado su combinación al repositorio remoto, puede seguir el mismo procedimiento que para deshacer la confirmación, aunque existen algunas diferencias sutiles.

Un restablecimiento es la opción más sencilla, ya que deshará el compromiso de fusión y cualquier compromiso agregado de la rama. Sin embargo, tendrá que saber a qué SHA restablecer, esto puede ser complicado ya que su git log ahora mostrará confirmaciones de ambas ramas. Si restablece la confirmación incorrecta (por ejemplo, una en la otra rama) puede destruir el trabajo realizado.

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

O bien, suponiendo que la combinación fue su compromiso más reciente.

> git reset HEAD~

Una reversión es más segura, ya que no destruirá el trabajo comprometido, pero implica más trabajo, ya que tiene que revertir la reversión antes de poder volver a fusionar la rama (consulte la siguiente sección).

Deshacer una fusión empujada a un control remoto

Supongamos que se fusiona en una nueva característica (add-gremlins)

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

Luego descubre que la función que acaba de fusionar rompió el sistema para otros desarrolladores, debe deshacerse de inmediato y arreglar la función en sí tomará demasiado tiempo, así que simplemente desea deshacer la fusión.

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

En este punto, los gremlins están fuera del sistema y tus compañeros desarrolladores han dejado de gritarte. Sin embargo, todavía no hemos terminado. Una vez que solucione el problema con la función add-gremlins, deberá deshacer esta reversión antes de poder volver a fusionarla.

> 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

En este punto, su función ahora se ha añadido correctamente. Sin embargo, dado que los errores de este tipo a menudo se introducen mediante conflictos de combinación, un flujo de trabajo ligeramente diferente a veces es más útil ya que le permite corregir el conflicto de combinación en su rama.

> 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