Padrões de Commits (Commit Patterns)
Tags: git, beginners, programming, webdev
Published: 2022-03-06 01:24:50

A utilização do git no dia a dia dos Devs é essencial, seja para desenvolver projetos pessoais ou empresariais, todo código que será desenvolvido ou consumido por mais de uma pessoa, eventualmente será utilizado o git.

Portanto, é de muita importância que todos os envolvidos no projeto entendam as mudanças ocorridas e quais foram os contextos de alteração do código. Para isso o `git commit` precisa ser utilizado apropriadamente.

Commits mal comentados podem ser muito danosos ao projeto, uma vez que não conseguimos entender a natureza das mudanças ocorridas e o contexto que se aplica, diante disso existe o [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/).

---

## O que é o Conventional Commits ?

O Conventional Commits é uma convenção simples de mensagens de commit, que segue um conjunto de regras e que ajuda os projetos a terem um histórico de commit explícito e bem estruturado.

O **Conventional Commits** deixara a linha do tempo de um projeto mais estruturada e fácil de entender. Quando documentados utilizando o **Conventional Commits** nos mostram quem alterou, quando, em qual contexto e qual tipo de alteração foi feita.

---

## Como utilizar ?

A mensagem do commit deve ser estruturada da seguinte forma:

```Bash
:emoji: <tipo>(escopo): <descrição>
```

Os commits terão um emoji para dar uma identificação visual a mensagem, um tipo, um escopo para dar contexto, e uma descrição onde poderá colocar os detalhes do commit.

**OBS:** O emoji e o escopo são opcionais, porém é recomendado que siga o escopo a cima.

---

## Tipos de Commits

O commit possui os elementos estruturais abaixo (tipos), que informam a intenção do seu commit ao utilizador(a) de seu código.

- `fix` - Commits do tipo fix indicam que seu trecho de código commitado está solucionando um problema (bug fix), (se relaciona com o PATCH do versionamento semântico).

- `feat`- Commits do tipo feat indicam que seu trecho de código está incluindo um novo recurso (se relaciona com o MINOR do versionamento semântico).

- `docs` - Commits do tipo docs indicam que houveram mudanças na documentação, como por exemplo no Readme do seu repositório. (Não inclui alterações em código).

- `style` - Commits do tipo style indicam que houveram alterações referentes a formatações de código, semicolons, trailing spaces, lint... (Não inclui alterações em código).

- `refactor` - Commits do tipo refactor referem-se a mudanças devido a refatorações que não alterem sua funcionalidade, como por exemplo, uma alteração no formato como é processada determinada parte da tela, mas que manteve a mesma funcionalidade, ou melhorias de performance devido a um code review.

- `build` - Commits do tipo build são utilizados quando são realizadas modificações em arquivos de build e dependências.

- `test` - Commits do tipo test são utilizados quando são realizadas alterações em testes, seja criando, alterando ou excluindo testes unitários. (Não inclui alterações em código)

- `chore` - Commits do tipo chore indicam atualizações de tarefas de build, configurações de administrador, pacotes... como por exemplo adicionar um pacote no gitignore. (Não inclui alterações em código)

---

## Emojis

<table>
  <thead>
    <tr>
      <th>Tipo de commit</th>
      <th>Emojis</th>
    </tr>
  </thead>
 <tbody>
    <tr>
      <td>Commit inicial</td>
      <td> 🎉 <code>:tada:</code>   </td>
    </tr>
    <tr>
      <td> Tag de versão  </td>
      <td> 🔖 <code>:bookmark:</code>   </td>
    </tr>
    <tr>
      <td>  Novo recurso   </td>
      <td> ✨ <code>:sparkles:</code>   </td>
    </tr>
    <tr>
      <td>  Lista de ideias (tasks)    </td>
      <td> 🔜 <code> :soon: </code>   </td>
    </tr>
    <tr>
      <td>  Bugfix  </td>
      <td> 🐛 <code>:bug:</code>   </td>
    </tr>
    <tr>
      <td>  Documentação  </td>
      <td> 📚 <code>:books:</code>   </td>
    </tr>
    <tr>
      <td>  Testes  </td>
      <td> 🧪 <code>:test_tube: </code>   </td>
    </tr>
    <tr>
      <td>Adicionando um teste</td>
      <td> ✅ <code> :white_check_mark: </code>   </td>
    </tr>
    <tr>
      <td> Teste de aprovação </td>
      <td> ✔️ <code> :heavy_check_mark: </code>   </td>
    </tr>
    <tr>
      <td>  Acessibilidade    </td>
      <td> ♿ <code> :wheelchair: </code>   </td>
    </tr>
    <tr>
      <td>  Texto     </td>
      <td> 📝 <code> :pencil: </code>   </td>
    </tr>
    <tr>
      <td>  Package.json em JS      </td>
      <td> 📦 <code> :package: </code>   </td>
    </tr>
    <tr>
      <td>  Em progresso        </td>
      <td> 🚧 <code> :construction: </code>   </td>
    </tr>
    <tr>
      <td>   Arquivos de configuração        </td>
      <td> 🔧 <code> :wrench: </code>   </td>
    </tr>
    <tr>
      <td>   Removendo uma dependência        </td>
      <td> ➖ <code> :heavy_minus_sign: </code>   </td>
    </tr>
    <tr>
      <td>   Adicionando uma dependência        </td>
      <td> ➕ <code> :heavy_plus_sign: </code>   </td>
    </tr>
    <tr>
      <td>   Revertendo mudanças         </td>
      <td> 💥 <code> :boom: </code>   </td>
    </tr>
    <tr>
      <td>   Alterações de revisão de código        </td>
      <td> 👌 <code> :ok_hand: </code>   </td>
    </tr>
   <tr>
      <td>   Refatoração        </td>
      <td> ♻️ <code> :recycle: </code>   </td>
   </tr>
    <tr>
      <td>   Mover/Renomear        </td>
      <td> 🚚 <code> :truck: </code>   </td>
    </tr>
  </tbody>
</table>

---

## Exemplos de utilização
![exemplo de commits](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/duvuw939jk75wvjx34r5.png)

Com os 4 commits a cima teremos o seguinte histórico:

![histórico de commits](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3wagk8vwjyzp48l2pi0n.png)

---

## Atenção

Algumas partes deste artigo como por exemplo o uso de emojis é uma particularidade minha não necessariamente é o mais certo a se fazer, muitas empresas usam padrões de commits diferentes. O importante é se atentar ao escrever a mensagem de um commit, para que outros entendam e fique bem claro oque foi alterado ou criado.

---

## Conclusão 
Escrevi este artigo no intuito de ajudar os Devs iniciantes como eu, e também registrar mais um dos meus aprendizados nesta longa caminhada de estudos.

**Obrigado a todos que leram até aqui!**

---

## Referencias
O uso dos emojis foi uma ideia que tirei deste repositório [aqui](https://github.com/iuricode/padroes-de-commits/blob/main/README.md).