Cómo fusionar ramas con merge

Una vez que hemos desarrollado la característica de un commit, tenemos que fusionarlo (merge) para que vuelva a la rama inicial. Vemos cómo hacer esto, esta vez mediante fast-forward y recursive.

Cuando trabajamos con Git, una tarea fundamental es fusionar ramas para mantener nuestro código estable y actualizado. Imaginemos que hemos realizado un cambio en una rama llamada Fix Fecha, que contiene una corrección solicitada por nuestro cliente. Ahora queremos llevar ese cambio a la rama Master, que es la base estable desde la que se desarrollan nuevas funcionalidades.

Para entender cómo hacer esta fusión, primero examinamos el estado actual del repositorio con un comando que nos muestra el historial de commits de forma gráfica y detallada. En nuestro caso, partimos de un commit en Master del que nacen dos ramas: Feature New Style y Fix Fecha. Nuestro objetivo es que los cambios realizados en Fix Fecha se integren en Master.

La fusión en Git consiste en combinar los cambios de una rama de origen, como Fix Fecha, con los de una rama de destino, como Master. Si la rama de destino no ha tenido modificaciones desde que se creó la rama de origen, Git puede hacer una fusión sencilla llamada fast-forward. Esto significa que simplemente mueve el puntero de Master para que apunte al último commit de Fix Fecha, incorporando así todos sus cambios sin crear un nuevo commit de fusión.

Para realizar esta operación, primero nos situamos en la rama Master y ejecutamos el comando git merge Fix Fecha. Git detecta que Master no ha avanzado desde que se creó Fix Fecha y realiza un fast-forward, actualizando Master para que incluya los commits de Fix Fecha. Si revisamos el historial, veremos que Master ahora apunta al mismo commit que Fix Fecha, manteniendo el orden lineal de los commits.

Sin embargo, la fusión puede complicarse cuando ambas ramas han tenido cambios independientes desde un ancestro común. Por ejemplo, si queremos fusionar Feature New Style en Master, y ambas ramas han avanzado con commits propios, no podemos hacer un fast-forward. En este caso, Git utiliza una estrategia de fusión llamada recursiva.

La estrategia recursiva crea un nuevo commit de fusión que integra los cambios de ambas ramas. Para ello, Git compara las diferencias entre el ancestro común y cada una de las ramas, identificando qué líneas se han añadido o eliminado en cada una. Luego intenta aplicar estos cambios sobre la rama de destino. Si no hay conflictos, Git genera automáticamente un commit que une ambas historias.

En nuestro ejemplo, Feature New Style modifica el estilo de la página, mientras que Fix Fecha cambió el archivo index.html. Como estas modificaciones no se solapan, Git puede fusionarlas sin problemas. Al ejecutar git merge Feature New Style desde Master, Git nos pide un mensaje para el commit de fusión, que podemos aceptar por defecto. Después, el historial muestra un nuevo commit que tiene dos padres: uno correspondiente a Master antes de la fusión y otro a Feature New Style.

Este commit de fusión representa la integración de ambas ramas, manteniendo el historial completo y permitiendo que Master contenga todos los cambios realizados. La estrategia recursiva es la forma predeterminada en Git para manejar fusiones complejas y es muy eficiente para combinar desarrollos paralelos.

Más adelante, cuando las modificaciones afecten las mismas líneas de código en ambas ramas, pueden surgir conflictos que requerirán intervención manual. Pero por ahora, entender cómo funcionan el fast-forward y la estrategia recursiva nos permite manejar la mayoría de las fusiones de manera sencilla y efectiva.

Lista de reproducción
  1. 1
    ¿Qué es Git?
    4 minutos
  2. 2
    Cómo instalar Git
    9 minutos
  3. 3
    Creando tu primer commit
    9 minutos
  4. 4
    Qué es el staging area
    10 minutos
  5. 5
    Cómo deshacer modificaciones de archivos
    7 minutos
  6. 6
    Cómo deshacer un commit con reset
    7 minutos
  7. 7
    Cómo revertir un commit con revert
    7 minutos
  8. 8
    Introducción a las ramas
    6 minutos
  9. 9
    Cómo crear y modificar ramas
    6 minutos
  10. 10
    Commits bajo el workflow Feature Branch
    6 minutos
  11. 11
    Cómo fusionar ramas con merge
    6 minutos
  12. 12
    Fusiones conflictivas
    9 minutos
  13. 13
    Cómo construir alias
    7 minutos
  14. 14
    Más sobre conflictos
    9 minutos
  15. 15
    Etiquetas
    7 minutos
  16. 16
    Tags anotados
    9 minutos
  17. 17
    git stash: esconder cambios
    6 minutos
  18. 18
    Introducción a remotos
    5 minutos
  19. 19
    Pusheando a un remoto
    6 minutos
  20. 20
    Clonando y haciendo pull
    6 minutos
  21. 21
    Fetch y pull rebases
    8 minutos
  22. 22
    Rebase
    7 minutos
  23. 23
    Rebase interactivo
    6 minutos
  24. 24
    Master, main y otros nombres de rama
    9 minutos
  25. 25
    git switch
    9 minutos
  26. 26
    git-restore
    10 minutos
  27. 27
    git-grep
    11 minutos
  28. 28
    Gitignore
    11 minutos
  29. 29
    El flag --patch
    9 minutos
  30. 30
    git-apply y parches en bruto (advanced)
    9 minutos
  31. 31
    Merge octopus (advanced)
    9 minutos
  32. 32
    Conventional commits
    12 minutos
  33. 33
    Merge and squash (GitLab / GitHub...)
    6 minutos
  34. 34
    git merge --squash
    7 minutos
  35. 35
    git-bisect
    8 minutos
  36. 36
    git-blame
    6 minutos
  37. 37
    git-reflog
    10 minutos
  38. 38
    Git para la Bash
    11 minutos
  39. 39
    Submódulos (parte 1)
    7 minutos
  40. 40
    Submódulos (parte 2)
    10 minutos
  41. 41
    Otros clientes Git (último episodio)
    9 minutos