Aplicación de cambios con fusión mediante cambio de base

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

Visual Studio 2019 | Visual Studio 2022

Git mantiene automáticamente un historial de desarrollo en una rama vinculando cada nueva confirmación a la anterior. Al fusionar mediante combinación una rama en otra, el historial puede resultar menos sencillo. Por ejemplo, una fusión mediante combinación sin avance rápido combina líneas de desarrollo divergentes creando una confirmación de fusión mediante combinación con varias anteriores. Por el contrario, una fusión mediante cambio de base de Git combina líneas de desarrollo divergentes sin crear una confirmación de fusión mediante combinación, lo que da como resultado un historial de confirmaciones más sencillo, pero que pierde información sobre la fusión mediante combinación. La elección del tipo de fusión mediante combinación probablemente se ve afectada por el hecho de si quiere conservar un registro de la fusión mediante combinación o simplificar el historial de confirmaciones.

En este artículo se describe cuándo usar una fusión mediante cambio de base en lugar de una fusión mediante combinación sin avance rápido y se proporcionan procedimientos para las siguientes tareas:

  • Fusionar mediante cambio de base la rama local
  • Forzar el envío de cambios de la rama local después de una fusión mediante cambio de base
  • Fusionar mediante cambio de base de forma interactiva para fusionar mediante combinación con "squash" confirmaciones locales

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

Fusionar mediante cambio de base la rama local

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 rama de origen permanece sin cambios. Para obtener una comparación, la fusión mediante cambio de base de Git y otros tipos de fusión mediante combinación se muestran en el diagrama siguiente.

Diagrama que muestra las confirmaciones antes y después al usar la fusión mediante cambio de base de Git.

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. 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. En particular, una fusión mediante cambio de base de Git cambia la secuencia de confirmaciones de la rama de destino existente, que no es el caso de las otras estrategias de fusión mediante combinación. En el diagrama anterior, la confirmación K' contiene los mismos cambios que la K, pero tiene un nuevo identificador de confirmación porque se vincula a la confirmación E en lugar de a la C.

Durante una fusión mediante cambio de base, si un cambio de rama de origen entra en conflicto con cualquier cambio de rama de destino, Git le pedirá que resuelva el conflicto de fusión mediante combinación. Puede resolver conflictos de fusión mediante combinación durante una fusión mediante cambio de base de la misma manera que se resuelven los conflictos de fusión mediante combinación durante una fusión mediante combinación.

Fusión mediante cambio de base frente a fusión mediante combinación sin avance rápido

La fusión mediante cambio de base de Git da como resultado un historial de confirmaciones más sencillo pero menos exacto que una fusión mediante combinación sin avance rápido, lo que se conoce como fusión mediante combinación triple o verdadera. Cuando quiera un registro de una fusión mediante combinación en el historial de confirmaciones, use una fusión mediante combinación sin avance rápido.

Si es la única persona que trabaja en una rama de características o de corrección de errores, considere la posibilidad de usar una fusión mediante cambio de base para integrar periódicamente el trabajo de rama main reciente en ella. Esa estrategia ayuda a asegurarse de mantenerse al tanto del trabajo reciente de otros usuarios y a resolver rápidamente los conflictos de fusión mediante combinación que surjan. Al realizar una fusión mediante cambio de base, se implementa la nueva característica sobre el trabajo de rama main más reciente, lo que ayuda a mantener un historial lineal de confirmaciones.

Para obtener más información sobre la fusión mediante cambio de base de Git y cuándo usarla, vea Fusión mediante cambio de base frente a fusión mediante combinación.

Directrices de fusión mediante cambio de base y de envío de cambios forzado

Si realiza una fusión mediante cambio de base de una rama local de la cual ha enviado cambios anteriormente y, después, vuelve a ejecutar el comando push de Git predeterminado, se producirá un error en el envío de cambios. El comando push de Git predeterminado aplica una fusión mediante combinación de avance rápido para integrar la rama local en la rama remota. Ese comando producirá un error después de una fusión mediante cambio de base porque esta opción modifica la secuencia de confirmaciones existentes en la rama de destino local, por lo que ya no coincide con el historial de su homóloga remota. En este escenario, un envío de cambios forzado se realizará correctamente, y lo hace sobrescribiendo la rama remota.

La fusión mediante cambio de base de Git y el envío de cambios forzado son herramientas eficaces, pero tenga en cuenta estas directrices al decidir usarlas:

  • No realice una fusión mediante cambio de base de una rama local de la que se hayan enviado cambios y compartido con otros usuarios, a menos que tenga seguridad de que nadie usa la rama compartida. Después de una fusión mediante cambio de base, la rama local ya no coincidirá con el historial de su homóloga remota.
  • No fuerce el envío de cambios en una rama remota que usen otros usuarios, ya que su versión local de la rama remota ya no coincidirá con el historial actualizado de la rama remota.
  • El equipo debe aceptar los escenarios de uso para la fusión mediante cambio de base y el envío de cambios forzado.

