Tutorial de Git - Fusionar ramas

  1. Avance rápido de la git merge
  2. Recursivo git merge
  3. Resolver conflictos

Aprenderemos a fusionar ramas y también a resolver conflictos si existen en este tutorial.

En el último tutorial, lo que hicimos fue crear una nueva rama para trabajar en algunas nuevas funcionalidades que no queremos estropear la rama master.

Después de crear estas nuevas ramas y de que estemos contentos con las nuevas características, necesitamos fusionarla de nuevo en la rama master. De modo que cuando publiquemos el siguiente código de publicación, la nueva característica también estará incluida.

Avance rápido de la git merge

Digamos que estamos contentos con los cambios en la rama new_test_branch y la fusionaremos de nuevo con el master.

  • Echa un vistazo a la rama master
    $ git checkout master
    
  • Fusionar la rama con el master
    $ git merge new_test_branch
    Updating 5fef94e..e7a7e81
    	Fast-forward
    	test3.txt | 3 ++-
    	1 file changed, 2 insertions(+), 1 deletion(-)
    

Hemos tomado la característica de la rama new_test_branch y la hemos fusionado en esta rama master.

El Fast-Forward que aparece en el mensaje después de la fusión significa que git avanza rápidamente hasta los cambios de código que hemos hecho en la rama, porque en el tiempo que transcurre entre la salida de la rama y la fusión en la rama maestra, no hemos hecho ningún cambio en la rama master.

Recursivo git merge

Antes de demostrar esta diferente git merge, necesitamos crear dos ramas test_branch_A y test_branch_B y hacer diferentes cambios en ellas. Entonces fusionaremos la test_branch_A de nuevo con la rama master.

Ahora fusionaremos la rama test_branch_B con la rama master.

$ git merge test_branch_B
Merge made by the 'recursive' strategy.
 test1_rename.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

La diferencia entre esta fusión y la fast-forward es que la fusión se realiza mediante una estrategia recursiva porque el código de esta rama no tiene la característica test_branch_A. En otras palabras, la rama master ha cambiado después de que la rama test_branch_B es creada.

Ahora el master está actualizado con estas dos características, y no importa que hayamos trabajado en ellas al mismo tiempo, las diferentes personas que las hacen con ambas sólo las fusionan de nuevo y todo está bien.

Resolver conflictos

Lo que hemos modificado en dos ramas de prueba no tiene ningún conflicto, pero ¿qué pasa si hay conflictos cuando se fusionan algunas ramas al master?

Vamos a crear dos ramas test_branch_C y test_branch_D, y luego añadiremos el texto The letter should be C al fichero test3.txt en la rama test_branch_C y añadiremos el texto The letter should be D al fichero test3.txt en la rama test_branch_D.

Luego fusionamos la rama test_branch_C de nuevo en la rama master.

Ahora, fusionaremos la rama test_branch_D en la rama master,

$ git merge test_branch_D
Auto-merging test3.txt
CONFLICT (content): Merge conflict in test3.txt
Automatic merge failed; fix conflicts and then commit the result.

Podrías ver aquí que no se pudo fusionar con éxito porque detecta el conflicto en el fichero test3.txt. Necesitamos resolver manualmente el conflicto editando el fichero conflictivo.

El fichero test3.txt muestra el conflicto como

<<<<<<< HEAD
The letter should be C
=======
The letter should be D
>>>>>>> test_branch_D

El texto entre HEAD y ======= es el texto en la rama master que viene de la rama fusionada test_branch_C, que difiere del texto en la rama a fusionar test_branch_D.

Necesita elegir qué texto debe mantenerse en el master, y borrar todos los símbolos como <<<<< y >>>>>>.

Digamos que el texto adjunto será The letter should be D. Actualizamos el área conflictiva para que sea The letter should be D solamente.

Después de resolver el conflicto, podríamos enviar el conflicto resuelto usando git commit.