🔶 Meu estudo de Git #2 - Branch's (Merge, Squash e Rebase)
Tags: git, braziliandevs
Published: 2022-03-14 01:34:18

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](https://www.youtube.com/watch?v=8znk5eDbVGA&list=PLDqnSpzNKDvkfF_ZMfukmOG3MtGKfXlfJ&index=2)

* [branch](#branch)
* [checkout](#checkout)
* [merge](#merge)
 - [squash](#squash)
* [rebase](#rebase)
* [recuperando versões dentro dos commits com checkout](#checkout-outra-utilidade)


#### Branch (Ramificação) <a name="branch"></a>


Nunca mais desenvolver na master. Sempre criar uma branch nova e depois fazer o merge.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4f0vavfo3iairjgikyj1.png)

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

[![A Jornada do Autodidata em Inglês](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pkoqkmh9hic17tnddjf6.png)](https://go.hotmart.com/R93865620U)

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

Podemos olhar as branchs existentes com o comando:
```bash
$ git branch
```

Para remover a branch `dev`, use o comando:
```bash
$ git branch -d dev
```


#### Navegando e criando branchs com o Checkout <a name="checkout"></a>



O nosso projeto está assim. Estamos na master com um commit já efetuado.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/580gvfjugoos79b4h0nd.png)

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

```bash
$ git checkout feature/client
error: pathspec 'feature/client' did not match any file(s) known to git
```

Então podemos usar o `-b` para criar a branch. Além de criar,  vai entrar na branch `feature/client`.
```bash
$ git checkout -b feature/client
Switched to a new branch 'feature/client'
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j2kerpso377z1936hdkw.png)

Criando e fazendo o commit do arquivo client:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ur5dvk4gnru88exsuv7.png)
 
Ao trocar para a branch master, podemos ver que não existe mais o arquivo client, criado na branch `feature/client`. 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/978pqv7z098u6n6yc8i0.png)
 
Se trocarmos para a branch `feature/client`, podemos ver que o arquivo `client` ainda existe.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bs9dcu1ecf4urq43jkjf.png)
 
 

#### Fazendo a junção das branchs com merge <a name="merge"></a>



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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2udn1xoyycfj2if6hcke.png)


Vamos fazer esse cenário:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v5r0hfkssz3vwgwjlshj.png)
 

Vamos desfazer o que fizemos excluindo a pasta do git.

```bash
$ rm -rf .git
```

E, podemos apagar os arquivos criados. 

[![Formação TS](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/isxopdurvofcx18iptvb.png)](https://go.hotmart.com/H93763859E)

Após, podemos iniciar o git novamente.

```bash
$ git init
```

E criar dois arquivos:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gkf2jfldyb83gg53gnm0.png)
 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1biap0jafhpka0bsqgjq.png)

```bash
$ git log --oneline
``` 
```bash
4abee71 (HEAD -> master) m2
7710d41 m1
(END)
```

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1h3n0c55ftq6ta6jx41m.png) 

```bash
$ git checkout -b feature/x
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gm3vpyu9wasl0a3tcv11.png)


```bash
$ git log --oneline
```
```bash
26bdac8 (HEAD -> feature/x) f1
4abee71 (master) m2
7710d41 m1
(END)
```

Conforme a linha do tempo, agora vamos criar o arquivo `m3` na `master`:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lbrcx3d7ytdp6hi7mxqu.png)
 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/365wbdxmmc4c7je3wb7n.png)

Conforme a linha do tempo, agora vamos criar o arquivo `f2` na `feature/x`:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r5lgrgtq6euvmktuex4d.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ynnr7esded3yzz26h2s7.png)
  
Conforme a linha do tempo, agora vamos criar o arquivo `m4` na `master`:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3jmvaqbo20x968sh1iei.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bbrumnrh39y2zunk7eov.png)
  
Conforme a linha do tempo, agora vamos criar o arquivo `f3` na `feature/x`:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cnyd554fwurzikkb14ri.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d50683ase3jhqlg1aiac.png)
 
 
#### Como vamos mesclar agora????

Vamos mesclar a `feature/x` na `master`:

```bash
$ git checkout master  
```

```bash
$ git merge feature/x 
```

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6m38d8furt8hmv0m6def.png)

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

e agora o merge foi feito:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bwkx698xt4yylf7ubgy4.png)

```bash
$ git log --oneline
``` 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qhd1fj522sylr2n9bsxu.png)

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v5r0hfkssz3vwgwjlshj.png)
 

[![Formação TS](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/72gnny6fjwnmku1x3rr4.png)](https://go.hotmart.com/H93763859E)

#### Fazendo a junção das branchs com squash <a name="squash"></a>




Desfazendo o merge anterior:
```bash
$ git reset HEAD~1 --hard
```

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a8aj5i5kkfmdgbrz9qds.png)
 
Agora vamos fazer o merge com a opção `--squash`

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mizefz6l7rsv4r6ndykl.png)

```bash
$ git log --oneline
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/otd8z0vfdjcx7h82nr36.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p8emdgi1bqeqnyxfi0j4.png)
  
 


#### Fazendo a junção das branchs com rebase <a name="rebase"></a>



Desfazendo novamente o merge anterior:
```bash
$ git reset HEAD~1 --hard
```

Agora voltamos para esse cenário:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zbj3iyoinsxoibfkswpw.png)


Agora vamos usar o `rebase`:

```branch
$ git rebase feature/x
```

O `rebase` não gera um commit:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sp7r4sm9ofe35cdlonjz.png)

A `feature/x` foi introduzida entre os commits da `master`:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sbxp00adyiinsbn88ky5.png)

!!!!!!! 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 <a name="checkout-outra-utilidade"></a>


Alterando o arquivo `f1`:

 ![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dut5vpf542ij0qq83y6a.png)


Alterando o arquivo `f1` pela segunda vez:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xvw6uyn8u0mrctiq5cmc.png)


Escolhendo a versão do `f1` que queremos recuperar:

```bash
$ git log --oneline
``` 

Copiando o código:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x734xh66oheze0hohkcz.png)

Primeiro a hash e depois o nome do arquivo:
```bash
$ git checkout 39a89ef f1 
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/53t4p9j6tnang9w5h9w2.png)

 
```bash
$ git log --oneline
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ypmrx7cufulj5c30zhpl.png)

 
Era isso!

Para mais detalhes ver o vídeo:

[Git #2 - Trabalhando com Branch's e diferenciando Merge, Squash e Rebase](https://www.youtube.com/watch?v=8znk5eDbVGA&list=PLDqnSpzNKDvkfF_ZMfukmOG3MtGKfXlfJ&index=2)

[![Formação TS](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/72gnny6fjwnmku1x3rr4.png)](https://go.hotmart.com/H93763859E)