Você pode pensar no Git como um banco de dados avançado de instantâneos de seu (s) diretório (s) de trabalho.
Um recurso muito bom do Git é a capacidade de reescrever o histórico de commits.
A principal razão para fazer isso é que muito desse histórico é relevante apenas para o desenvolvedor que o gerou, então ele deve ser simplificado, ou melhorado, antes de enviá-lo para um repositório compartilhado.
Eliminar um commit significa, de um ponto de vista idiomático, mover as mudanças introduzidas no dito commit em seu pai, de forma que você termine com um commit em vez de dois (ou mais).
Se você repetir esse processo várias vezes, poderá reduzir n commit a um único.
Visualmente, se você começou seu trabalho no commit marcado como Iniciar , você quer isso
Você pode notar que o novo commit tem um tom de azul ligeiramente mais escuro. Isso é intencional.
No Git, a compressão é feita com um Rebase , de uma forma especial chamada Rebase Interativo .
Simplificando quando você rebase um conjunto de commits em um branch B , você aplica todas as mudanças introduzidas por aqueles commits como eles foram feitos, começando de B ao invés de seu ancestral original.
Uma pista visual
Observe novamente os diferentes tons de azul.
Um rebase interativo permite que você escolha como os commits devem ser rebaseizados. Se você executar este comando:
git rebase -i branch
Você acabaria com um arquivo que lista os commits que serão rebaseados
pick ae3...
pick ef6...
pick 1e0...
pick 341...
Eu não nomear os commits, mas esses quatro uns pretendem ser os commits a partir Iniciar a cabeça
O bom dessa lista é que ela é editável .
Você pode omitir commits, ou você pode esmagá-los .
Tudo o que você precisa fazer é mudar a primeira palavra para squash .
pick ae3...
squash ef6...
squash 1e0...
squash 341...
Se você fechar o editor e nenhum conflito de mesclagem for encontrado, você terá este histórico:
No seu caso, você não quer rebase em outro branch, mas em um commit anterior.
Para transformar o histórico conforme mostrado no primeiro exemplo, você deve executar algo como
git rebase -i HEAD~4
mude os "comandos" para squash para todos os commits exceto o primeiro, e então feche seu editor.
Nota sobre a alteração do histórico
No Git, os commits nunca são editados. Eles podem ser podados, tornados inacessíveis, clonados, mas não alterados.
Quando você rebase, na verdade está criando novos commits.
Os antigos não são mais acessíveis a nenhum árbitro, então não são mostrados na história, mas eles ainda estão lá!
Isso é o que você realmente obtém para um rebase:
Se você já os colocou em algum lugar, reescrever o histórico fará um branch!