Fluxo GIT descomplicado: Parte 2
Tags: git, github, programming
Published: 2022-08-16 22:09:00

E se você caiu aqui de paraquedas pode conferir a parte 1 deste artigo aqui: https://dev.to/magominimalista/fluxo-git-descomplicado-parte-1-pn8

---

Dando continuidade a nossos estudos vou falar um pouco mais sobre git para cobrir algumas partes que ficaram a desejar no post anterior. Vamos conversar um pouco mais sobre o assunto e no final eu lanço uma sessão de extras com alguns comandos não abordados. 

---

### Histórico da master

O histórico da master é muito importante, para mostrar o passo a passo dos eventos. Se tem outras pessoas trabalhando conosco no projeto temos que ter alguns cuidados quando mudamos o histórico de eventos do nosso git pela master. Eu poderia lançar um:

```
git push --force
```
Esse comando seria suficiente para ressincronizar os históricos no nosso servidor. Mas se alguém além de você estiver trabalhando na master a atualização feita por essa pessoa vai se perder. O ideal seria fazer um:

```
git push --force-with-lease
```
O próprio git vai avisar a você se tiver um novo commit para que você baixe a nova atualização antes de rodar novamente o comando.

---

### Deixando os commits úteis no seu histórico

Lembrando que tem commits como WIP alguma coisas que não são relevantes para o histórico, apenas apontam um status da aplicação que você estava salvando pra continuar depois etc.

!['Exibindo como está o histórico git'](https://i.ibb.co/Sf8vhMh/1cc94cd6-fde9-43d1-a51e-fb67b29f03be.jpg)

Vamos melhorar nossa histórico removendo os commits indesejados.

```
git rebase -i master
```

!['Exibindo como fica depois do comando'](https://i.ibb.co/vPJtQLq/fdabfb6d-91ca-4e34-aaf4-69ce645e4571.jpg)

Irá aparecer esse documento você digita `a` para editar e `esq` + `:wq` para salvar e sair. Para alterar e deixar uma mensagem diferente você pode trocar onde tem 'pick' por 'squash' ou se preferir não digitar mensagem alguma troque apenas por 'fixup'.

!['Como teria sido o squash'](https://i.ibb.co/SJ058Mt/804caa1e-6223-40d7-907c-8b23a2bbbba0.jpg)

!['Como teria sido o fixup'](https://i.ibb.co/2sDgJ8p/08894786-7e79-415b-b858-0ae08854db3f.jpg)

!['Após as alterações digita a mensgem'](https://i.ibb.co/6tsbwMv/09947142-df4a-4abd-9d76-c2380ea05101.jpg)

!['Finaliza'](https://i.ibb.co/0VBq14G/5b054518-2a2d-41da-8a63-1893dbb67038.jpg)

No github também tem essa opção quando as alterações realizada não possuem um impacto no histórico é possível incluir no fazer um merge no último commit sem precisar declarar na master caso não seja relevante.
!['Mostra como está ficando'](https://i.ibb.co/ftBvQ0h/37e3aef9-e1be-4d88-9d08-b3216e0ccb0d.jpg)

---

### Fluxo de trabalho

Criar branches com significados para trabalhar em uma parte separada do código e depois fazer o `merge` com `rebase` é muito melhor pois evita conflito no código quando se trabalha com outros. 

!['Fluxo de trabalho'](https://i.ibb.co/0h5jn80/Whats-App-Image-2022-08-16-at-11-45-49.jpg)

E para nos ajudar com essa tarefas sem precisar ter que ficar decorando os comandos temos uma ferramenta que roda em todos os sistemas operacionais que é o cheatshit do git flow. Você pode conferir a verão em português em: https://danielkummer.github.io/git-flow-cheatsheet/index.pt_BR.html

Separei algumas imagens, tamanho é a utilidade e facilidade desta ferramenta

!['Exemplo 1'](https://i.ibb.co/zskZcNj/Captura-de-tela-2022-08-16-115711.png)
!['Exemplo 2'](https://i.ibb.co/B31c4Qf/Captura-de-tela-2022-08-16-115746.png)

---

### Refazer o código

Usar o `git rebase` (rebobina seus commits e coloca no topo da sua árvore de commits) e `git reset --hard` (literalmente apaga seu último commit) e pode acontecer de você se perder um pouco, então o ideal mesmo é fazer assim:
```
git reflog
``` 
Para ver o que tem acontecido
```
git reset HEAD@[{1}
git restore .
```
Reseta para um estado anterior e depois restaura o código. Para ver as alterações novamente dá um `git reflog`.

---

### Evitando os WIP(s) aqueles passos que não é preciso entrar no nosso histórico de gitlog

Podemos usar o 
```
git stash
```
Para salva o WIP (Work in progress). Depois dar um
```
git stash list
```
Para visualizar a lista de stashs criada. Para contextualizar melhor, é uma boa prática anotar uma descrição para seus stashes, usando o
```
git stash save "mensagem"
```
Por padrão, `git stash pop` vai reaplicar o stash criado mais há pouco tempo: `stash@{0}`. Para visualizar as diferenças entre os stashs vamos usar:
```
git stash show -p
```
O menos -p é pra uma visualização completa. Para aplicar um stach
```
$ git stash pop stash@{2}
```
Esse 2 ai é o indice do stash. Para passar um stach para um novo branch
```
$ git stash branch add-stylesheet stash@{1} 
```
Para limpar um stach específico
```
git stash drop stash@{1} 
```
Ou para limpar todos os stachs
```
git stash clear
```

> Nota: Vou deixar um link para ter uma visão melhor do git stash: https://www.atlassian.com/br/git/tutorials/saving-changes/git-stash

---

### Extra

Estamos chegando ao final desse tutorial mas temos muita coisa ainda que deixamos passar. São elas:

- `git diff`- https://www.atlassian.com/br/git/tutorials/saving-changes/git-diff

- `git config` 
```
$ git config --global user.name "Fulano de Tal"
$ git config --global user.email fulanodetal@exemplo.br
```
- Criando tags:
```
git tag -a v1.1.0
git push origin v1.1.0
```
- Um brinde para você treinar o seu git e visualizar a forma como ele trabalha sem precisar criar um repositório:
https://git-school.github.io/visualizing-git/#free

Aproveitei para testar a ferramenta, um print com os comandos que usei, preferi iniciar pela opção Chery Pick.

!['Exemplo'](https://i.ibb.co/5vFKpH1/8992c740-4bdc-4874-8146-8ccc4f5fb71e.jpg)

Gente eu só tenho a agradecer por ter terminado esse estudo, acho que o git é muito mais que isso, tem coisas aqui que não foram abordados ainda, mas esse conteúdo já te permite trabalhar de forma profissional com ele.

Espero que tenham gostado. 

Att,

#### Sobre o autor:
- Philipe Cairon (Mago Minimalista)
- Full Stack Web developer

Me encontre no Linktree: [!['Linktree'](https://img.shields.io/badge/linktree-39E09B?style=for-the-badge&logo=linktree&logoColor=white)](https://linktr.ee/magominimalista)