DEV Community

Dev Maiqui 🇧🇷
Dev Maiqui 🇧🇷

Posted on • Edited on

2 2

🔶 Meu estudo de Git #2 - Branch's (Merge, Squash e Rebase)

Estou Registrando o meu estudo de git.

Para este segundo post, utilizei o seguinte vídeo:

Git #2 - Trabalhando com Branch's e diferenciando Merge, Squash e Rebase

Branch (Ramificação)

Nunca mais desenvolver na master. Sempre criar uma branch nova e depois fazer o merge.
Image description

A branch criada será uma cópia da master.

A Jornada do Autodidata em Inglês

Para criar uma nova branch, por exemplo chamada dev, podemos usar o comando abaixo:

$ git branch dev
Enter fullscreen mode Exit fullscreen mode

Podemos olhar as branchs existentes com o comando:

$ git branch
Enter fullscreen mode Exit fullscreen mode

Para remover a branch dev, use o comando:

$ git branch -d dev
Enter fullscreen mode Exit fullscreen mode

Navegando e criando branchs com o Checkout

O nosso projeto está assim. Estamos na master com um commit já efetuado.
Image description

Para navegar entre as branchs podemos usar o checkout. Mas neste caso não existe ainda uma branch chamada feature/client.

$ git checkout feature/client
error: pathspec 'feature/client' did not match any file(s) known to git
Enter fullscreen mode Exit fullscreen mode

Então podemos usar o -b para criar a branch. Além de criar, vai entrar na branch feature/client.

$ git checkout -b feature/client
Switched to a new branch 'feature/client'
Enter fullscreen mode Exit fullscreen mode

Image description

Criando e fazendo o commit do arquivo client:
Image description

Ao trocar para a branch master, podemos ver que não existe mais o arquivo client, criado na branch feature/client.
Image description

Se trocarmos para a branch feature/client, podemos ver que o arquivo client ainda existe.
Image description

Fazendo a junção das branchs com merge

Primeiro retornamos para a branch master, pois queremos mesclar a branch feature/client dentro da master.

Depois usamos o comando merge para juntar.

Image description

Vamos fazer esse cenário:
Image description

Vamos desfazer o que fizemos excluindo a pasta do git.

$ rm -rf .git
Enter fullscreen mode Exit fullscreen mode

E, podemos apagar os arquivos criados.

Formação TS

Após, podemos iniciar o git novamente.

$ git init
Enter fullscreen mode Exit fullscreen mode

E criar dois arquivos:

Image description

Image description

$ git log --oneline
Enter fullscreen mode Exit fullscreen mode
4abee71 (HEAD -> master) m2
7710d41 m1
(END)
Enter fullscreen mode Exit fullscreen mode

Criando a branch feature/x e depois criando o arquivo f1:

Image description

$ git checkout -b feature/x
Enter fullscreen mode Exit fullscreen mode

Image description

$ git log --oneline
Enter fullscreen mode Exit fullscreen mode
26bdac8 (HEAD -> feature/x) f1
4abee71 (master) m2
7710d41 m1
(END)
Enter fullscreen mode Exit fullscreen mode

Conforme a linha do tempo, agora vamos criar o arquivo m3 na master:
Image description

Image description

Conforme a linha do tempo, agora vamos criar o arquivo f2 na feature/x:
Image description

Image description

Conforme a linha do tempo, agora vamos criar o arquivo m4 na master:
Image description

Image description

Conforme a linha do tempo, agora vamos criar o arquivo f3 na feature/x:
Image description

Image description

Como vamos mesclar agora????

Vamos mesclar a feature/x na master:

$ git checkout master  
Enter fullscreen mode Exit fullscreen mode
$ git merge feature/x 
Enter fullscreen mode Exit fullscreen mode

Após o comando acima, como as duas branchs possuem alterações, o merge gera um commit adicional, que vai marcar a mescla das duas branchs.
Image description

Podemos editar essa mensagem, ou apenas sair com o comando :wq!

e agora o merge foi feito:
Image description

$ git log --oneline
Enter fullscreen mode Exit fullscreen mode

Image description

Observe a ordem dos commits. Foi colocado exatamente na posição de acordo com o tempo que eles acontecerão.

Image description

Formação TS

Fazendo a junção das branchs com squash

Desfazendo o merge anterior:

$ git reset HEAD~1 --hard
Enter fullscreen mode Exit fullscreen mode

O --hard é usado porque queremos descartar os arquivos (que foram adicionados no merge) da branch master.

Image description

Agora vamos fazer o merge com a opção --squash

Image description

$ git log --oneline
Enter fullscreen mode Exit fullscreen mode

Image description

Image description

Fazendo a junção das branchs com rebase

Desfazendo novamente o merge anterior:

$ git reset HEAD~1 --hard
Enter fullscreen mode Exit fullscreen mode

Agora voltamos para esse cenário:

Image description

Agora vamos usar o rebase:

$ git rebase feature/x
Enter fullscreen mode Exit fullscreen mode

O rebase não gera um commit:

Image description

A feature/x foi introduzida entre os commits da master:
Image description

!!!!!!! CUIDADO ao usar o rebase dessa maneira !!!!!!!!

O rebase é indicado se eu fosse mesclar ao contrário, a master dentro da feature/x, pra não gerar vários commits de merge.

Recuperando versões dentro dos commits com checkout

Alterando o arquivo f1:

Image description

Alterando o arquivo f1 pela segunda vez:

Image description

Escolhendo a versão do f1 que queremos recuperar:

$ git log --oneline
Enter fullscreen mode Exit fullscreen mode

Copiando o código:
Image description

Primeiro a hash e depois o nome do arquivo:

$ git checkout 39a89ef f1 
Enter fullscreen mode Exit fullscreen mode

Image description

$ git log --oneline
Enter fullscreen mode Exit fullscreen mode

Image description

Era isso!

Para mais detalhes ver o vídeo:

Git #2 - Trabalhando com Branch's e diferenciando Merge, Squash e Rebase

Formação TS

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay