Actualización del código con los comandos fetch, merge y pull

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

Visual Studio 2019 | Visual Studio 2022

Cuando haya varios colaboradores en un proyecto, mantenga actualizado el repositorio de Git local descargando e integrando el trabajo que otros usuarios han cargado en el repositorio remoto del proyecto. Estos comandos de Git actualizan el repositorio local:

  • El comando fetch de Git descarga las confirmaciones nuevas que otros usuarios han cargado en el repositorio remoto. Las ramas de seguimiento remoto de la caché del repositorio local se actualizan, mientras que las ramas locales permanecen sin cambios.
  • El comando merge de Git integra confirmaciones de una o varias ramas de origen en una rama de destino.
  • El comando rebase de Git integra confirmaciones de una rama de origen en una rama de destino, pero usa una estrategia diferente que en el comando merge de Git.
  • El comando pull de Git realiza una recuperación de cambios y, después, una fusión mediante combinación o una fusión mediante cambio de base para integrar confirmaciones con recuperación de cambios en la rama local actual.

Visual Studio usa un subconjunto de esos comandos de Git al sincronizar el repositorio local con un repositorio remoto.

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:

  • Descarga de cambios con la fetch
  • Actualización de ramas con merge o rebase
  • Descarga de cambios y actualización de ramas con el comando pull

Descarga de cambios con la recuperación de cambios

El comando fetch de Git descarga confirmaciones de ramas remotas y objetos de archivo a los que se hace referencia que no existen en el repositorio local, y actualiza las ramas de seguimiento remoto en la caché del repositorio local. Las ramas de seguimiento remoto son copias de ramas remotas de solo lectura almacenadas en la caché local y no son las ramas locales. El comando fetch de Git no actualiza las ramas locales. Por ejemplo, si un repositorio remoto que designa origin tiene una rama bugfix3, el comando fetch de Git actualizará la rama de seguimiento remoto denominada origin/bugfix3 y no la rama local bugfix3. Puede usar ramas de seguimiento remoto para lo siguiente:

  • Comparar una rama de seguimiento remoto con una rama local para revisar los cambios capturados.
  • Combinar una rama de seguimiento remoto en una rama local.
  • Crear una rama local a partir de una rama de seguimiento remoto.

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 la ventana Cambios de Git, elija Recuperar cambios. Después, seleccione outgoing/incoming (saliente/entrante) para abrir la ventana Repositorio de Git.

    Captura de pantalla de los botones Recuperar cambios y el vínculo Entrante en la ventana Cambios de Git de Visual Studio 2019.

    También puede elegir Recuperar cambios en el menú Git.

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

  2. En la ventana Repositorio de Git, las confirmaciones con cambios recuperados aparecen en la sección Entrante. Seleccione una confirmación con cambios recuperados para ver la lista de archivos modificados en esa confirmación. Seleccione un archivo modificado para ver una vista de diferencias del contenido cambiado.

    Captura de pantalla del menú Repositorio de Git en Visual Studio 2019.

Sugerencia

La recuperación de cambios no eliminará las ramas de seguimiento remoto en la caché del repositorio local que ya no tengan un homólogo remoto. Para configurar Visual Studio a fin de eliminar ramas obsoletas de seguimiento remoto durante una recuperación de cambios, haga lo siguiente:

  • Seleccione Herramientas>Opciones>Control de código fuente>Git Global Settings (Configuración global de Git).
  • Establezca la opción Prune remote branches during fetch (Eliminar ramas remotas durante la recuperación de cambios) en True.

Después de ejecutar el comando fetch de Git, puede comparar una rama local con su rama de seguimiento remoto correspondiente para ver lo que ha cambiado en la rama remota. Si decide actualizar la rama local actual con cambios recuperados, puede realizar merge o rebase de Git. O bien puede ejecutar el comando pull de Git, que combina un comando fetch de Git con merge o rebase. Los comandos merge y rebase de Git actualizan una rama de destino aplicando confirmaciones de una rama de origen a ella. Pero ambos comandos usan estrategias diferentes. Para obtener más información, vea Actualización de ramas con merge o rebase y Cuándo conviene utilizar rebase frente a merge.

Actualización de ramas con merge o rebase

El comando merge y rebase de Git integran confirmaciones de una rama de origen en la rama local actual (rama de destino). El comando merge 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 las confirmaciones antes y después al usar merge y rebase.

Los comandos merge y rebase 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 PR para combinar la rama de características remota en la rama main remota.

Este enfoque le ayuda a lo siguiente:

  • Mantenerse al tanto del trabajo reciente que han realizado otros usuarios y que podrían afectar al suyo.
  • Resolver rápidamente los conflictos entre su trabajo y el de otros.
  • Aplicar la característica nueva sobre el contenido del proyecto actualizado.
  • Obtener una revisión de PR del trabajo.

Combinar

En el caso del comando merge de Git, si existe la sugerencia de la rama de destino en 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 fusión mediante combinación de Git de avance rápido nunca puede tener un conflicto de fusión mediante combinación porque Git no aplicará una fusión mediante combinación de avance rápido si la sugerencia de la rama de destino se ha divergido de la rama de origen. De forma predeterminada, Git usa una fusión mediante combinación de avance rápido siempre que sea posible. Por ejemplo, Git aplicará una fusión mediante combinación de avance rápido en una rama local que solo actualice incorporando cambios de su rama equivalente remota.

