Resolución de conflictos de combinación

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2019

Visual Studio 2019 | Visual Studio 2022

Al realizar una fusión mediante combinación o fusionar mediante cambio de base, le indica a Git que integre los cambios realizados en una rama con los cambios realizados en otra. A menudo, Git completa automáticamente una fusión mediante combinación o una fusión mediante cambio de base sin ayuda. Sin embargo, si Git detecta que un cambio realizado en una rama entra en conflicto con un cambio realizado en otra, le pide que resuelva el conflicto. Un conflicto de combinación puede producirse cuando las ramas combinadas editan la misma línea de archivo de forma diferente, o cuando una rama modifica un archivo y otra rama lo elimina. El proceso para resolver conflictos de combinación se aplica tanto a la fusión mediante combinación como a la fusión mediante cambio de base de Git.

Puede resolver conflictos de combinación en Visual Studio o mediante la línea de comandos y cualquier editor de texto.

Para obtener información general sobre el flujo de trabajo de Git, vea Tutorial de Git de Azure Repos.

En este artículo se proporcionan procedimientos para las tareas siguientes:

  • Descripción de los conflictos de combinación
  • Resolución de conflictos de combinación

Descripción de los conflictos de combinación

La fusión mediante combinación o la fusión mediante cambio de base de Git integra confirmaciones de una rama de origen en la rama local actual (rama de destino). La fusión mediante combinación de Git realiza una combinación de avance rápido o sin avance rápido. La combinación sin avance rápido también se conoce como combinación triple o verdadera. La fusión mediante cambio de base de Git es otro tipo de combinación. Estos tipos de combinación se muestran en el diagrama siguiente.

Diagrama que muestra el estado anterior y posterior a las confirmaciones al usar la fusión mediante combinación o la fusión mediante cambio de base de Git.

En el caso de la fusión mediante combinación de Git, si existe el extremo de la rama de destino dentro de la rama de origen, el tipo de combinación predeterminado será una combinación de avance rápido. De lo contrario, el tipo de combinación predeterminado será una combinación sin avance rápido.

Una combinación de avance rápido nunca puede tener un conflicto de combinación porque Git no aplicará una combinación de avance rápido si el extremo de la rama de destino ha divergido de la rama de origen. De forma predeterminada, Git usa una combinación de avance rápido siempre que sea posible. Por ejemplo, Git aplicará una combinación de avance rápido en una rama local que usted solo actualice mediante la incorporación de cambios de su rama homóloga remota.

Una combinación sin avance rápido genera una nueva rama de destino "confirmación de combinación" que integra los cambios de la rama de origen con los cambios de la rama de destino. Los cambios aplicables son los realizados después de la última confirmación común a ambas ramas. En el diagrama anterior, la confirmación C es la última confirmación común en ambas ramas. Si algún cambio de la rama de origen entra en conflicto con cualquier cambio de la rama de destino, Git le pedirá que resuelva el conflicto de combinación. La confirmación de combinación (L) contiene los cambios integrados de la rama de origen y de la rama de destino. Los extremos de la rama de origen y destino (K y E) son los elementos primarios de la confirmación de combinación. En el historial de confirmaciones de la rama, una confirmación de combinación es un marcador útil para una operación de combinación y muestra claramente qué ramas se combinaron.

La fusión mediante cambio de base de Git vuelve a secuenciar el historial de confirmaciones de la rama de destino para que contenga todas las confirmaciones de la rama de origen, seguidas de todas las confirmaciones de la rama de destino desde la última confirmación en común. En el diagrama anterior, la confirmación C es la última confirmación común en ambas ramas. Otra manera de interpretarlo es que una fusión mediante cambio de base reproduce los cambios en la rama de destino sobre el historial de la rama de origen. Si algún cambio de la rama de origen entra en conflicto con cualquier cambio de la rama de destino, Git le pedirá que resuelva el conflicto de combinación. Al igual que con la combinación de avance rápido, una fusión mediante cambio de base no crea una confirmación de combinación. En particular, una fusión mediante cambio de base cambia la secuencia de confirmaciones de la rama de destino existente, que no es el caso de las otras estrategias de combinación. En el diagrama anterior, la confirmación K' contiene los mismos cambios que K, pero tiene un nuevo identificador de confirmación porque se vincula a la confirmación E en lugar de C.

