DEV Community

Cover image for Git Merge vs Git Rebase: Cómo tener un historial ordenado y claro
Manuel Dávila Alarcón
Manuel Dávila Alarcón

Posted on

Git Merge vs Git Rebase: Cómo tener un historial ordenado y claro

Si trabajas en equipo con Git, seguramente has escuchado sobre git merge y git rebase. Ambos sirven para combinar ramas, pero tienen efectos diferentes en la historia del repositorio. Usarlos correctamente puede hacer que tu historial de Git sea fácil de entender 🤩 o un desastre incomprensible 😵.

Vamos a ver en detalle en qué se diferencian y cuándo usar cada uno.

Git Merge

📌 ¿Qué hace Git Merge y por qué es útil??

Cuando usas git merge, Git toma dos ramas y las combina en una nueva confirmación (commit), manteniendo el historial de ambas ramas intacto. Se usa mucho cuando integras una rama secundaria en la principal (como develop o main).

Imagina que tienes dos caminos separados que finalmente se juntan en una carretera principal. Sigues viendo de dónde viene cada uno, pero ahora forman parte de la misma ruta.
Image description

🛠️ Cómo usar Git Merge y cómo se ve en los gráficos

Para aplicar merge a una rama llamada develop, es decir queremos enviar los cambios de feature/chatbot hacia develop. Primero debes posicionarte en la rama develop y ejecutar el siguiente comando:

git checkout develop
git merge feature/chatbot
Enter fullscreen mode Exit fullscreen mode

Esto genera un commit de merge en develop con todo el historial de feature/chatbot.

Cómo debería verse un merge en el gráfico de historial de git.

Image description

Como puedes ver, hay una evidencia clara de que el branch feature/chatbot se incorporó en develop, lo hace muy fácil de leer.

En este caso no hubo conflictos. Sin embargo, sabemos que en un entorno productivo, el caos predomina 🔥, así que veamos un escenario más conflictivo.

🔍 Caso real: Cuándo usar Git Merge

Imagina que trabajas en un equipo desarrollando una nueva funcionalidad en una rama llamada feature/chatbot. Mientras tanto, otros compañeros han seguido trabajando en develop, agregando nuevas mejoras y correcciones de errores.

Llega el momento de integrar feature/chatbot en develop, pero quieres asegurarte de que el historial refleje claramente que esta funcionalidad se desarrolló en paralelo y luego se unió a la rama principal. Aquí es donde git merge brilla.

Se creará un commit de merge que preservará todo el historial de feature/chatbot, dejando claro cuándo y cómo se unieron los cambios. Esto es útil en proyectos colaborativos porque facilita el rastreo de la evolución del código y evita sobrescribir accidentalmente cambios de otros.

Image description

Sin embargo, dado que develop ha seguido evolucionando con cambios que no están en feature/chatbot, es probable que debas resolver conflictos de merge. Esto sucede porque algunos archivos pueden haber sido modificados en ambas ramas, y Git no sabe cuál versión debería mantenerse.

Image description

La solución consiste en revisar y seleccionar manualmente los cambios adecuados antes de finalizar el merge.

Image description

Una vez que solucionas los conflictos entre 2 ramas, el mismo conflicto no debería volver a aparecer (a menos que haya nuevas modificaciones en el archivo o clase que otro desarrollador ha modificado). Incluso si agregas un nuevo commit a feature/chatbot y vuelves aplicar merger hacia develop nuevamente.

Image description

Si en lugar de git merge intentáramos un git rebase, estaríamos reescribiendo la historia de feature/chatbot como si siempre hubiera estado basada en la última versión de develop. Esto podría generar problemas si otros colaboradores ya han trabajado sobre la misma rama y necesitan un historial claro de integración.

Por eso, git merge es la mejor opción aquí, ya que mantiene un historial fiel del desarrollo de la funcionalidad y facilita la colaboración en equipo.

Para los ejemplos del gráfico del historial de Git utilizo GitKraken Desktop, pero en cualquier cliente de Git deberías poder visualizarlo.

Git Rebase

📌 ¿Qué hace Git Rebase y por qué es útil??

git rebase toma los commits de una rama y los aplica sobre otra como si siempre hubieran estado allí. En lugar de mezclar con un commit de merge, reescribe la historia para que los cambios parezcan hechos directamente sobre la rama principal.

Es como si, en lugar de recordar que tomaste un desvío en el camino, tu GPS reescribiera el trayecto para que pareciera que nunca te desviaste.
Image description

También se podría usar para no dejar evidencia de cambios que vienen de una rama específica 👀 aparecen los commits pero no la rama del que vienen.

🛠️ Cómo usar Git Rebase y cómo se ve en los gráficos?

Para aplicar rebase a una rama llamada feature/oauth-gmail, la cual se creó anteriormente a partir de main. Primero debes posicionarte sobre la rama feature/oauth-gmail y ejecutar el siguiente comando:

git checkout feature/oauth-gmail
git rebase main
Enter fullscreen mode Exit fullscreen mode

También podrías hacerlo desde un cliente de Git como Fork, Git Kraken u otro, presionando clic derecho a la rama que quieres aplicar rebase (como main) y seleccionar "rebase".

Image description

Esto generará que la rama feature/oauth-gmail se alinee con la rama main como si se hubiera creado con la ultima versión de main.

Cómo debería verse un rebase en el gráfico de historial de git.

Image description

🔍 Caso real: Cuándo usar Git Rebase

Imagina que estás trabajando en una nueva funcionalidad en una rama feature/oauth-gmail, la cual creaste a partir de master. Mientras tanto, master ha recibido múltiples actualizaciones, incluyendo hotfixes y nuevos releases.

Image description

Dado que feature/oauth-gmail proviene de master, lo ideal es hacer un git rebase master para alinear la rama con los cambios más recientes sin introducir un commit de merge innecesario.

Si en su lugar usaras git merge, se generaría una mezcla bidireccional entre master y feature/oauth-gmail, lo que haría más confusa la lectura del historial y rompería con la estrategia de branching.

Veamos como quedaría si queremos integrar con merge y luego queremos hacer un commit.

Image description

Como puedes ver, la rama master deja de tener un historial limpio 😖

Con git rebase master, los commits de feature/oauth-gmail se reordenan y aplican sobre la última versión de master, manteniendo un historial más limpio y lineal. Esto facilita la revisión del código y evita la complejidad innecesaria en el historial del proyecto.

Si hay conflictos, deberás resolverlos manualmente en cada paso del rebase, pero al final obtendrás una estructura más clara y organizada.

Image description

Incluso si quisiéramos hacer un nuevo commit quedaría más limpio tanto el historial de commits del feature como master.

Image description

Tanto con Git Merge como Git Rebase, no te salvarás de solucionar conflictos de merge. El propósito de estos comandos es mantener un historial de git de la forma más óptima para los desarrolladores y no tiene que ver con la forma de manejar los conflictos de merge.

🎉 Conclusión

Usa merge para integrar ramas de larga duración (como features hacia develop en Git Flow). Usa rebase para mantener actualizadas tus feature branches antes de mergearlas.

Tanto git merge como git rebase son herramientas poderosas y necesarias. No hay una "mejor" que otra, sino que cada una se adapta a diferentes situaciones. Si quieres un historial claro y ordenado, usa rebase. Si necesitas contexto y claridad en las integraciones, opta por merge.
Es importante que todo el equipo siga las mismas prácticas para mantener un historial de Git consistente.

¡Ahora sí, a escribir código y a hacer commits con confianza! 🚀

Top comments (0)