O que é um squash merge?
Um squash merge colapsa todos os commits de uma branch em um único commit ao fazer o merge, dando à branch principal um histórico organizado, com um commit por mudança.
Um squash merge é uma forma de manter a branch principal limpa. Em vez de trazer cada commit bagunçado de trabalho em andamento de uma feature branch, ele os combina em um único commit no momento do merge. O histórico detalhado da branch desaparece em favor de uma única mudança bem descrita.
What squashing does
Quando você faz squash e merge, o Git pega todas as mudanças da branch e as registra como um único novo commit na branch alvo. Os commits individuais da branch não são carregados; apenas o efeito combinado deles é, sob uma única mensagem que você geralmente escreve no momento do merge.
Squash merging a pull request
A maioria das plataformas oferece o squash como opção de merge; pela CLI, você pode fazer o squash antes de fazer o merge.
git switch main
git merge --squash feature/cleanup
git commit -m "Add cleanup utility"The tradeoffs
O squash dá a main um histórico limpo e linear de mudanças significativas, fácil de escanear e de fazer bisect. O custo é perder o histórico de commits granular da branch, o que pode importar se esses passos intermediários eram valiosos. Para a maioria das equipes, a organização vale a pena.
Squash merges and CI/CD
Um histórico limpo de um commit por feature facilita usar bisect para reduzir uma falha de CI a uma única mudança autocontida e revertê-la de forma limpa, se necessário. Como cada merge é um commit, mapear uma execução de pipeline ou um deploy de volta à mudança que ele enviou fica mais simples e menos ambíguo.
When to squash
- Faça squash para manter main legível quando o histórico da branch estiver barulhento.
- Escreva uma mensagem final clara resumindo toda a mudança.
- Prefira o squash para pull requests pequenos e de propósito único.
- Evite-o quando os commits intermediários carregarem valor real.
Principais conclusões
- Um squash merge colapsa uma branch em um único commit no alvo.
- Ele mantém main limpa, mas descarta o histórico detalhado da branch.
- Um histórico de um commit por mudança simplifica o bisect e o revert no CI.