Commits bons: mensagens claras e commits atômicos
1. O que define um “bom commit”?
No Git, o commit é a unidade fundamental de documentação do histórico do projeto. Cada commit representa um ponto de verificação no desenvolvimento, registrando uma alteração intencional no código. Um bom commit não é apenas aquele que funciona — é aquele que comunica eficientemente a intenção da mudança para outros desenvolvedores (e para você mesmo no futuro).
Um commit de qualidade possui três características essenciais:
- Coeso: contém apenas mudanças relacionadas a um único objetivo
- Descritivo: explica claramente o que foi feito, por que foi feito e como foi feito
- Reversível: pode ser desfeito sem afetar funcionalidades não relacionadas
Commits ruins poluem o histórico, dificultam revisões de código (code review), atrapalham ferramentas como git bisect e geram conflitos desnecessários durante merges. Em projetos colaborativos, a qualidade dos commits impacta diretamente a produtividade da equipe.
2. Commits atômicos: um conceito por vez
Atomicidade em commits significa que cada commit deve conter uma única mudança lógica. Se você está trabalhando em uma tarefa que envolve múltiplas alterações distintas, o ideal é dividi-la em commits separados.
Por exemplo, suponha que você precisa:
1. Refatorar uma função existente
2. Corrigir um bug identificado
3. Adicionar uma nova funcionalidade
Em vez de fazer tudo em um commit gigante, você deve criar três commits independentes:
# Commit 1: Refatoração
git add utils/helpers.js
git commit -m "Refatora função de validação para usar early return"
# Commit 2: Correção de bug
git add src/login.js
git commit -m "Corrige falha de autenticação quando token expira"
# Commit 3: Nova funcionalidade
git add src/dashboard.js
git commit -m "Adiciona gráfico de desempenho mensal no dashboard"
Cada commit é autossuficiente, compilável (quando aplicável) e descreve uma alteração completa. Isso permite reverter ou cherry-pick mudanças específicas sem arrastar alterações não relacionadas.
3. Anatomia de uma mensagem de commit clara
A mensagem de commit segue uma estrutura recomendada, amplamente adotada em projetos open source e corporativos:
Título: resumo conciso (até 50 caracteres)
Corpo: explicação detalhada do porquê e como da mudança
- Detalha o problema resolvido
- Explica a abordagem utilizada
- Pode incluir contexto adicional
Rodapé: referências a issues, tarefas ou pull requests
Regras para o título:
- Use o verbo no presente do imperativo: "Adiciona", "Corrige", "Remove", "Atualiza"
- Limite a 50 caracteres (ou no máximo 72)
- Não use ponto final no final
- Seja específico: evite "Correções" ou "Melhorias"
O corpo deve explicar por que a mudança foi feita e como ela resolve o problema, não apenas o que foi alterado (o diff já mostra isso).
4. Boas práticas para escrever mensagens de commit
Use verbos no presente do imperativo:
✅ "Adiciona validação de email no formulário de cadastro"
✅ "Remove dependência não utilizada do lodash"
✅ "Corrige cálculo de imposto para valores acima de R$ 10.000"
Evite mensagens vagas:
❌ "correções"
❌ "várias mudanças"
❌ "wip"
❌ "atualiza"
Referencie issues e tarefas no rodapé:
Adiciona validação de email no formulário de cadastro
Implementa regex para validar formato de email antes do envio.
Inclui mensagem de erro amigável para usuários.
Closes #42
Refs JIRA-1234
5. Ferramentas e comandos para revisar e melhorar commits
Visualizar histórico rapidamente:
git log --oneline --graph --all
Corrigir a mensagem do último commit:
git commit --amend -m "Nova mensagem corrigida"
Reescrever, combinar ou dividir commits com rebase interativo:
git rebase -i HEAD~5
No editor que abrir, você pode usar comandos como:
- pick — manter o commit como está
- reword — alterar a mensagem do commit
- squash — combinar com o commit anterior
- edit — parar para modificar o conteúdo do commit
Exemplo prático de squash:
pick a1b2c3 Adiciona função de validação
squash d4e5f6 Ajusta detalhes na validação
squash g7h8i9 Pequena correção na validação
Após o rebase, você terá um único commit com a funcionalidade completa e uma mensagem limpa.
6. Armadilhas comuns e como evitá-las
Commits "WIP" (work in progress):
Commits com mensagens como "wip", "teste", "debug" poluem o histórico e devem ser evitados. Use branches separadas para trabalho em andamento ou utilize git stash para salvar alterações temporárias sem criar commits.
Misturar mudanças não relacionadas:
Evite alterar formatação, corrigir bugs e adicionar funcionalidades no mesmo commit. Use git add -p (patch mode) para selecionar partes específicas de arquivos modificados:
git add -p src/app.js
Isso permite commit apenas das alterações relevantes para a mudança lógica atual.
Commits enormes:
Commits que alteram dezenas de arquivos com centenas de linhas dificultam revisão e tornam git bisect ineficaz. Prefira commits pequenos e focados, mesmo que exijam mais commits para completar uma tarefa.
7. Relação com outros conceitos da série
Commits atômicos e staging area:
A staging area do Git é a ferramenta ideal para construir commits atômicos. Com git add seletivo (por arquivo ou por hunk), você pode preparar exatamente as mudanças que pertencem a cada commit.
Alinhamento com Conventional Commits:
O padrão Conventional Commits (como feat:, fix:, chore:) complementa as boas práticas de mensagens claras, adicionando um prefixo que indica o tipo de mudança. Isso facilita a geração automática de changelogs e a semântica de versionamento.
Interação com .gitignore:
Um .gitignore bem configurado garante que apenas mudanças relevantes sejam commitadas. Arquivos de build, dependências e configurações locais não devem aparecer no staging, evitando commits acidentais com conteúdo indesejado.
Escrever commits bons é um hábito que se desenvolve com prática e disciplina. O esforço investido em mensagens claras e commits atômicos retorna em forma de histórico legível, revisões mais rápidas e menos conflitos. Comece aplicando essas técnicas no seu próximo commit — seu eu do futuro agradecerá.
Referências
- Documentação oficial do Git - Commit — Referência completa sobre o comando
git commit, opções e boas práticas - Conventional Commits — Especificação para padronização de mensagens de commit com prefixos semânticos
- How to Write a Git Commit Message (Chris Beams) — Artigo clássico com 7 regras para mensagens de commit eficazes
- Git Tools - Rewriting History — Guia oficial sobre
git commit --amendegit rebase -ipara melhorar commits existentes - Atomic Commits (Martin Fowler) — Explicação do conceito de atomicidade em commits e sua importância no desenvolvimento