Tutorial de Git - Fusionar ramas
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
.
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook