freeCodeCamp/guide/portuguese/git/git-squash/index.md

5.6 KiB

title localeTitle
Git Squash Git Squash

Git Squash

Uma das coisas que os desenvolvedores ouvem com frequência sobre seus pedidos de pull é algo como "Isso parece bom para mim, por favor, squash e mesclar". A parte divertida é que não existe tal comando como o git squash (a menos que você crie um alias para ele). Para squash pull request significa comumente compactar todos os commits deste pedido em um (raramente para outro número) para torná-lo mais conciso, legível e não poluir o histórico do branch principal. Para alcançar esse desenvolvedor, é necessário usar o modo interativo do comando Git Rebase .

Muitas vezes, quando você desenvolve algum novo recurso, você acaba com vários commits intermitentes em seu histórico - você desenvolve incrementalmente, afinal. Isso pode ser apenas alguns erros ou etapas para a solução final. Na maioria das vezes não adianta ter todos esses commits na versão pública final do código, então é mais benéfico ter todos eles compactados em um, único e final.

Então vamos supor que você tenha o seguinte log de commit no branch que gostaria de mesclar como parte do pull request:

$ git log --pretty=oneline --abbrev-commit 
 30374054 Add Jupyter Notebook stub to Data Science Tools 
 8490f5fc Minor formatting and Punctuation changes 
 3233cb21 Prototype for Notebook page 

É claro que preferimos ter apenas um commit aqui, já que não há nenhum benefício em saber o que começamos a escrever e quais erros corrigimos lá depois, apenas o resultado final é importante.

Então, o que fazemos é iniciar uma sessão de rebase interativa do HEAD atual (commit 30374054 ) para o commit 3233cb21 , com a intenção de combinar 3 commits mais recentes em um:

$ git rebase -i HEAD~3 

Isso abrirá um editor com algo como seguir:

pick 3233cb21 Prototype for Notebook page 
 pick 8490f5fc Minor formatting and Punctuation changes 
 pick 30374054 Add Jupyter Notebook to Data Science Tools 
 # Rebase 
 # 
 # Commands: 
 #  p, pick = use commit 
 #  r, reword = use commit, but edit the commit message 
 #  e, edit = use commit, but stop for amending 
 #  s, squash = use commit, but meld into previous commit 
 #  f, fixup = like "squash", but discard this commit's log message 
 #  x, exec = run command (the rest of the line) using shell 
 # 
 # These lines can be re-ordered; they are executed from top to bottom. 
 # 
 # If you remove a line here THAT COMMIT WILL BE LOST. 
 # 
 # However, if you remove everything, the rebase will be aborted. 
 # 
 # Note that empty commits are commented out 

Como sempre, o Git nos dá uma mensagem de ajuda muito boa, onde você pode ver essa opção de squash que estamos procurando.

Atualmente, as instruções para o rebase interativo dizem para pick cada confirmação especificada e preservar a mensagem de confirmação correspondente. Isso é - não mude nada. Mas queremos ter apenas um commit no final. Simplesmente edite o texto em seu editor substituindo pick with squash (ou apenas s ) ao lado de cada commit que queremos eliminar e salve / saia do editor. Isso pode parecer assim:

s 3233cb21 Prototype for Notebook page 
 s 8490f5fc Minor formatting and Punctuation changes 
 pick 30374054 Add Jupyter Notebook to Data Science Tools 

Quando você fecha seu editor salvando essas alterações, ele será reaberto imediatamente, sugerindo a escolha e reformulação de mensagens de confirmação. Algo como

# This is a combination of 3 commits. 
 # The first commit's message is: 
 Prototype for Notebook page 
 
 # This is the 2nd commit message: 
 
 Minor formatting and Punctuation changes 
 
 # This is the 3rd commit message: 
 
 Add Jupyter Notebook to Data Science Tools 
 
 # Please enter the commit message for your changes. Lines starting 
 # with '#' will be ignored, and an empty message aborts the commit. 

Neste ponto, você pode excluir todas as mensagens que não deseja incluir na versão final de confirmação, reformulá-las ou apenas escrever a mensagem de confirmação do zero. Apenas lembre-se que a nova versão incluirá todas as linhas que não estão iniciando com o caractere # . Mais uma vez, salve e saia do seu editor.

O seu terminal agora deve mostrar uma mensagem de sucesso, incluindo Successfully rebased and updated <branch name> e o log do git deve mostrar um histórico agradável e compactado com apenas uma confirmação. Todos os commits intermediários acabaram e estamos prontos para nos fundir!

Aviso sobre incompatibilidade de histórico de confirmação local e remota

Essa operação é um pouco perigosa se você já tiver seu branch publicado em um repositório remoto - você está modificando o histórico de commits depois de tudo. Portanto, é melhor fazer a operação de squash no branch local antes de fazer push . Às vezes, já será empurrado - como você criaria uma solicitação de pull, afinal? Neste caso, você terá que forçar as mudanças no ramo remoto depois de fazer o esmagamento, já que seu histórico local e histórico de ramificação no repositório remoto são diferentes:

shell $ git push origin +my-branch-name

Faça o seu melhor para se certificar de que você é o único usando este ramo remoto neste ponto, ou você tornará sua vida mais difícil tendo incompatibilidade de histórico. Mas como a eliminação é geralmente feita como a operação final em um ramo antes de se livrar dela, geralmente não é uma preocupação tão grande.