GNU/Linux >> Tutoriales Linux >  >> Ubuntu

Cómo resolver conflictos de fusión en Git

Introducción

git merge El comando ayuda a un colaborador a agregar a un proyecto desde una rama. El concepto es una de las ideas centrales de la programación colaborativa, lo que permite que varias personas trabajen en su parte del código sin ningún conflicto.

Cuando varios colaboradores trabajan en la misma parte de un código o trabajan con numerosas ramas, es probable que ocurran conflictos de fusión. El objetivo principal de git merge es para resolver o avisar sobre estos conflictos automáticamente.

Esta guía explica qué es un conflicto de combinación y ofrece soluciones para cuando no se resuelven automáticamente. El artículo también proporciona consejos útiles para evitar conflictos de combinación de Git.

Requisitos previos

  • Git instalado y configurado (en Windows, Mac y Ubuntu).
  • Un conflicto de git merge entre una rama local y una remota.
  • Acceso a una terminal o línea de comandos
  • Editor de Vim para el tutorial (para instalar Vim, siga una de nuestras guías:Cómo instalar Vim 8.2 en Ubuntu 18.04 o Cómo instalar Vim 8.2 en CentOS 7)

¿Qué es un conflicto de fusión de Git?

Cuando se trabaja con sistemas de control de versiones como Git, la mayoría de los conflictos de combinación se resuelven automáticamente. Sin embargo, hay situaciones en las que git merge no puede resolver un problema.

Algunos ejemplos de conflictos de combinación incluyen:

  • Cambiar las mismas líneas de código en un archivo.
  • Eliminación de archivos mientras se realizan cambios en otro lugar.

Dado que el problema ocurre localmente y el resto de los miembros del proyecto desconocen el problema, resolver el conflicto es de alta prioridad y requiere una solución inmediata.

Tipos de conflictos de fusión de Git

Los tipos generales de conflictos de combinación dependen de cuándo aparece el problema. Los conflictos ocurren ya sea:

  • Antes de la fusión , lo que indica que hay cambios locales que no están actualizados. El mensaje de error de conflicto aparece antes de que comience la combinación para evitar problemas.
  • Durante la fusión , lo que indica un problema de sobrescritura. Aparece el mensaje de error y detiene el proceso de combinación para evitar sobrescribir los cambios.

Cómo resolver conflictos de fusión en Git

Hay tres maneras para resolver un conflicto de fusión en Git:

1. Aceptar la versión local . Para aceptar todos los cambios en un archivo desde la versión local, ejecute:

git checkout --ours <file name>

Alternativamente, para aceptar la versión local para todos archivos en conflicto, use:

git merge --strategy-option ours

2. Aceptar la versión remota . Para actualizar los cambios en un archivo desde la rama remota, ejecute:

git checkout --theirs <file name>

Aceptar la versión remota para todos archivos en conflicto con:

git merge --strategy-option theirs

3. Revise los cambios individualmente . La opción final es revisar cada cambio por separado. Esta opción también es el mejor camino a seguir, especialmente cuando se trabaja con varios archivos y personas. Para hacer este trabajo más manejable, use herramientas especiales para ayudar a revisar conflictos individuales.

En última instancia, la elección de qué partes del código permanecen y cuáles no depende de la decisión del desarrollador para el proyecto actual.

Obtención de un conflicto de fusión en Git

El conflicto de fusión en Git ocurre cuando el comando git merge arroja un error.

El mensaje de error imprime la información sobre dónde está presente el conflicto. Verifique el archivo del mensaje de error y mire los contenidos donde ocurrió el conflicto de fusión:

Git agrega automáticamente tres indicadores junto con las líneas de código en conflicto:

  • <<<<<<< (siete caracteres "menor que") seguidos de HEAD , que es un alias para la rama actual. Los símbolos indican el comienzo de las ediciones dentro de esta sección.
  • ======= (siete caracteres de "signo igual"), que muestran el final de las revisiones dentro de la rama actual y el comienzo de las ediciones dentro de una nueva.
  • >>>>>>> (siete caracteres "mayor que") seguidos de la rama donde ocurrió el intento de fusión. Los símbolos agregados indican el final de las ediciones dentro de la rama en conflicto.

La sintaxis agregada ayuda a buscar en el código para encontrar la ubicación del conflicto de fusión. Sin embargo, un enfoque mucho más sencillo es utilizar una herramienta de diferenciación/fusión para descubrir los problemas y realizar un seguimiento de los cambios.

Configuración de una herramienta de comparación predeterminada en Git

Para configurar la herramienta de comparación predeterminada para git mergetool :

1. Ejecute la siguiente línea en su terminal:

git mergetool --tool-help

La salida imprime todas las herramientas de diferenciación admitidas para su configuración actual:

Hay diferentes herramientas disponibles según el editor elegido. Por ejemplo:

  • Emacs herramientas diff:Ediff o emerge
  • Vim herramientas de diferencias:vimdiff, vimdiff2 o vimdiff3

Los pasos posteriores muestran un ejemplo de cómo configurar el vimdiff herramienta para Vim.

2. Cambia la git config para establecer la herramienta de combinación predeterminada:

git config merge.tool <tool name>

Por ejemplo, si usa Vim, ejecute:

git config merge.tool vimdiff

3. Configure la herramienta diff para mostrar el ancestro común para ambos archivos, que es la versión antes de cualquier edición:

git config merge.conflictstyle diff3

4. Establezca la opción para no preguntar antes de ejecutar:

git config mergetool.prompt false

La configuración de la herramienta diff para Git está completa.

Uso de Mergetool para ver las diferencias

Para utilizar la mergetool y vea las diferencias, ejecute:

git mergetool

La salida muestra una ventana con cuatro vistas:

1. LOCALES representa la versión del archivo de la rama actual.

2. BASE es cómo se veía el archivo antes de cualquier cambio.

3. REMOTO muestra cómo se ve el archivo en la rama remota donde está la información conflictiva.

4. COMBINADO tiene el archivo de combinación final. Este resultado representa lo que se guarda en el repositorio.

Los principales comandos de navegación entre estas ventanas son:

  • CTRL+WW para moverse entre las ventanas.
  • CTLR+WJ para saltar a la vista de ventana COMBINADA.
  • CTRL+WX para cambiar los lugares de las ventanas.

Para la navegación avanzada, la información está disponible con el comando :help window-moving .

Actualización y resolución de un conflicto de combinación

Actualice el archivo MERGED para resolver un conflicto. Algunos atajos para actualizar la versión COMBINADA incluyen:

  • :diferencias LOCALES actualiza el a la versión LOCAL.
  • :diferencia BASE actualizaciones a la versión BASE.
  • :diffg REMOTO actualizaciones a la versión REMOTA.

Una vez que la información esté actualizada, guarde y salga con :wqa .

Confirmar y Limpiar

El paso final es confirmar y limpiar los archivos adicionales. Confirme la versión actualizada ejecutando:

git commit -m "<your message>"

La herramienta diff crea archivos adicionales en el proyecto para comparar versiones. Limpiarlos con:

git clean -f

Consejos sobre cómo evitar conflictos de fusión

Los conflictos de combinación solo ocurren cuando la computadora no puede resolver el problema automáticamente.

Estos son algunos consejos sobre cómo evitar conflictos de fusión:

  • Utilice un archivo nuevo en lugar de uno existente siempre que sea posible.
  • Evite agregar cambios al final del archivo.
  • Impulsa y extrae cambios con la mayor frecuencia posible.
  • No embellezca el código ni organice las importaciones por su cuenta.
  • Evite la mentalidad de programador solitario teniendo en cuenta a las otras personas que están trabajando en el mismo código.

Ubuntu
  1. Cómo actualizar Git

  2. ¿Cómo funciona Git?

  3. Cómo crear una nueva rama en Git

  4. Cómo instalar Git en Ubuntu 18.04 / 20.04

  5. Cómo instalar Git en CentOS 8

Cómo instalar Git en Ubuntu 15.04

Cómo instalar Git en Ubuntu 16.04

Cómo instalar Git en Ubuntu 18.04 LTS

Cómo instalar Git en Ubuntu 19.10

Cómo instalar Git en Linux Mint 19

Cómo instalar Gitea en Ubuntu 22.04