Technology

Development

Como Fazer um Git Squash para Melhorar seu Histórico de Commits

13 de set. de 2020

Antes de começarmos este tutorial é de extrema importância deixar claro que utilizar o comando git rebase deve ser feito com muito cuidado. Ao utiliza-lo estaremos reescrevendo o histórico de commits, o que pode gerar conflitos ao usá-lo em repositórios públicos. Com isso, gerando problemas que você irá querer evitar. Caso tenha algum interesse de entender um pouco mais a fundo sobre git rebase basta acessar este link para mais informações.

Nosso objetivo por meio desse post é solucionar um problema que pode acontecer várias vezes quando se está desenvolvendo uma nova funcionalidade. Eu mesmo já passei por situações ao abrir um pull request percebi que continha mais de 20 commits no histórico. Cada commit contendo modificações simples, mas que ao todo podem poluir o histórico. Para solucionar isso podemos realizar um squash dos nossos commits, para alterar o histórico e assim evitar um histórico longo. Lembrando do que foi comentado acima, só indico essa prática caso a branch em que esteja trabalhando seja apenas sua e não compartilhada com outros desenvolvedores.

O squash irá servir para mudarmos o histórico de nossos commits e agrupá-los de uma nova maneira, ou seja, no final podemos ter feito 20 commits, mas aplicando o essa prática, poderemos reduzir o número para 10, por exemplo.

Vamos começar criando uma nova pasta em qualquer lugar de sua preferência. Eu irei utilizar o seguinte comando para criar uma nova pasta pelo meu terminal:

mkdir git_rebase_tutorial

Uma vez criado, irei entrar na pasta pelo terminal e inicializar o git, com o comando git init. Caso você rode o comando git log não irá ver nenhum commit ainda. Para isso, vamos criar simples arquivos de texto e adicionar um commit para aumentarmos o nosso histórico. Basta rodar o comando:

echo "Rebase Tutorial" > myTextA.txt

Utilizando este comando, você irá criar um novo arquivo de texto com o nome myTextA.text, caso você queria abrir esse arquivo verá que seu conteúdo contém a frase Rebase Tutorial. Agora podemos adicionar um commit em nosso histórico, basta utilizar git add ., para adicionar todos os arquivos para a fase staged . Agora basta nomear seu commit utilizando git commit -m "Commit arquivo A". Pronto agora usando git log , você verá o primeiro commit em nosso histórico, como na imagem a seguir:

Pronto, agora vamos repetir essa passo de criar arquivos de texto até termos arquivos nomeados com a letra E, não se esquecer de adicionar um novo commit para cada arquivo criado.

Agora se você utilizar o comando git log --oneline você vera o histórico de commits em uma minha, o que pode facilitar para um projeto com vários históricos de commits. Com isso você verá o histórico da seguinte maneira:

Agora podemos modificar nosso histórico para mostrar apenas dois commits, o Commit arquivo A e um commit para as outras modificações. O primeiro passo é rodar o seguinte comando: git rebase -i HEAD~4 . A flag -ié uma abreviação para interactive, que também pode ser usada nesse comando usando git rebase --interactive HEAD~4. Essa opção irá nos proporcionar uma interação com a lista de commits, escolhendo assim qual ação eu irei realizar. O outro argumento utilizado foi HEAD~4 , o argumento HEAD é referente à qual commit é o mais atual, e ~4 irá dizer até qual commit iremos interagir. Nesse caso como escolhemos quatro, iremos até o commit do arquivo B. Você deverá observar a seguinte output:

Iremos observar uma lista de opções que podemos fazer, mas iremos focar em duas squash e fixup . Como descrito na imagem, ambas dessas opções irão resultar no comportamento que esperamos. Sendo que a diferença entre elas é que a opção squash irá deixar um histórico de que está ação foi realizada. Ao utilizar o comando git rebase -i abrimos o vim do terminal. Entrar em detalhes sobre o que é vmi foge do escopo deste post, mas caso tenha curiosidade basta acessar este link. Para interagir com terminal basta apertar o botão i.

Agora basta substituir os commits C, D e E , de pick para f. Como visto na imagem seguinte:

Ainda podemos fazer uma última mudança para ficar mais claro que uma mudança foi realizada. No commit do arquivo B, podemos substituir pickpara r que será responsável por editar a mensagem do commit. No final teremos algo da seguinte forma:

Para salvar basta apertar a tecla ESC e em seguida o comando :wq para confirmar suas alterações e sair do modo interativo. Com isso, você será levado para uma nova interação referente ao commit que alteramos a mensagem. Basta realizar os passos anteriores e alterar a mensagem para a mesma que utilizamos anteriormente. Agora utilizando o comando: git log --oneline. Agora iremos ver o seguinte output no histórico:

Com esses simples passos sabemos como é possível melhorar nosso histórico de commits antes de abrir um PR ou até mesmo para outra finalidade. Porém, nunca se esquecer de utilizar esses comandos em uma branch que só você esteja trabalhando.

criando futuros possíveis

Contate-nos

hello@novatics.com.br

Brasília

SEPN 516, Bloco E, Sala 301

Ed. Carlton Center, Brasília, Brasil

70770-520

São Paulo

Av. Paulista 1374, Bela Vista

São Paulo, Brasil

01310-100

Califórnia

1020 B St, San Raphael

Califórnia, USA

94901

criando futuros possíveis

Contate-nos

hello@novatics.com.br

Brasília

SEPN 516, Bloco E, Sala 301

Ed. Carlton Center, Brasília, Brasil

70770-520

São Paulo

Av. Paulista 1374, Bela Vista

São Paulo, Brasil

01310-100

Califórnia

1020 B St, San Raphael

Califórnia, USA

94901

criando futuros possíveis

Contate-nos

hello@novatics.com.br

Brasília

SEPN 516, Bloco E, Sala 301

Ed. Carlton Center, Brasília, Brasil

70770-520

São Paulo

Av. Paulista 1374, Bela Vista

São Paulo, Brasil

01310-100

Califórnia

1020 B St, San Raphael

Califórnia, USA

94901

Portugues