Git - Sincronização com Rebasing
Git - Sincronização com Rebasing
É comum no dia a dia do desenvolvedor precisar lidar com o desenvolvimentos de diversos tamanhos. Alguns são pequenos e levam de poucas horas, outros acabam sendo um pouco maiores e exigem alguns dias de desenvolvimento.
Em ambos os casos, garantir que o código fonte esteja sincronizado é fundamental pois ajuda a evitar conflitos futuros ao submetermos o código para o branch principal. Isso se torna ainda mais importante quando trabalhamos em projetos em que muitas pessoas e times também atuam sobre o mesmo código fonte. O Git possui duas maneiras que permitem isso: o merge; e o rebase. Para ambos, existem muitos materiais que auxiliam na compreensão de qual estratégia é a melhor a ser utilizada, Git Branching - Rebasing é um bom exemplo. Nesse post, escrevo um pouco sobre o rebase e como utilizá-lo para manter um branch atualizado.
Simulando o rebase
Inclusão de um arquivo texto simples
Para simular o rebase, vamos criar um projeto simples com alguns arquivos .txt
. Nesses arquivos serão incluídos alguns textos aleatórios, por exemplo, nome de cores, carros e cidades. A inclusão e atualização desses arquivos serão realizados com ramificações geradas a partir da árvore principal (main
).
Nesse exemplo estou utilizando um repositório remoto no Github, então é necessário que ele também esteja criado e pronto para receber as alterações. Com o repositório remoto pronto, o próximo passo é criar um novo repositório local e referenciar para o remoto, como demonstrado nos comandos abaixo.
$ git init
$ touch .gitignore
$ git add .gitignore
$ git commit -m "first commit"
$ git branch -M main
$ git remote add origin https://github.com/augustocolombelli/dev-blog-git-rebase.git
$ git push -u origin main
Em seguida vamos criar um novo branch para incluirmos uma lista simples de cores. O nome do arquivo é colors.txt
e possui o seguinte conteúdo:
1 - Blue
2 - Green
3 - Red
Os comandos para criar o branch, adicionar o arquivo, fazer commit e o push para o branch remoto são:
$ git checkout -b "feature-1-creating-colors-file"
$ git add .
$ git commit -m "Add colors file"
$ git push origin "feature-1-creating-colors-file"
Vamos agora fazer o merge dessa branch com o main
. Como estamos apenas praticando, em nosso exemplo não vamos nos preocupar em criar um pull request. Todavia, em ambiente de produção, é recomendado que antes de realizar o merge o código seja revisado por outro desenvolvedor.
$ git checkout main
$ git merge feature-1-creating-colors-file
$ git push origin main
Nesse momento o repositório tem uma única alteração feita a partir do branch feature-1-creating-colors-file
.
Criação do branch para simular o rebase
Afim de simular o rebase, vamos criar um novo branch com o nome feature-2-rebase-test-creating-cars-file
. Nele incluiremos um novo arquivo de texto cars.txt
com uma lista aleatório de nome de carros, como demonstrado abaixo.
1 - Gol
2 - Mustang
3 - Jaguar
Os comandos para criar uma nova ramificação a partir do branch principal, fazer o commit do arquivo e enviar para o repositório remoto são:
$ git checkout -b "feature-2-rebase-test-creating-cars-file"
$ git add .
$ git commit -m "Add cars file"
$ git push origin "feature-2-rebase-test-creating-cars-file"
Com isso, o repositório passará a ficar no seguinte estado:

Adicionaremos então os carros Amarok, Porsche e Fox, separando commits diferentes conforme demonstrado abaixo.
Inclusão do carro Amarok no arquivo cars.txt
.
4 - Amarok
Comandos para fazer o commit:
$ git add .
$ git commit -m "Add Amarok"
Após fazer a inclusão dos 3 carros no arquivo em commits diferentes, o próximo passo é fazer o push.
$ git push origin "feature-2-rebase-test-creating-cars-file"
Concluído, a situação do repositório ficará conforme demonstrado na imagem abaixo.
Atualização do main
com novos commits
Para visualizar os benefícios do rebase, criaremos duas novas ramificações a partir da main
. Em uma delas adicionaremos mais cores e na outra incluiremos um novo arquivo. Os nomes delas são: feature-3-add-new-colors
e feature-4-add-cities-file
. Os comandos para fazer isso são os mesmos já apresentados anteriormente. Feito isso, o branch feature-2-rebase-test-creating-cars-file
utilizado para praticar o rebase começa a ficar desatualizado, como demonstrado abaixo.
Esse é um bom momento para fazer o rebase. Após realizá-lo, forçaremos o push com as alteração.
$ git checkout main
$ git pull
$ git checkout feature-2-rebase-test-creating-cars-file
$ git rebase origin/main
$ git push -f origin feature-2-rebase-test-creating-cars-file
Os commits passam agora ficar acima de feature-3-add-new-colors
e feature-4-add-cities-file
, resultando também em um histórico mais limpo. Concluindo, faremos o merge com o main
.
git checkout main
git merge feature-2-rebase-test-creating-cars-file
git push origin main
Na imagem abaixo é possível visualizar como se encontra o nosso repositório. Como pode ser visto, o branch feature-2-rebase-test-creating-cars-file
tinha sido o segundo a ser criado, com o rebase, os seus commits ficaram registrados posteriormente aos branchs feature-3-add-new-colors
e feature-4-add-cities-file
.
O respositório com o exemplo está disponível em https://github.com/augustocolombelli/dev-blog-git-rebase.