Una fusión mediante combinación sin avance rápido de Git 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 que es 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 fusión mediante combinación es un marcador útil para una operación Merge y muestra claramente qué ramas se han fusionado mediante confirmación.

La fusión mediante combinación de Git solo modifica la rama de destino; la rama de origen permanece sin cambios. Cuando encuentre uno o varios conflictos de fusión mediante combinación, debe resolverlos para completar la fusión mediante combinación. También puede cancelar la operación Merge y devolver la rama de destino a su estado anterior.

Para obtener más información sobre las opciones y estrategias de fusión mediante combinación, vea el Manual de referencia de Git y las Estrategias de fusión mediante combinación de Git.

Sugerencia

Si la rama de origen es una rama de seguimiento remoto, asegúrese de que está actualizada; para ello, ejecute un comando fetch de Git antes de la fusión mediante combinación.

  1. Elija Git > Administrar ramas en la barra de menús para abrir la ventana Repositorio de Git.

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

  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 Desproteger en la ventana Repositorio de Git de Visual Studio 2019.

  3. Haga clic con el botón secundario en la rama de origen y seleccione Merge <source-branch> into <target-branch> (Combinar <rama de origen> en la <rama de destino>).

    Captura de pantalla de la opción Combinar en la ventana Repositorio de Git de Visual Studio 2019.

  4. Visual Studio mostrará un mensaje de confirmación cuando se produzca una combinación correcta.

    Captura de pantalla del mensaje de confirmación de combinación en la ventana Repositorio de Git de Visual Studio 2019.

    Si la combinación se detiene debido a conflictos en esta, Visual Studio le enviará una notificación. Puede resolver los conflictos o cancelar la fusión mediante combinación y volver al estado previo a la fusión.

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

Fusión mediante cambio de base

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 de Git reproduce los cambios en la rama de destino sobre el historial de la rama de origen. Si algún cambio de rama de origen entra en conflicto con algún cambio de rama de destino, Git le pedirá que resuelva el conflicto de fusión mediante combinación. La fusión mediante cambio de base de Git no crea una confirmación de fusión mediante combinación. 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 id. de confirmación porque se vincula a la confirmación E en lugar de a la C.

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

Si es la única persona que trabaja en la rama de características o de corrección de errores, considere la posibilidad de usar la fusión mediante cambio de base de Git para integrar nuevas confirmaciones de la rama main en ella. De lo contrario, use la fusión mediante combinación de Git. Para obtener más información sobre la fusión mediante cambio de base de Git y cuándo usarla, vea Aplicación de cambios con fusión mediante cambio de base y Fusión mediante cambio de base frente a fusión mediante combinación.

Sugerencia

Si la rama de origen es una rama de seguimiento remoto, asegúrese de que la rama está actualizada; para ello, ejecute una recuperación de cambios de Git antes de la fusión mediante cambio de base.

  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 2019.

  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 Desproteger en el menú contextual de la rama en la ventana Repositorio de Git de Visual Studio 2019.

  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 2019.

  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 2019.

    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 2019.

Descarga de cambios y actualización de ramas con incorporación de cambios

De forma predeterminada, la incorporación de cambios de Git combina una recuperación de cambios de Git y una fusión mediante combinación de Git para actualizar la rama local actual desde su homóloga remota. Opcionalmente, la incorporación de cambios de Git puede realizar una fusión mediante cambio de base de Git en lugar de una fusión mediante combinación de Git.

A diferencia de la recuperación de cambios de Git, la incorporación de cambios de Git actualizará la rama local actual inmediatamente después de descargar nuevas confirmaciones desde el repositorio remoto. Use la incorporación de cambios de Git cuando sepa que quiere actualizar la rama local actual justo después de una recuperación de cambios de Git.

Sugerencia

Para configurar Visual Studio a fin de realice una fusión mediante cambio de base en lugar de una fusión mediante combinación al incorporar cambios, realice lo siguiente:

  1. En el menú Git, vaya a Herramientas>Opciones>Control de código fuente>Git Global Settings (Configuración global de Git).
  2. Establezca la opción Rebase local branch when pulling (Fusionar mediante cambio de base la rama local al incorporar cambios) en True.
  1. En la ventana Cambios de Git, elija Incorporar cambios.

    Captura de pantalla del botón Incorporar cambios en la ventana Cambios de Git de Visual Studio 2019.

    También puede elegir Incorporar cambios en el menú Git.

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

  2. Se muestra un mensaje de confirmación cuando se completa la operación de incorporación de cambios.

    Captura de pantalla del mensaje de confirmación de incorporación de cambios en la ventana Cambios de Git en Visual Studio 2019.

    Si hay conflictos durante la parte de la fusión mediante combinación de la operación de incorporación de cambios, Visual Studio le avisará. Puede resolver los conflictos o cancelar la fusión mediante combinación y volver al estado previo a la fusión.

    Captura de pantalla del mensaje de conflicto de incorporación de cambios en la ventana Cambios de Git en Visual Studio 2019.

Nota:

En Visual Studio, la opción Sincronizar realiza una Incorporación de cambios y, después, un Envío de cambios para sincronizar una rama local y una remota. Para obtener más información sobre la opción Sincronizar, vea Uso de git fetch, pull, push and sync para el control de versiones en Visual Studio.

Pasos siguientes