O que significa Squashing commits em git? Como faço para squash commits no Github?
Eu sou novo no Git e solicitei ser atribuído a um bug recém-chegado no analisador de coala. Consertei o bug e agora fui solicitado a esmagar meus commits. Como eu faço isso?
Respostas:
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:
Você acabaria com um arquivo que lista os commits que serão rebaseados
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 .
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
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!
fonte
man git rebase
: A mensagem de commit sugerida para o commit dobrado é a concatenação das mensagens de commit do primeiro commit e daquelas com o comando "squash"git diff
pode ajudá-lo a mostrar o que aconteceu.O comando rebase tem algumas opções incríveis disponíveis em seu modo
--interactive
(ou-i
), e uma das mais amplamente usadas é a capacidade de esmagar commits. O que isso faz é pegar commits menores e combiná-los em outros maiores, o que pode ser útil se você estiver encerrando o dia de trabalho ou se quiser apenas empacotar suas alterações de forma diferente. Vamos ver como você pode fazer isso facilmente.Uma palavra de cautela: só faça isso em commits que não foram enviados para um repositório externo. Se outros basearam o trabalho nos commits que você vai deletar, muitos conflitos podem ocorrer. Só não reescreva sua história se ela tiver sido compartilhada com outras pessoas.
Então, digamos que você acabou de fazer alguns pequenos commits e quer fazer um commit maior deles. O histórico do nosso repositório atualmente se parece com isto:
Os últimos 4 commits seriam muito mais felizes se estivessem juntos, então vamos fazer isso por meio de rebase interativo:
Então, algumas coisas aconteceram aqui. Em primeiro lugar, eu disse ao Git que queria rebase usando os últimos quatro commits de onde o HEAD está com o HEAD ~ 4. O Git agora me colocou em um editor com o texto acima e uma pequena explicação do que pode ser feito. Você tem muitas opções disponíveis para você nesta tela, mas agora vamos apenas compactar tudo em um commit. Portanto, alterar as primeiras quatro linhas do arquivo para isso resolverá o problema:
Basicamente, isso diz ao Git para combinar todos os quatro commits no primeiro commit da lista. Assim que isso for feito e salvo, outro editor aparecerá com o seguinte:
Já que estamos combinando tantos commits, Git permite que você modifique a mensagem do novo commit com base no resto dos commits envolvidos no processo. Edite a mensagem conforme achar adequado, salve e saia. Feito isso, seus commits foram esmagados com sucesso!
E se olharmos para a história novamente ...
Portanto, esta tem sido relativamente indolor até agora. Se você encontrar conflitos durante o rebase, eles geralmente são muito fáceis de resolver e o Git o orienta o máximo possível. O básico disso é consertar o conflito em questão,
git add
o arquivo, e entãogit rebase --continue
retomar o processo. É claro que fazer umgit rebase --abort
o trará de volta ao estado anterior, se quiser. Se por algum motivo você perdeu um commit no rebase, você pode usar o reflog para recuperá-lo.Detalhes podem ser encontrados neste link .
fonte
Significa combinar vários commits em um. Dê uma olhada em :
https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/
Squash meus últimos X commits juntos usando Git
fonte