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.