Git squash = combinar varios commits en UN SOLO commit.
Analogía: tienes 5 borradores de un correo → los combinas en 1 correo final limpio.
Ejemplo:
ANTES del squash:
- "fix typo"
- "add feature"
- "fix bug"
- "another fix"
DESPUÉS del squash:
- "Add complete login feature"Problema: historial sucio
git log --oneline
abc123 oops fix typo
def456 forgot semicolon
ghi789 actually implement feature
jkl012 fix indent
mno345 real commit messageSolución: ¡squash!
git log --oneline
xyz999 Implement user authentication systemVentajas:
El comando mágico:
git rebase -i HEAD~4 # Squash de los 4 últimos commitsInterfaz que se abre:
pick abc123 oops fix typo
pick def456 forgot semicolon
pick ghi789 actually implement feature
pick jkl012 fix indentCámbialo a:
pick ghi789 actually implement feature
squash abc123 oops fix typo
squash def456 forgot semicolon
squash jkl012 fix indentResultado: 4 commits → 1 commit limpio.
mkdir demo-squash && cd demo-squash
git init
# Crear varios commits "sucios"
echo "print('v1')" > app.py && git add . && git commit -m "start feature"
echo "print('v1.1')" > app.py && git add . && git commit -m "oops fix"
echo "print('v1.2')" > app.py && git add . && git commit -m "another fix"
echo "print('v2 done')" > app.py && git add . && git commit -m "feature complete"
# Historial sucio
git log --oneline
# Squash interactivo
git rebase -i HEAD~4
# En el editor: dejar el primero en "pick" y cambiar los demás a "squash"
# Guardar y cerrar
# Escribir el mensaje del commit final
# Resultado: 1 commit limpio
git log --onelineSituaciones típicas:
Feature branch antes del merge:
git checkout feature-login
# ... 15 commits de desarrollo con typos/arreglos
git rebase -i HEAD~15 # Squash en 2-3 commits lógicos
git checkout main && git merge feature-loginLimpiar antes del push:
# Desarrollo local en borrador
git rebase -i HEAD~8 # Limpiar antes de compartir
git push origin feature-branchCorregir el historial público (¡cuidado!):
# Solo si nadie ha recuperado aún tus commits
git rebase -i HEAD~5
git push --force-with-lease # Más seguro que --forceSquash = tu aspiradora para limpiar el historial.