Banner padrões de commit
Git

Automatizando Mensagens de Commit com Commitizen, Husky e Commitlint

Simplifique e padronize seus commits com Commitizen, Husky e Commitlint



Se você trabalha com Git, já sabe que uma mensagem de commit clara e organizada faz toda a diferença na hora de entender o histórico de um projeto. Mas, vamos ser sinceros: nem sempre temos o cuidado de escrever mensagens padronizadas. É aí que entra o Commitizen, uma ferramenta que pode automatizar e facilitar o processo de criação de commits semânticos.

Neste post, vou mostrar como o Commitizen pode te ajudar a padronizar seus commits, como instalá-lo, e também apresentar ferramentas opcionais como Husky e Commitlint que, embora não sejam essenciais, podem melhorar ainda mais o fluxo de trabalho do seu time.


Sumário

  1. O que é o Commitizen?
  2. Como o Commitizen pode te ajudar?
  3. Instalando o Commitizen
  4. Como usar o Commitizen
  5. Entendendo as Perguntas do Commitizen
  6. Exemplo de Commit Gerado
  7. Ferramentas Opcionais: Husky e Commitlint
  8. Husky e Commitlint: Eles são necessários?
  9. Quando usar Husky e Commitlint?
  10. Conclusão

O que é o Commitizen?

O Commitizen é uma ferramenta que te ajuda a criar mensagens de commit semânticas de forma padronizada e simples. Com ele, ao invés de você escrever a mensagem de commit manualmente, ele te guia por um processo interativo, onde você escolhe o tipo de mudança, o escopo (qual parte do projeto foi alterada), e escreve uma descrição adequada. Isso não só facilita a organização do histórico de commits, mas também melhora a clareza, especialmente em projetos colaborativos.

Como o Commitizen pode te ajudar?

  • Consistência nas mensagens de commit: Ao usar o Commitizen, suas mensagens de commit seguem sempre o mesmo padrão, o que torna mais fácil para todos os desenvolvedores entenderem o que foi alterado.
  • Facilidade na escrita: Ao invés de pensar "qual tipo de commit devo usar?", o Commitizen oferece opções claras, como feat, fix, chore, etc. Isso facilita o processo e evita erros de formatação.
  • Histórico organizado: Quando todos seguem o mesmo padrão, o histórico de commits se torna muito mais legível, especialmente em equipes grandes ou projetos de longo prazo.

Instalando o Commitizen

O Commitizen pode ser instalado tanto globalmente quanto localmente no projeto. Aqui está como fazer:

Instalação Global

Se você quer usar o Commitizen em qualquer projeto sem precisar instalar a cada vez, faça uma instalação global:

npm install -g commitizen

Após a instalação, você poderá rodar o comando git cz em qualquer projeto para iniciar o processo de commit interativo.

Instalação Local

Para instalar o Commitizen localmente em um projeto específico, adicione-o como dependência de desenvolvimento:

npm install --save-dev commitizen

Agora, você pode adicionar o seguinte no seu package.json para configurar o Commitizen no projeto:

{
  "config": {
    "commitizen": {
      "path": "cz-conventional-changelog"
    }
  }
}

Depois, você pode rodar o comando npx cz para iniciar o Commitizen localmente.


Como usar o Commitizen

Depois de instalado (globalmente ou localmente), ao invés de rodar git commit, você usa o comando git cz (ou npx cz se instalado localmente). Isso abre um assistente interativo onde você seleciona o tipo de mudança (como feat, fix, etc.), define o escopo (a parte do projeto que foi alterada) e escreve a descrição da mudança.

Isso te ajuda a manter a consistência sem ter que lembrar das convenções a cada commit.


Entendendo as Perguntas do Commitizen

