Git Squash

1 min

Tabla de contenidos

  1. ¿Qué es squash?
  2. ¿Por qué squash?
  3. Squash interactivo
  4. Práctica inmediata
  5. Casos de uso

1. ¿Qué es squash?

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"

Volver a la tabla de contenidos

2. ¿Por qué squash?

Problema: historial sucio

git log --oneline
abc123 oops fix typo
def456 forgot semicolon  
ghi789 actually implement feature
jkl012 fix indent
mno345 real commit message

Solución: ¡squash!

git log --oneline  
xyz999 Implement user authentication system

Ventajas:

  • Historial limpio y legible
  • Commits lógicos por funcionalidad
  • Más fácil hacer revert de una feature completa

Volver a la tabla de contenidos

3. Squash interactivo

El comando mágico:

bash
git rebase -i HEAD~4    # Squash de los 4 últimos commits

Interfaz que se abre:

pick abc123 oops fix typo
pick def456 forgot semicolon
pick ghi789 actually implement feature  
pick jkl012 fix indent

Cámbialo a:

pick ghi789 actually implement feature
squash abc123 oops fix typo
squash def456 forgot semicolon  
squash jkl012 fix indent

Resultado: 4 commits → 1 commit limpio.

Volver a la tabla de contenidos

4. Práctica inmediata

bash
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 --oneline

Volver a la tabla de contenidos

5. Casos de uso

Situaciones típicas:

  1. Feature branch antes del merge:

    bash
    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-login
  2. Limpiar antes del push:

    bash
    # Desarrollo local en borrador
    git rebase -i HEAD~8     # Limpiar antes de compartir
    git push origin feature-branch
  3. Corregir el historial público (¡cuidado!):

    bash
    # Solo si nadie ha recuperado aún tus commits
    git rebase -i HEAD~5
    git push --force-with-lease    # Más seguro que --force

Squash = tu aspiradora para limpiar el historial.

Volver a la tabla de contenidos