Git merge squash

Cómo agrupar commits en uno solo al hacer merge a otra rama git.

git-merge-squash

En nuestro día a día como desarrolladores, muchas veces nos encontramos revisando commits que podrían haberse resumido o incluso evitado. En proyectos colaborativos —especialmente cuando trabajamos con ramas feature— esto se vuelve evidente. Aquí entra en juego git merge --squash, una herramienta útil para simplificar el historial sin perder el trabajo realizado en una rama.

¿Qué es git squash?

Esta opción de git merge es una forma de aplanar commits (de ahí el término squash, que significa aplastar o comprimir) utilizando comandos como git merge --squash.

Este comando permite combinar los cambios de una rama en otra como si todo fuera un solo commit, sin hacer un merge tradicional. No se fusionan los historiales de ambas ramas; simplemente, los cambios se aplican y luego podemos crear un único commit que los represente.

¿Por qué usar git merge --squash?

Hay varias razones por las que podríamos querer agrupar varios commits en uno solo antes de integrarlos a la rama principal:

  • Limpieza del historial: Cuando desarrollamos una funcionalidad, solemos hacer muchos commits intermedios (ajustes, correcciones, pruebas). Si esos se integran tal cual a main, el historial se llena de ruido.
  • Reverts fáciles: Como todos los cambios de una rama están condensadas en un solo commit, revertir los cambios es más sencillo.
  • Revisiones de código más sencillas: Como los cambios están agrupados en un commit, hace que el proceso de revisión sea más fácil.

Ejemplo de uso

Imaginemos que trabajamos en una rama llamada feature/login que está compuesta por 10 commits. Mientras hemos estado desarrollando la funcionalidad, muchos de estos commits son pequeños y poco importantes, corregir errores de sintaxis, importar librerías, etc… Y lo que realmente nos importa es que al hacer merge de la rama a main quede un sólo commit con todos los cambios y un mensaje claro. Para ello ejecutaremos estos comandos:

Terminal
# Nos movemos a main
git checkout main
# Traemos los cambios de feature/login, pero sin fusionar los historiales
git merge --squash feature/login
# Creamos un único commit con todos los cambios
git commit -m "Añade funcionalidad de login"

Al ejecutar git merge --squash, Git no hace un merge como tal, sino que aplica los cambios de la rama como staged changes (preparados para commit). Luego decidimos si queremos comitear todo, modificar algo o incluso descartar.

Podemos ver el resultado de este merge con:

Terminal
git status

Ahí nos mostrará los archivos modificados, listos para ser comiteados. Nada se ha registrado aún en el historial, lo que nos da margen para revisar y decidir.

Conclusión

git merge --squash es una herramienta útil cuando queremos integrar cambios sin complicar el historial. No es la única forma de hacer squash, pero es directa y fácil de entender. Nos permite mantener ramas limpias, sin perder el trabajo que hicimos.

No se trata de ocultar lo que hicimos, sino de presentar los cambios de forma clara y resumida. A veces un solo commit bien descrito dice mucho más que diez commits intermedios.

¿Lo mejor? Podemos combinar este enfoque con buenas prácticas de revisión de código, asegurando que el código que llega a main sea fácil de leer y de mantener.