|  |  | Utilizando o `git rebase` é possível esmagar vários commits em apenas um. Porque isso é interessante? | 
|  |  | 1. As funcionalidades ou correções de bugs devem ser "atômicas", ou seja, entregues em 1 commit apenas. | 
|  |  | 2. Facilita o rastreamento da funcionalidade e identificação de todas as mudanças de código que foram feitas na funcionalidade. | 
|  |  | 3. Torna-se **MUITO** mais fácil reverter uma funcionalidade quando detectamos que ela inseriu um defeito no código. | 
|  |  |  | 
|  |  | Antes de começar, verifique a regra de ouro: | 
|  |  |  | 
|  |  | **Faça rebase apenas em commits de branches onde você é o único desenvolvedor** | 
|  |  |  | 
|  |  | Assumindo que temos os seguintes commits exibidos pelo comando `git log`: | 
|  |  |  | 
|  |  |  | 
|  |  |  | 
|  |  | Podemos esmagar quantos commits quisermos em apenas 1 da seguinte forma: | 
|  |  |  | 
|  |  | `git rebase -i HEAD~3` onde `HEAD` indica o nosso commit atual, e 3 é o número de commits que queremos analisar. O número pode ser maior, já que esse comando por si ainda não completa o squash. | 
|  |  |  | 
|  |  | Quando executarmos esse comando, a seguinte tela será exibida: | 
|  |  |  | 
|  |  |  | 
|  |  |  | 
|  |  | Perceba que a ordem dos commits está invertida comparada com o `git log`. Os commits mais recentes estão abaixo. Os comentários mostram as opções disponíveis: se quisermos juntar os commits 2 e 3 sobre o commit 1, só precisamos trocar a palavra "pick" por "squash" (ou simplesmente "s") sem aspas, nos commits que queremos esmagar. Nossa edição deve ficar desta forma: | 
|  |  |  | 
|  |  |  | 
|  |  |  | 
|  |  | Precisamos então salvar e sair do nosso editor. Se estiver usando o nano, as instruções para sair encontram-se na parte debaixo da tela (`Ctrl+X`, seguido de um S/Y para confirmar, e um `ENTER`). Se estiver utilizando o vi/vim, pressione `ESC`, seguido de `:wq`, e `ENTER`. | 
|  |  |  | 
|  |  | Por fim o git permitirá a edição da mensagem de commit. Por padrão ele mostrará as 3 mensagens de commit, além de linhas que começam com `#` que são comentários e não aparecerão na mensagem final. Altere a vontade a mensagem, salve o arquivo e saia. | 
|  |  |  | 
|  |  | Para atualizar o branch remoto (já que alguns commits foram destruídos e outros tiveram a referência alterada), utilize o commando `git push --force-with-lease`. | 
|  |  | \ No newline at end of file |