fusionar-ramas-git-con-merge

Fusionando ramas en Git

  • 5 min

El comando git merge es la instrucción encargada de recombinar dos líneas de desarrollo independientes en una sola rama.

Imagina que ya has creado tu rama. Has trabajado en ella aislado del mundo y tu nueva funcionalidad está lista y probada.

Ha llegado el momento de traer esos cambios de vuelta a la rama principal. La operación encargada de unificar dos líneas de desarrollo divergentes es merge.

En esta entrada vamos a ver este comando, y que Git tiene dos formas muy diferentes de comportarse dependiendo de cómo haya evolucionado la historia: Fast-Forward y el Merge Commit.

A diferencia de sistemas antiguos donde mezclar código era un proceso manual, Git está diseñado para realizar fusiones de manera automática en la inmensa mayoría de los casos.

Quién mergea con quién

Lo primero, antes de seguir, hablemos de quién mergea. Siempre te fusiones hacia donde estás actualmente.

Es decir, si quieres meter los cambios de la rama feature dentro de main:

Primero vas al destino: git switch main

Desde allí llamas a la rama externa: git merge feature

Nunca al revés. HEAD es el destino, siempre. Ahora, veamos los dos tipos de fusión posibles. 👇

Escenario 1: Fast-forward

Este es el escenario más sencillo. Una rama ha avanzado, pero realmente no han divergido. Imagina esta situación:

  1. Estás en el commit C de main.
  2. Creas una rama feature.
  3. Avanzas dos commits en feature (D y E).
  4. Mientras tanto, **nadie ha tocado main**. Sigue en el commit C.

Cuando le dices a Git “fusiona feature en main”, Git mira y dice: “Espera, no hay divergencia. La historia es una línea recta”.

git merge feature
Copied!

Así que Git no se complica. Simplemente coge la etiqueta main y la desliza hacia adelante hasta alcanzar a feature.

Características del Fast-forward:

  • No crea un commit de fusión.
  • La historia queda totalmente lineal.
  • Es como si hubieras trabajado directamente en main todo el tiempo.

A veces fast-forward no es tan buena idea como parece. Lo veremos más abajo con --no-ff

Escenario 2: Merge Commit

Este es el caso más habitual, donde realmente las ramas si que han divergido. Imagnina este caso:

  1. Creas tu rama feature y avanzas.
  2. Pero mientras tú trabajabas, **alguien ha subido cambios a main** (o tú mismo hiciste un hotfix urgente).

Ahora las ramas han divergido. main ha avanzado por un lado y feature por otro.

git merge feature
Copied!

¿Qué hace Git? Realiza una “fusión a tres vías”. Usa:

  1. El último commit de main.
  2. El último commit de feature.
  3. El ancestro común más reciente de ambos.

Con estos tres ingredientes, Git calcula la mezcla y crea automáticamente un NUEVO commit (el Merge Commit) que tiene dos padres.

Impedir el Fast-forward (--no-ff)

A veces, Fast-forward es genial porque deja la historia muy limpia (una línea recta). Pero tiene un defecto enorme: pierdes la noción de que esos commits pertenecían a una “feature” específica.

Si miras el historial dentro de un mes, verás 5 commits seguidos, pero no sabrás que esos 5 formaban parte de la tarea “Nuevo Login”.

Por eso, muchos equipos (y metodologías como Git Flow) prefieren prohibir el Fast-forward al integrar funcionalidades completas.

Puedes obligar a Git a crear un commit de fusión, incluso si pudiera hacer un Fast-forward, usando:

git merge --no-ff feature
Copied!

Usar --no-ff agrupa visualmente los commits de una tarea. Permite revertir la funcionalidad entera deshaciendo un solo commit (el del merge).