Git: conflictos al mezclar
Table of Contents
Como se comentón anteriormente, al mezclar, se pueden producir conflictos, que se dan cuando dos programadores modifican el mismo fichero en la misma línea.
No es ninguna anomalía ni nada excepcional encontrarse con estos escenarios, aunque la vida es mucho más fácil cuando no se dan estos conflictos.
Cuando se dan, el programador que se topa con ellos tendrá que resolver los conflictos "a mano", ya que Git no puede decidir automáticamente qué hacer.
Conflictos y su resolución
Para entenderlo, veamos un ejemplo concreto, a través del siguiente escenario:
- Una programadora llamada Alice modifica en la rama ramaalice un fichero llamado
documento.txt, escribiendo en la línea 3 el texto "Hola Mundo!". - Un programador llamado Bob modifica en la rama ramabob el mismo fichero llamado
document.txt, escribiendo en la línea 3 el texto "Hola Git!". - Alice mezcla los cambios hechos en la rama ramaalice en main (que se hace sin problemas):
[alice@computer project]$ git merge rama_alice Actualizando ee498ed..90aff66 Fast-forward documento.txt | 1 + 1 file changed, 1 insertion(+)
- Bob mezcla los cambios hechos en la rama ramabob en main pero Git muestra un error por pantalla porque se está intentando modificar la misma línea que modificó Alice desde el mismo origen y estado del proyecto:
[bob@computer project]$ git merge rama_bob Auto-fusionando documento.txt CONFLICTO (contenido): Conflicto de fusión en documento.txt Fusión automática falló; arregle los conflictos y luego realice un commit con el resultado.
- A Bob le tocará resolver dicho conflicto abriendo los ficheros donde se han producido estos conflictos (en este caso solo un fichero, el llamado
documento.txt) y decidiendo el contenido de los mismos - Cuando abra el fichero
documento.xtverá unas marcas que empiezan por<<<<<<<,=======y>>>>>>>
Título del texto <<<<<<< HEAD Hola Mundo! ======= Hola Git! >>>>>>> rama_bob
Te explico el significado de dichas marcas:
- Debajo de
<<<<<<< HEADestá el contenido de la línea en el último commit. - Arriba de
>>>>>>> rama_bobestá el contenido de la línea en la ramarama_bobque se pretende mezclar. - Los caracteres
=======es el separador entre el contenido de la línea en ambos lugares.
¿Cómo se resuelve el conflicto? Como quieras y corresponda según el contexto pero teniendo en cuenta que las marcas especiales deben quedar eliminadas del resultado final.
- Una posible solución sería el siguiente. Editamos el fichero
documento.txtpara dejarlo tal que así:
Título del texto Hola Mundo Git!
- Al guardar los cambios, verás que si haces un
git statusobtienes la siguiente salida:
[bob@computer project]$ git status
En la rama main
Todos los conflictos resueltos pero sigues fusionando.
(usa "git commit" para concluir la fusión)
Cambios a ser confirmados:
modificados: documento.txt
- Que significa que hay cambios a ser confirmados. Automáticamente, Git, ha añadido los cambios hechos en el stage o área de preparacion para podamos crear un commit y terminar de resolver el conflicto.
- Una vez hecho el
git commithemos terminado de resolver los conflictos.
Comando de git que no tienes que olvidar
La clave de todo es usar el comando git status para ver en todo momento cómo está la situacion en el repositorio.