DEV Community

Maiqui Tomé 🇧🇷
Maiqui Tomé 🇧🇷

Posted on • Updated on

🔶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.

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.

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

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

Top comments (0)