Quando você executa o comando git cz, o Commitizen te faz algumas perguntas para guiar a criação da mensagem de commit. Veja quais são essas perguntas e para que elas servem:

  1. Tipo de mudança (Select the type of change that you're committing):

    • Aqui, você escolhe o tipo de mudança que está fazendo no código, como:
      • feat: Quando você está adicionando uma nova funcionalidade.
      • fix: Para corrigir um bug.
      • chore: Para tarefas de manutenção, como atualização de dependências.

    Exemplo:

    feat
    
  2. Escopo (What is the scope of this change):

    • O escopo é opcional e serve para indicar qual parte do projeto foi modificada. Pode ser um arquivo, módulo, componente, ou qualquer outra divisão do seu código. Se não quiser especificar, é só pressionar Enter para pular.

    Exemplo:

    login-page
    
  3. Mensagem curta (Write a short, imperative tense description of the change):

    • Aqui você deve escrever uma breve descrição do que foi alterado, de forma imperativa (como uma instrução). Esse é o resumo da mudança e deve ser claro e direto.

    Exemplo:

    adiciona validação ao formulário de login
    
  4. Mensagem longa (Provide a longer description of the change):

    • Essa parte é opcional e serve para você escrever uma descrição mais detalhada da mudança. Se não precisar, pode apertar Enter para pular.

    Exemplo:

    Agora o formulário de login valida os campos de email e senha, verificando se o formato do email é válido e se a senha tem ao menos 8 caracteres.
    
  5. Breaking changes (Are there any breaking changes?):

    • Se a sua alteração introduz mudanças que quebram a compatibilidade com versões anteriores, você indica isso aqui. Caso contrário, aperte Enter.

    Exemplo:

    (Nenhuma alteração aqui, aperta Enter)
    
  6. Issues fechadas (Does this change affect any open issues?):

    • Se sua alteração está relacionada a uma issue aberta no repositório, você pode mencionar o número da issue aqui. Caso contrário, aperte Enter.

    Exemplo:

    Closes #123
    

Exemplo de Commit Gerado:

Depois de preencher todas as perguntas, o commit final gerado seria algo assim:

feat(login-page): adiciona validação ao formulário de login

Agora o formulário de login valida os campos de email e senha, verificando se o formato do email é válido e se a senha tem ao menos 8 caracteres.

Closes #123

Ferramentas Opcionais: Husky e Commitlint

Agora, se você quiser levar o controle de qualidade um passo além, pode integrar o Husky e o Commitlint ao seu fluxo de trabalho. Vamos ver o que cada um faz.

Husky

O Husky permite configurar Git hooks, que são comandos executados automaticamente antes de certas ações, como antes de fazer um commit ou um push. Isso pode ser útil para rodar verificações automáticas, como testes ou linters, e garantir que você só comite ou envie código de qualidade.

Por exemplo, você pode configurar o Husky para rodar testes toda vez que alguém tentar fazer um commit, garantindo que o código que entra no repositório está funcionando corretamente.

Instalação do Husky:

npm install husky --save-dev

Ative o Husky no seu projeto:

npx husky install

Exemplo de uso para rodar um linter antes de cada commit:

npx husky add .husky/pre-commit "npm run lint"

Commitlint

O Commitlint valida as mensagens de commit para garantir que elas seguem as convenções (como os commits semânticos). Ele é útil para evitar commits com mensagens mal formatadas ou sem sentido.

Instalação do Commitlint:

npm install --save-dev @commitlint/config-conventional @commitlint/cli

Crie um arquivo de configuração .commitlintrc.json:

{
  "extends": ["@commitlint/config-conventional"]
}

Para integrar o Commitlint com o Husky, crie um hook de commit:

npx husky add .husky/commit-msg 'npx commitlint --edit "$1"'

Agora, toda vez que alguém tentar fazer um commit, o Commitlint verificará se a mensagem está correta.


Husky e Commitlint: Eles são necessários?

Essas ferramentas são ótimas para automatizar e melhorar a consistência do seu processo de commits, mas não são estritamente necessárias. Elas são mais úteis em projetos maiores, equipes com múltiplos desenvolvedores ou quando você quer garantir uma alta qualidade no processo de desenvolvimento.

Se você está trabalhando sozinho em um projeto pequeno, pode ser que o Commitizen seja suficiente para garantir commits organizados. No entanto, em equipes maiores ou projetos open-source, adicionar o Husky e o Commitlint ajuda a manter a qualidade e a padronização em cada commit.

Quando usar Husky e Commitlint?

  • Projetos colaborativos: Garantem que todos os membros da equipe sigam as mesmas convenções e padrões, evitando que código ruim ou mal documentado seja adicionado ao repositório.
  • Automação de processos: Se você quer automatizar a execução de testes ou linting antes de commits e push, o Husky é uma ótima opção.
  • Manter a qualidade do histórico de commits: O Commitlint garante que as mensagens de commit sigam sempre as mesmas regras, o que é ideal para projetos que seguem o versionamento semântico.

Conclusão

O Commitizen é uma ferramenta incrível para padronizar mensagens de commit e facilitar o processo de versionamento. Embora o Husky e o Commitlint sejam opcionais, eles podem te ajudar a automatizar ainda mais o processo de desenvolvimento e garantir um nível de qualidade superior no código e no histórico de commits.

Se você trabalha sozinho ou em um pequeno projeto, o Commitizen por si só já pode trazer grandes benefícios. Porém, se você está em um time maior ou quer garantir que tudo siga as melhores práticas, considere integrar o Husky e o Commitlint ao seu fluxo de trabalho.

Em resumo, escolha as ferramentas que fazem mais sentido para o seu projeto e aproveite os benefícios de um histórico de commits limpo, organizado e fácil de entender!