Git: Squash de Commits
Última atualização
O squash combina vários commits em um só, de modo que uma sequência bagunçada de commits "wip", "corrige erro de digitação", "agora vai" vira um único commit limpo. A ferramenta usual é o rebase interativo - git rebase -i - onde você marca os commits que quer unir. Como o squash reescreve o histórico, faça isso antes do push, ou em um branch em que só você está trabalhando.
Experimente estes comandos no terminal playground - um shell real no seu navegador, sem precisar instalar nada.
Sintaxe
| Command | What it does |
|---|---|
git rebase -i HEAD~3 | Faz rebase interativo dos últimos 3 commits |
git rebase -i main | Faz rebase de todos os commits desde main |
git merge --squash feature | Combina os commits de um branch em um só ao fazer merge |
git reset --soft HEAD~3 && git commit | Faz squash dos últimos 3 commits sem rebase |
Comandos do rebase interativo
No editor que abre, troque pick por um destes.
| Keyword | What it does |
|---|---|
pick | Mantém o commit como está |
squash (s) | Une ao commit anterior e mescla as mensagens |
fixup (f) | Une, mas descarta a mensagem deste commit |
reword (r) | Mantém o commit, mas edita sua mensagem |
Exemplo prático
Faça squash dos últimos três commits em um antes do push.
| Step | Action | Result |
|---|---|---|
| 1 | git rebase -i HEAD~3 | Abre os últimos 3 commits no editor |
| 2 | Defina os commits 2 e 3 como squash | Marca-os para serem unidos ao primeiro |
| 3 | Salve e edite a mensagem combinada | Três commits viram um commit limpo |
Perguntas frequentes sobre squash de commits no Git
Como faço squash dos últimos N commits no Git?
git rebase -i HEAD~N (por exemplo HEAD~3 para os últimos três). No editor, deixe o primeiro commit como pick e troque o restante para squash (ou fixup para descartar suas mensagens). Salve, edite a mensagem de commit combinada e os commits se juntam em um só.Qual é a diferença entre squash e fixup?
squash mantém a mensagem do commit e permite combiná-la com as outras em um editor. O fixup descarta a mensagem do commit por completo, mantendo apenas a do commit anterior - útil para commits de "opa, pequena correção" que você não quer na mensagem final.Como faço squash de um branch inteiro ao fazer merge?
git merge --squash feature e depois git commit. Isso aplica todas as mudanças do branch como mudanças em stage e permite registrá-las como um único commit no branch de destino, sem trazer os commits individuais do branch. O botão "Squash and merge" do GitHub faz a mesma coisa.Posso fazer squash sem um rebase interativo?
git reset --soft HEAD~N volta o branch N commits mantendo todas as mudanças em stage, e então um único git commit as registra como uma só. É uma forma rápida de fazer squash dos commits mais recentes sem abrir o editor de rebase.