La fusión mediante combinación y la fusión mediante cambio de base de Git solo modifican la rama de destino, la rama de origen permanece sin cambios. Cuando encuentre uno o varios conflictos de combinación, debe resolverlos para completar la fusión mediante combinación o la fusión mediante cambio de base. O bien, puede cancelar la operación de fusión mediante combinación o de fusión mediante cambio de base y devolver la rama de destino a su estado anterior.

Para obtener más información sobre las opciones y estrategias de combinación, consulte el manual de referencia de Git y las estrategias de combinación de Git.

Cuándo resolver conflictos de combinación

La fusión mediante combinación y la fusión mediante cambio de base de Git se usan ampliamente en el flujo de trabajo de Git. Al trabajar en una característica local o una rama de corrección de errores, es habitual:

  1. Mantener la rama local main actualizada con respecto a su homóloga remota mediante la incorporación de cambios periódica para recuperar cambios y combinar confirmaciones remotas.
  2. Integrar las actualizaciones de la rama local main en la rama de características local con una fusión mediante cambio de base o una fusión mediante combinación.
  3. Realice una copia de seguridad del trabajo en la rama de características local insertándola en la rama remota correspondiente.
  4. Al finalizar la característica, cree una solicitud de incorporación de cambios para combinar la rama de características remota en la rama main remota.

Al integrar con frecuencia los cambios remotos en el repositorio local, puede mantenerse al tanto del trabajo reciente de otros usuarios y resolver rápidamente los conflictos de combinación que surjan.

Resolución de conflictos de combinación

El proceso para resolver conflictos de combinación se aplica tanto a la fusión mediante combinación como a la fusión mediante cambio de base de Git. Aunque los pasos siguientes describen cómo resolver conflictos de combinación durante una fusión mediante combinación, puede resolver de forma similar conflictos de fusión mediante cambio de base.

Sugerencia

Si la rama de origen es una rama de seguimiento remoto, asegúrese de que la rama está actualizada mediante la ejecución de una recuperación de cambios de Git antes de una combinación. O bien, ejecute el comando de incorporación de cambios de Git, que combina una recuperación de cambios de Git con una fusión mediante combinación de Git.

Visual Studio 2022 proporciona una experiencia de control de versiones de Git mediante el menú Git, Cambios de Git y los menús contextuales del Explorador de soluciones. En Visual Studio 2019, versión 16.8, también se ofrece la interfaz de usuario de Git Team Explorer. Parar obtener más información, vea la pestaña Visual Studio 2019: Team Explorer.

  1. En el panel Ramas de la ventana Repositorio de Git, restaure la rama de destino. A continuación, haga clic con el botón derecho en la rama de origen y elija Combinar <rama de origen> en la <rama de destino>.

    Captura de pantalla de la opción Combinar en el menú contextual de la rama en la ventana Repositorio de Git de Visual Studio.

  2. Visual Studio le notificará si Git detuvo la combinación debido a conflictos. En ese caso, puede resolver los conflictos o cancelar la combinación y volver al estado anterior a la combinación. La sección Cambios sin combinar de la ventana Cambios de Git muestra los archivos con conflictos de combinación. Para un archivo con conflictos de combinación en su contenido, haga doble clic en el archivo para abrirlo en el editor de combinación.

    Captura de pantalla de los archivos con conflictos de combinación en la ventana Cambios de Git de Visual Studio.

  3. En el editor de combinación, el panel Entrante muestra la versión del archivo de la rama de origen, el panel Actual muestra la versión del archivo de la rama de destino y el panel Resultado muestra el archivo de combinación resultante. Para aplicar cambios específicos de origen o rama de destino, active la casilla situada junto a las líneas con conflictos que quiere conservar. También puede editar directamente el archivo de combinación en el panel Resultado. Elija Aceptar combinación después de resolver todos los conflictos de combinación en el archivo actual. Repita este paso para cada archivo con conflictos de contenido.

    Captura de pantalla del editor de combinación en Visual Studio.

  4. Para un archivo que se editó en una rama y se eliminó en la otra, haga clic con el botón derecho en el archivo y seleccione la acción de rama que quiera realizar.

    Captura de pantalla del menú contextual de un archivo con conflictos en la ventana Cambios de Git de Visual Studio.

  5. En la ventana Cambios de Git, escriba un mensaje de confirmación y elija Confirmar elementos almacenados provisionalmente para completar la combinación, después de resolver todos los conflictos de combinación de todos los archivos.

    Captura de pantalla del mensaje de confirmación y el botón Confirmar elementos almacenados provisionalmente en la ventana Cambios de Git de Visual Studio.

Pasos siguientes