Git Squash

1 min

Índice

  1. O que é Squash?
  2. Por que Squash?
  3. Squash interativo
  4. Prática imediata
  5. Casos de uso

1. O que é Squash?

Git squash = combinar vários commits num ÚNICO commit.

Analogia: tem 5 rascunhos de um email → combina-os num email final limpo.

Exemplo:

ANTES do squash:
- "fix typo"  
- "add feature"
- "fix bug"
- "another fix"

DEPOIS do squash:  
- "Add complete login feature"

Voltar ao índice

2. Por que Squash?

Problema: histórico sujo

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

Solução: Squash!

git log --oneline  
xyz999 Implement user authentication system

Vantagens:

  • Histórico limpo e legível
  • Commits lógicos por funcionalidade
  • Mais fácil reverter uma feature completa

Voltar ao índice

3. Squash interativo

O comando mágico:

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

Interface que se abre:

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

Mude para:

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

Resultado: 4 commits → 1 commit limpo!

Voltar ao índice

4. Prática imediata

bash
mkdir demo-squash && cd demo-squash
git init

# Criar vários commits "sujos"
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"

# Histórico sujo
git log --oneline

# Squash interativo
git rebase -i HEAD~4

# No editor: manter o primeiro "pick", mudar os outros para "squash"
# Guardar e fechar

# Escrever a mensagem do commit final
# Resultado: 1 commit limpo!
git log --oneline

Voltar ao índice

5. Casos de uso

Situações típicas:

  1. Feature branch antes do merge:

    bash
    git checkout feature-login
    # ... 15 commits de desenvolvimento com typos/fixes
    git rebase -i HEAD~15    # Squash em 2-3 commits lógicos
    git checkout main && git merge feature-login
  2. Limpar antes do push:

    bash
    # Desenvolvimento local em rascunho
    git rebase -i HEAD~8     # Limpar antes de partilhar
    git push origin feature-branch
  3. Corrigir o histórico público (atenção!):

    bash
    # Só se ninguém tiver ainda obtido os seus commits
    git rebase -i HEAD~5
    git push --force-with-lease    # Mais seguro que --force

Squash = o seu aspirador para limpar o histórico!

Voltar ao índice