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

92 lines
5.6 KiB
Markdown

---
title: Git Squash
localeTitle: 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](https://guide.freecodecamp.org/git/git-rebase) 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](https://guide.freecodecamp.org/git/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:
```shell
$ 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:
```shell
$ git rebase -i HEAD~3
```
Isso abrirá um editor com algo como seguir:
```shell
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:
```shell
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
```shell
# 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.