Chuck's Academy

Git Branching y Merging

Estrategias de Fusión: Fast-Forward vs. Recursive

Estrategias de Fusión en Git: Fast-Forward vs. Recursive

Cuando hablamos de fusionar ramas en Git, hay diferentes estrategias que Git puede utilizar para combinar los cambios. Las dos estrategias más comunes son Fast-Forward y Recursive. Entender cuál usar y cuándo puede ayudarte a mantener un historial de proyectos limpio y comprensible.

Fast-Forward Merge

La fusión Fast-Forward ocurre cuando la rama de destino no ha avanzado desde el punto de divergencia con la rama de origen. En otras palabras, no hay commits adicionales en la rama de destino desde que se creó o actualizó la rama de origen.

Características:

  • No crea un commit de fusión.
  • Simplemente mueve el puntero de la rama de destino hacia adelante.

Ventajas:

  • Historial lineal y limpio.
  • Más fácil de seguir y entender.

Ejemplo de Fast-Forward Merge:

bash

Si main no ha cambiado desde que se creó feature-xyz, Git moverá el puntero de main hacia adelante, integrando todos los commits de feature-xyz en main.

Hacer un Merge Fast-Forward

Para forzar una fusión Fast-Forward cuando sea posible:

bash

Si un Fast-Forward no es posible, Git abortará la fusión.

Recursive Merge

La fusión Recursive se utiliza cuando las ramas han evolucionado de manera independiente, y tanto la rama de origen como la de destino tienen commits adicionales desde su punto de divergencia común.

Características:

  • Crea un commit de fusión.
  • Combina los cambios de ambas ramas utilizando una estrategia de "tres vías".

Ventajas:

  • Mantiene un historial detallado de cuándo y cómo se fusionaron las ramas.
  • Útil para integrar ramas con desarrollos complejos de manera clara.

Ejemplo de Recursive Merge:

bash

Si main ha cambiado desde que se creó feature-xyz, Git hará una fusión de tres vías y creará un commit de fusión.

Manejo de Fusiones Recursive

Por defecto, Git utiliza la estrategia Recursive para hacer merges cuando no es posible un Fast-Forward:

bash

Forzar un Commit de Fusión (No Fast-Forward)

Si deseas crear un commit de fusión incluso cuando un Fast-Forward es posible, puedes usar:

bash

Esto crea un commit de fusión, lo cual es útil para mantener un registro explícito de la fusión.

Ejemplo:

bash

Este comando fusionará feature-xyz en main y creará un commit de fusión, incluso si un Fast-Forward es posible.

Consideraciones para Elegir una Estrategia

Usar Fast-Forward:

  • Cuando deseas mantener un historial simple y lineal.
  • Para cambios menores o rápidos donde no es necesario un commit de fusión explícito.

Usar Recursive (o --no-ff):

  • Para proyectos complejos con múltiples desarrolladores.
  • Cuando quieres mantener un registro claro y detallado de todas las fusiones.
  • Para integrar características grandes o ramas que han sufrido muchos cambios.

Resumen

  1. Fast-Forward Merge: Mueve el puntero de la rama hacia adelante, sin crear commit de fusión.
  2. Recursive Merge: Combina cambios con un commit de fusión, utilizando la estrategia de tres vías.
  3. Forzar Fast-Forward: git merge --ff-only <nombre-de-la-rama>
  4. Crear siempre commit de fusión: git merge --no-ff <nombre-de-la-rama>

Conocer cuándo y cómo utilizar cada estrategia de fusión te ayudará a mantener un historial de proyecto organizado y fácil de entender. En el siguiente capítulo, cubriremos el rebase en Git, otro método para integrar cambios.


Pregúntame lo que sea