Sugerencia

Para un proceso de revisión colaborativa, use una PR a fin de fusionar mediante combinación un nuevo trabajo en la rama predeterminada de un repositorio remoto.

Cómo realizar la fusión mediante cambio de base

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. Elija Git > Administrar ramas para abrir la ventana Repositorio de Git.

    Captura de pantalla de la opción Administrar ramas en el menú Git de Visual Studio.

  2. En la ventana Repositorio de Git, haga clic con el botón secundario en la rama de destino y seleccione Desproteger.

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

  3. Haga clic con el botón secundario en la rama de origen y seleccione Rebase <target-branch> onto <source-branch> (Fusionar mediante cambio de base la <rama de origen> en la <rama de destino>).

    Captura de pantalla de la opción Fusionar mediante cambio de base en el menú contextual de la rama en la ventana Repositorio de Git de Visual Studio.

  4. Visual Studio mostrará un mensaje de confirmación después de realizar una fusión mediante cambio de base correcta.

    Captura de pantalla del mensaje de confirmación de fusión mediante cambio de base en la ventana Repositorio de Git de Visual Studio.

    Si la fusión mediante cambio de base se detiene debido a conflictos de la fusión mediante combinación, Visual Studio le avisará. Puede resolver los conflictos o cancelar la fusión mediante cambio de base y volver al estado anterior a esta fusión.

    Captura de pantalla del mensaje de conflicto de fusión mediante cambio de base en la ventana Repositorio de Git de Visual Studio.

Forzar el envío de cambios de la rama local después de una fusión mediante cambio de base

Si realiza una fusión mediante cambio de base de una rama local de la que anteriormente ha enviado cambios, un envío de cambios predeterminado de Git posterior producirá un error. En su lugar, puede forzar el envío de cambios de la rama local para sobrescribir su homóloga remota a fin de que sus historiales de confirmación coincidan.

Advertencia

No fuerce nunca el envío de cambios de una rama en la que otros usuarios estén trabajando. Para obtener más información, vea Directrices de la fusión mediante cambio de base y el envío de cambios forzado.

Para forzar el envío de cambios en Visual Studio, primero debe habilitar la opción de envío de cambios forzado:

  1. Vaya a Herramientas>Opciones>Control de código fuente>Git Global Settings (Configuración global de Git).

  2. Seleccione la opción Enable push --force-with-lease (Habilitar envío de cambios --force-with-lease).

La marca --force-with-lease de envío de cambios de Git es más segura que la marca --force porque no sobrescribirá una rama remota que tenga confirmaciones que no están integradas dentro de la rama local que va a forzar el envío de cambios.

  1. En la ventana Cambios de Git, seleccione el botón de envío de cambios para enviar cambios de la confirmación.

    Captura de pantalla del botón de envío de cambios de flecha arriba en la ventana

    También puede seleccionar Enviar cambios en el menú Git.

    Captura de pantalla de la opción Enviar cambios en el menú Git de Visual Studio.

  2. Si se produce un error en la operación de envío de cambios de Git predeterminada, Visual Studio inicia el cuadro de diálogo Git-Push failed (Error de envío de cambios de Git). Elija Forzar envío de cambios.

    Captura de pantalla del cuadro de diálogo Error en el envío de cambios de Git en Visual Studio.

  3. Visual Studio mostrará un mensaje de confirmación cuando se produzca un envío de cambios correcto.

    Captura de pantalla del mensaje de confirmación de envío de cambios en Visual Studio.

Fusionar mediante cambio de base de forma interactiva para fusionar mediante combinación con "squash" confirmaciones locales

Normalmente, a medida que trabaje en una característica nueva de la rama de características local, creará varias confirmaciones. Cuando esté a punto para publicar la característica nueva, es posible que quiera consolidar esas confirmaciones en una sola para simplificar el historial de confirmaciones. Puede usar una fusión mediante cambio de base interactiva para fusionar mediante combinación con squash varias confirmaciones en una sola confirmación.

Visual Studio 2022 no admite la fusión mediante cambio de base interactiva. Use la línea de comandos de Git en su lugar.

Nota:

Los usuarios de Azure DevOps pueden fusionar mediante combinación con "squash" para concentrar el historial de confirmaciones de una rama de tema durante una PR.

Pasos siguientes