Git: Aplastar Commits (Squash)
Última actualización
Aplastar (squash) combina varios commits en uno solo, de modo que una serie desordenada de commits "wip", "corregir errata", "ahora sí lo arreglo" se convierte en un único commit limpio. La herramienta habitual es el rebase interactivo - git rebase -i - donde marcas los commits que quieres fusionar. Como aplastar reescribe el historial, hazlo antes de hacer push, o en una rama en la que solo trabajes tú.
Prueba estos comandos en el terminal playground - una shell real en tu navegador, sin necesidad de instalar nada.
Sintaxis
| Command | What it does |
|---|---|
git rebase -i HEAD~3 | Rebase interactivo de los últimos 3 commits |
git rebase -i main | Rebase de cada commit desde main |
git merge --squash feature | Aplasta los commits de una rama en uno solo al hacer merge |
git reset --soft HEAD~3 && git commit | Aplasta los últimos 3 commits sin rebase |
Comandos del rebase interactivo
En el editor que se abre, cambia pick por uno de estos.
| Keyword | What it does |
|---|---|
pick | Mantiene el commit tal cual |
squash (s) | Fusiona con el commit anterior y combina los mensajes |
fixup (f) | Fusiona pero descarta el mensaje de este commit |
reword (r) | Mantiene el commit pero edita su mensaje |
Ejemplo práctico
Aplasta los últimos tres commits en uno antes de hacer push.
| Step | Action | Result |
|---|---|---|
| 1 | git rebase -i HEAD~3 | Abre los últimos 3 commits en el editor |
| 2 | Marca los commits 2 y 3 como squash | Los marca para fusionarlos con el primero |
| 3 | Guarda y edita el mensaje combinado | Tres commits se convierten en un commit limpio |
Preguntas frecuentes sobre aplastar commits en Git
¿Cómo aplasto los últimos N commits en Git?
git rebase -i HEAD~N (por ejemplo HEAD~3 para los últimos tres). En el editor, deja el primer commit como pick y cambia el resto a squash (o fixup para descartar sus mensajes). Guarda, edita el mensaje de commit combinado y los commits se fusionan en uno solo.¿Cuál es la diferencia entre squash y fixup?
squash mantiene el mensaje del commit y te permite combinarlo con los demás en un editor. fixup descarta por completo el mensaje del commit y conserva solo el del commit anterior - útil para commits de "ups, pequeña corrección" que no quieres en el mensaje final.¿Cómo aplasto una rama entera al hacer merge?
git merge --squash feature y luego git commit. Esto aplica todos los cambios de la rama como cambios preparados (staged) y te permite registrarlos como un único commit en la rama de destino, sin traer los commits individuales de la rama. El botón "Squash and merge" de GitHub hace lo mismo.¿Puedo aplastar sin un rebase interactivo?
git reset --soft HEAD~N retrocede la rama N commits manteniendo todos sus cambios preparados (staged), y luego un único git commit los registra como uno solo. Es una forma rápida de aplastar los commits más recientes sin abrir el editor de rebase.