Introducción a la resolución de conflictos de fusión en GIT

Gestionar las contribuciones para resolver conflictos entre múltiples desarrolladores distribuidos es uno de los principales trabajos de los sistemas de control de versiones. Para resolver conflictos de fusión, primero debemos entender qué es exactamente. Surge durante la fusión de diferentes versiones del mismo código y es administrado por el sistema de control de versiones, principalmente cuando un desarrollador elimina un archivo mientras otro desarrollador aún lo modificaba, o cuando varias personas intentan cambiar la misma línea en un archivo. En este artículo, conoceremos más sobre los conflictos de fusión de Git, sus causas y cómo se puede resolver.

¿Qué es el conflicto de fusión en GIT?

Git ha hecho que la fusión sea muy fácil, ya que integra automáticamente nuevos cambios utilizando el comando git merge. Pero en caso de conflictos, solo el desarrollador que se está fusionando es consciente del conflicto, mientras que los demás no lo son. Entonces, lo que hace Git es que detiene el proceso de fusión y marca el archivo como conflictivo. El desarrollador luego encuentra y resuelve el conflicto. Los conflictos durante la fusión pueden ocurrir de las formas que se describen a continuación:

  • Error al iniciar la fusión

En caso de cambios pendientes en el directorio de trabajo del proyecto actual, una fusión puede fallar, ya que los commits podrían sobrescribirlos mientras se fusionan. Pero se puede estabilizar usando varios comandos git como git checkout / stash / reset / commit.

  • Falla durante la fusión

Si hay una falla durante la fusión, indica que hay un conflicto entre la rama que se está fusionando y la rama actual. Aunque Git intenta fusionar los archivos sin conflictos, pero si no puede hacerlo, dejará que usted lo resuelva manualmente.

¿Cómo crear un conflicto de fusión de archivos?

Tomemos un ejemplo para mostrar / resolver conflictos de fusión en GIT usando la interfaz de línea de comandos Git.

$ mkdir git-merge-test
$ cd git-merge-test
$ git init
$ echo "Mess with this content" > new_merged.txt
$ git add new_merged.txt
$ git commit -am"Committed the earlier content"
(master (root-commit) d58f73b) Committed the earlier content
1 file changed, 1 insertion(+)
create mode 200548 new_merged.txt

Veamos línea por línea lo que sucede en el fragmento de comandos anterior.

  • git-merge-test crea un nuevo directorio e inicializa un nuevo repositorio de Git.
  • A continuación, cree un archivo de texto llamado new_merged.txt con algo escrito en él.
  • Agregue el texto recién hecho al repositorio y luego confírmelo.

Ahora tenemos un nuevo repositorio con una rama maestra y un archivo new_merged.txt con algo de contenido. Luego, creamos otra rama que entrará en conflicto con la fusión.

$ git checkout -b newbranch
$ echo "New content" > new_merged.txt
$ git commit -am"Same named file is edited to cause a conflict"
(newbranch 6282319) Same named file is edited to cause a conflict
1 file changed, 1 insertion(+), 1 deletion(-)

Para desglosarlo, las líneas anteriores:

  • crea y comprueba un newbranch llamado newbranch.
  • sobrescribe el contenido del archivo new_merged.txt.
  • y finalmente confirma el contenido recién creado.

Con el newbranch llamado una rama, se crea una confirmación que sobrescribe el contenido en new_merged.txt

$ git checkout master
Switched to branch 'master'
$ echo "Append" >> new_merged.txt
$ git commit -am"Content appended new_merged.txt"
(master 24fbe3c) Content appended new_merged.txt
1 file changed, 1 insertion(+)

La secuencia de comandos anterior no solo desprotege la rama maestra, agrega contenido a new_merged.txt sino que también lo confirma al final. Ahora nuestro ejemplo tiene 2 nuevos commits. Uno está en la rama maestra y hay uno más en la rama nueva. ¡Ahora fusiona el newbranch para ver qué sucede!

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

Git nos muestra que el conflicto ha aparecido.

Resolver conflictos de fusión en GIT

Editar el archivo en conflicto es una de las formas de eliminar un conflicto de fusión. Simplemente abra el archivo en conflicto en el editor y elimine los divisores de conflictos uno por uno. Una vez editado, puede usar git add para agregar el contenido modificado. Se puede crear una nueva confirmación ejecutando:

git commit -m "merged and resolved the conflict in "

Git asegura la resolución del conflicto y, por lo tanto, crea una nueva fusión comprometida para finalizarlo. Algunos de los comandos de Git que ayudan a resolver conflictos de fusión son:

git log --merge

La combinación –abort pasada con el comando git log produce una lista de confirmaciones en conflicto entre las ramas fusionadas.

git status

Ayuda a identificar archivos en conflicto.

git diff

Ayuda a encontrar diferencias entre los estados de un repositorio o un archivo. Se utiliza para predecir y prevenir conflictos de fusión. Algunas herramientas como las que se proporcionan a continuación se utilizan al iniciar un error de fusión.

git reset --mixed

Se utiliza para deshacer los cambios realizados en el directorio actual.

git checkout

Se utiliza para deshacer los cambios en los archivos, o más frecuentemente para cambiar ramas. Algunas herramientas como las que se proporcionan a continuación se utilizan cuando surgen conflictos durante una fusión.

git reset

Se utiliza para restablecer archivos en conflicto durante un conflicto de fusión.

git merge --abort

Pasar el argumento –abort con git merge le permite a uno salir del proceso de fusión y devolver la rama a su estado original.

Ventajas de resolver conflictos de fusión de Git

  • Se utiliza para crear, modificar, eliminar ramas, archivos o repositorios sin conflictos.
  • Se puede usar para fusionar diferentes versiones del código.
  • También ayuda a realizar cambios y retirar sucursales remotas, al tiempo que evita conflictos.
  • Ayuda a administrar y manejar los lanzamientos sin conflictos.
  • Mantiene el repositorio y el proceso limpio y legible.

Conclusión

Git tiene muchos usos y es ampliamente utilizado por desarrolladores, gerentes de producto y científicos de datos. Los comandos de Git son muy efectivos y pueden ser muy útiles. Un conflicto en git surge cuando dos ramas diferentes intentan editar la misma línea en un archivo, o un archivo se elimina en una rama particular pero se edita en otra. Git maneja la mayoría de las fusiones con éxito con sus características de fusión, pero también se puede resolver manualmente utilizando herramientas como el estado de git, el restablecimiento de git, el pago de git y el registro de Git.

Artículos recomendados

Esta es una guía para resolver conflictos de fusión en GIT. Aquí discutimos cómo resolver eficientemente los conflictos de fusión de Git con varios comandos junto con sus ventajas. También puede consultar nuestros otros artículos sugeridos para obtener más información:

  1. Git Alternativas con Ventajas
  2. Introducción a las herramientas de Git
  3. GitHub vs SVN - Principales diferencias
  4. Las 11 preguntas principales de la entrevista GIT
  5. Git Push
  6. Versiones de Tableau
  7. Guía completa de comando remoto Git
  8. Tres etapas del ciclo de vida de Git con el flujo de trabajo

Categoría: