¿Qué son los conflictos de combinación?

Completado

Aquí se explica la manera en que la resolución de conflictos de combinación ayuda a los desarrolladores a producir el mejor resultado posible a partir de dos orígenes superpuestos.

El flujo de GitHub

Además de ser una plataforma de desarrollo de software colaborativo, GitHub ofrece también un flujo de trabajo especificado y diseñado para optimizar el uso de sus diversas características. Aunque en esta unidad nos centraremos específicamente en los conflictos de combinación, se recomienda revisar primero Conocimiento del flujo de GitHub.

Combinación de ramas

Considere un escenario en el que un desarrollador crea una rama denominada feature-branch basada en main y crea dos confirmaciones. Mientras lleva a cabo este trabajo, otra persona combina una solicitud de incorporación de cambios no relacionada en main. ¿Qué ocurre cuando el desarrollador intenta combinar feature-branch de nuevo en main?

La respuesta es: depende.

Aunque feature-branch se creó a partir de main, no se basaba en la propia rama. En su lugar, se basaba en la confirmación HEAD de main en ese momento. Se desconocen todas las confirmaciones que se han aplicado a main desde entonces. Las confirmaciones de las que actualmente se realiza un seguimiento no se incorporan necesariamente al estado actual de la rama sin sobrescribir los cambios recientes.

Si finalmente las confirmaciones de feature-branch no se superponen con confirmaciones paralelas realizadas en main desde que se creó la rama, no habrá ningún problema. Se pueden agregar nuevos archivos y eliminar los archivos que no se han tocado. Además, las líneas de código que se cambiaron en main se pueden cambiar en feature-branch, siempre y cuando el trabajo paralelo no las haya modificado desde que se creó feature-branch.

Solicitud de incorporación de cambios sin conflictos de combinación.

Pero ¿qué ocurre si ambos conjuntos de confirmaciones incluyen cambios en las mismas líneas de código? Este intento de combinación produciría un error debido a un conflicto de combinación.

Conflicto de combinación.

¿Qué son los conflictos de combinación?

Los conflictos de combinación se producen cuando un desarrollador intenta combinar cambios que podrían sobrescribir accidentalmente cambios paralelos. No importa cómo se combinasen esos otros cambios en la rama base. Git no sobrescribe automáticamente un conjunto de cambios en favor de otro. En cambio, se lo indica a la persona que intenta realizar la combinación para que pueda solucionarlo en la rama de comparación antes de intentar llevar a cabo la combinación de nuevo.

Solicitud de incorporación de cambios con conflictos de combinación.

Resolución de conflictos de combinación

Para ayudarle a resolver los conflictos de combinación, GitHub genera un archivo híbrido temporal que incluye las diferencias de cada rama. Según la convención establecida, el texto de la rama de comparación se muestra sobre la rama base, separado por una línea de signos igual (=======).

Resolución de un conflicto de combinación.

Puede usar esta vista para editar directamente el archivo si los cambios son menores. Si decide conservarlo, el resultado final se confirma en la rama de comparación. Si la combinación es más complicada, tal vez prefiera trabajar en ella con otras herramientas de desarrollo. En cualquier caso, no olvide quitar del código todos los marcadores de rama antes de confirmar. Si se olvida de quitar dichos marcadores al confirmar la resolución de conflictos, permanecerán en el archivo y no se comentarán.

Nota:

En esta unidad se aborda la resolución de conflictos de combinación en el contexto de un explorador. También hay muchas plataformas de desarrollo, como Visual Studio, que ofrecen experiencias integradas de resolución de conflictos de combinación.

Cuando se hayan resuelto todos los conflictos de combinación en la rama, puede volver a intentar la combinación.

Cómo evitar los conflictos de combinación

Algunos conflictos de combinación son inevitables. Cualquier combinación podría producir conflictos de combinación para otras solicitudes de incorporación de cambios que esperan ser aprobadas. Aun así, una manera eficaz de reducir la complejidad de los conflictos de combinación consiste en incorporar los cambios en la rama a menudo.

Incorporación de cambios temprana y frecuente

El comando git pull incorpora cualquier confirmación de la rama base que todavía no se haya aplicado a la rama actual. Es conceptualmente similar al comando Get Latest que usan muchos sistemas de control de versiones para que se pueda actualizar el código local a la versión más reciente. Al incorporar actualizaciones a la rama, se están combinando todos los cambios que se han producido desde que se creó la rama (o desde que se produjo la última incorporación).

La incorporación de actualizaciones a la rama puede generar conflictos de combinación, pero esto no es grave. Se producirían igualmente más adelante, pero, si tienen lugar antes, suelen ser más fáciles de resolver.

Además de mitigar el impacto de los conflictos de combinación, la incorporación de actualizaciones también permite integrar los cambios confirmados en la rama mientras trabaja. De esta manera, se pueden solucionar los posibles problemas anteriores. Por ejemplo, puede haber cambios de definición de clase en otros archivos que hagan que el código no se compile. Este cambio no provocaría un conflicto de combinación al realizar la combinación más adelante, pero interrumpiría la compilación si no lo probara primero. Se recomienda incorporar las actualizaciones a menudo para mantener la rama lo más cerca posible de su base.

Reorganización del historial con la fusión mediante cambio de base de Git

El comando git rebase (o git pull --rebase) vuelve a escribir el historial de la rama para usar como base la confirmación HEAD actual de la rama base. En otras palabras, la rama se actualiza para que se comporte como si solo se hubiera bifurcado a partir del estado actual de la rama base. Esta fusión mediante cambio de base significa que todos los cambios se comparan con el estado más reciente de la rama base, y no con la confirmación original a partir de la que se realizó la bifurcación originalmente. Esto puede hacer que sea más fácil realizar un seguimiento del historial después de la combinación final, ya que las confirmaciones seguirán las confirmaciones paralelas anteriores de manera lineal. Es recomendable fusionar la rama mediante cambio de base inmediatamente antes de realizar una combinación ascendente.

Obtenga más información sobre la fusión mediante cambio de base de Git y la resolución de conflictos de combinación después de una fusión mediante cambio de base de Git.