Resolver conflictos de fusión en Git

Azhar Bashir Khan 6 febrero 2022
Resolver conflictos de fusión en Git

En este tutorial, demostraremos cómo resolver los conflictos que surgen al fusionar dos ramas en Git.

Normalmente, diferentes miembros del equipo suelen trabajar en los mismos archivos en un entorno de equipo colaborativo. Por ejemplo, un miembro del equipo que trabaja en el desarrollo de alguna característica puede editar el archivo README para proporcionar información sobre la característica desarrollada.

Otro miembro del equipo que trabaja en la corrección de errores puede agregar información sobre los errores corregidos en el mismo archivo README. Es posible que estén trabajando en diferentes ramas y confirmando sus cambios en sus respectivas ramas.

De vez en cuando, es necesario fusionar diferentes ramas para proporcionar una construcción cohesiva. Por tanto, esta operación provocará un conflicto de fusión cuando los mismos archivos se actualicen en distintas ramas.

Luego, es necesario resolver los conflictos y fusionar los cambios. Ahora ilustraremos esto con un ejemplo.

Resolver los conflictos que surgen tras la fusión de dos ramas con git mergetool

Antes de resolver los conflictos de fusión, deberíamos configurar la herramienta de diferencias utilizada por Git de la siguiente manera.

$ git config merge.tool meld
$ git config merge.conflictstyle diff3
$ git config mergetool.prompt false

Los comandos anteriores establecen meld como la herramienta de diferenciación predeterminada. Además, hemos configurado el conflictstyle en diff3 (es decir); esto configura la herramienta de diferencias para mostrar el ancestro común para ambos archivos (rama actual uno y el de la rama para fusionar).

Para ver las diferentes herramientas de diferencias admitidas, ejecute el siguiente comando.

$ git mergetool --tool-help

Ahora, comenzamos con el ejemplo para demostrar cómo resolver conflictos. Digamos que tenemos dos ramas como sigue.

$ git branch
* main
  feature1

La primera rama es la rama main y la segunda es una rama de desarrollo de características llamada feature1.

Tenemos un archivo README.md con el siguiente contenido en la rama main.

$ cat README.md
# Upwork
Upwork projects

Como se muestra arriba, actualmente estamos en la rama main. Luego, cambiamos a la rama feature1.

$ git checkout feature1
Switched to branch 'feature1'

$ git branch
  main
* feature1

Actualizamos README.md e imprimimos su contenido de la siguiente manera.

$ cat README.md
This is conflicting branch line.

Ahora, fusionaremos la rama main con la rama feature1 para obtener los últimos cambios en esa rama.

Mientras se fusiona, Git muestra los conflictos de fusión de la siguiente manera.

$ git merge main
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

Podemos obtener más información sobre el conflicto de la siguiente manera.

$ git status
On branch feature1
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

	both added:      README.md

no changes added to commit (use "git add" and/or "git commit -a")

Ahora imprimiremos el contenido del archivo README.md, que tiene el conflicto.

$ cat README.md 
<<<<<<< HEAD
This is conflicting branch line.

||||||| merged common ancestors
=======
# Upwork
Upwork projects
>>>>>>> main

El archivo muestra varios símbolos ahora.

Y los símbolos <<<<<<< seguidos de HEAD son un alias de la rama actual. Esto indica el comienzo de las ediciones dentro de esta sección.

Los símbolos ======= muestran el final de las revisiones dentro de la rama actual y el comienzo de las ediciones dentro de una nueva.

Los símbolos >>>>>>> seguidos del nombre de la rama remota a saber. main, muestra dónde ocurrió el intento de fusión.

Ahora, usaremos mergetool para resolver los conflictos.

$ git mergetool
Merging:
README.md

Normal merge conflict for 'README.md':
  {local}: created file
  {remote}: created file

Esto lanzará meld (ya que lo hemos configurado como la herramienta de diferencias predeterminada). Por favor, vea la imagen a continuación.

git-mergetool-meld1

El panel izquierdo muestra las ediciones al archivo README.md realizadas en la rama local. El panel central contiene el resultado de los cambios realizados para resolver el conflicto. El panel derecho muestra las ediciones realizadas en la visualización de rama remota. main (es decir) la rama que queremos fusionar.

Podemos optar por mantener los cambios locales y remotos o cualquiera de ellos. Elegiremos mantener los cambios de la rama remota de la siguiente manera.

git-mergetool-meld2

Luego guardaremos y saldremos de la herramienta meld.

Imprimiremos el archivo README.md y veremos la actualización.

$ cat README.md
# Upwork
Upwork projects

Ahora confirmaremos los cambios en Git.

$ git commit -m "merged from main"
[feature1 3c39d7b] merged from main

Ahora ejecutaremos el comando git diff para comprobar si hay conflictos entre las ramas feature1 y main.

$ git diff feature1 main

Comprobaremos el estado de la rama feature1.

$ git status
On branch feature1

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	README.md.orig

Muestra un archivo, README.md.orig, que fue creado por la mergetool durante la fusión.

Ejecute el siguiente comando para eliminarlo:

$ git clean -f

Por lo tanto, hemos resuelto con éxito los conflictos al fusionar dos ramas utilizando la mergetool de Git.

Artículo relacionado - Git Merge