Guia Completo de Commits
Guia detalhado sobre Conventional Commits com casos avançados, boas práticas e exemplos do dia a dia.
TIP
Para uma visão rápida, veja Conventional Commits.
Estrutura Detalhada
<tipo>[escopo opcional][!]: <descrição>
[corpo opcional]
[rodapé(s) opcional(is)]Componentes
- tipo: obrigatório, sempre em minúsculas
- escopo: opcional, entre parênteses
- !: opcional, indica breaking change
- descrição: obrigatória, até 72 caracteres, sempre em minúsculas
- corpo: opcional, explicação detalhada
- rodapé: opcional, metadados (breaking changes, issues, co-autores)
Tipos em Detalhes
feat - Nova Funcionalidade
Qualquer adição de funcionalidade ao sistema.
# Simples
feat: adiciona exportação de relatório em PDF
# Com escopo
feat(relatorio): adiciona filtro por período
# Com corpo explicativo
feat(notificacao): adiciona canal de notificação via WhatsApp
Integra com API do WhatsApp Business para enviar notificações
de vencimento de equipamentos diretamente ao usuário.Quando usar:
- ✅ Nova tela/página
- ✅ Novo endpoint de API
- ✅ Nova funcionalidade em feature existente
- ✅ Novo campo em formulário (se muda comportamento)
Quando NÃO usar:
- ❌ Preparação para feature futura (use
choreourefactor) - ❌ Apenas mudança visual sem nova função (use
style)
fix - Correção de Bug
Correção de comportamento incorreto ou inesperado.
# Bug simples
fix: corrige cálculo de dias corridos
# Bug específico
fix(crud): corrige salvamento duplicado ao clicar duas vezes
# Com referência a issue
fix(api): corrige timeout em requisições longas
Aumenta timeout de 30s para 60s em endpoints de relatório.
Refs: #123Quando usar:
- ✅ Corrige erro/exceção
- ✅ Corrige comportamento incorreto
- ✅ Corrige validação quebrada
- ✅ Corrige problema de performance
Quando NÃO usar:
- ❌ Melhoria de código que já funciona (use
refactor) - ❌ Adição de validação nova (use
feat)
docs - Documentação
Alterações apenas em documentação (código não muda).
# README
docs: atualiza instruções de instalação
# API
docs(api): adiciona exemplos de uso dos endpoints
# Comentários no código
docs(service): adiciona JSDoc nos métodos principaisQuando usar:
- ✅ README, CHANGELOG, guias
- ✅ Comentários de código (JSDoc, PHPDoc)
- ✅ Documentação de API
- ✅ Diagramas, arquitetura
Importante: Se mudou código + documentação, use o tipo do código (ex: feat) e mencione a doc no corpo.
style - Estilo e Formatação
Mudanças que não afetam o significado do código.
# Formatação
style: ajusta indentação e espaçamento
# Lint
style: corrige warnings do ESLint
# Imports
style: organiza imports em ordem alfabéticaQuando usar:
- ✅ Formatação (espaços, tabs, quebras de linha)
- ✅ Ponto e vírgula, vírgulas
- ✅ Ordenação de imports
- ✅ Ajustes de lint/prettier
Quando NÃO usar:
- ❌ Mudanças de CSS/UI visíveis ao usuário (considere
featoufix) - ❌ Mudança de lógica mesmo que pequena
refactor - Refatoração
Mudança de código que não adiciona feature nem corrige bug.
# Simplificação
refactor: simplifica lógica de validação de CPF
# Extração
refactor(service): extrai lógica de cálculo para método separado
# Reorganização
refactor: move helpers para pasta utilsQuando usar:
- ✅ Melhoria de código existente
- ✅ Extração de métodos/classes
- ✅ Renomeação significativa
- ✅ Simplificação de lógica complexa
Quando NÃO usar:
- ❌ Se corrigiu um bug junto (use
fix) - ❌ Se adicionou funcionalidade (use
feat)
perf - Performance
Melhoria de performance sem mudar funcionalidade.
# Query
perf(database): otimiza query de listagem de equipamentos
# Cache
perf: adiciona cache Redis para consultas frequentes
# Algoritmo
perf(relatorio): substitui loop nested por map para melhor performanceQuando usar:
- ✅ Otimização de queries
- ✅ Adição de cache
- ✅ Melhoria de algoritmo
- ✅ Redução de uso de memória
test - Testes
Adição ou correção de testes (sem mudar código de produção).
# Novo teste
test: adiciona testes unitários do serviço de autenticação
# Correção
test(crud): corrige mock no teste de atualização
# Cobertura
test: aumenta cobertura do módulo de notificaçõeschore - Tarefas de Manutenção
Build, CI/CD, dependências, configurações.
# Dependência
chore: atualiza Laravel para v11
# CI/CD
chore(ci): adiciona validação de commits no pipeline
# Config
chore: configura ESLint para o projeto
# Build
chore(docker): atualiza imagem base para PHP 8.3Quando usar:
- ✅ Atualização de dependências
- ✅ Mudanças no CI/CD
- ✅ Configuração de ferramentas
- ✅ Scripts de build
- ✅ .gitignore, .env.example
revert - Reverter Commit
Reverte um commit anterior.
revert: reverte "feat: adiciona login com biometria"
Este commit reverte abc1234.
Motivo: biometria causando crash em dispositivos antigos.Formato recomendado:
revert: reverte "<mensagem do commit original>"
Este commit reverte <hash>.
Motivo: <explicação do por quê>Escopo: Quando Usar ou Não
✅ Use escopo quando:
# Módulo específico
feat(auth): adiciona recuperação de senha
fix(crud): corrige validação de datas
# Área do sistema
feat(api): adiciona endpoint de estatísticas
refactor(frontend): reorganiza componentes
# Feature específica
feat(relatorio): adiciona gráfico de barras
fix(notificacao): corrige envio de email❌ Não use escopo quando:
# Múltiplos módulos afetados
refactor: padroniza tratamento de erros em toda aplicação
style: aplica formatação geral do código
# Escopo muito genérico
feat(app): adiciona funcionalidade # muito vago
fix(bug): corrige problema # redundante
# Mudança global
chore: atualiza todas as dependências
docs: atualiza README e documentação da APIDica de Ouro
Se você tem dúvida se deve usar escopo, não use. É melhor um commit claro sem escopo do que um commit com escopo errado.
Breaking Changes - Detalhado
Quando é Breaking Change?
✅ Mudança de assinatura de API pública
✅ Remoção de endpoint/método
✅ Mudança de estrutura de dados obrigatória
✅ Mudança de comportamento esperado
✅ Upgrade forçado de dependência
❌ Adição de novo endpoint (compatível)
❌ Adição de campo opcional
❌ Fix de bug (restaura comportamento esperado)
❌ Refatoração interna (usuário não nota)Formato 1: Usando !
feat!: remove autenticação básica
feat(api)!: muda estrutura de resposta dos endpointsFormato 2: Usando BREAKING CHANGE: (Recomendado)
feat(api): adiciona autenticação obrigatória em todos endpoints
BREAKING CHANGE: todos os endpoints agora exigem header Authorization
com token JWT. Autenticação básica foi removida.
Migração:
1. Obter token em POST /auth/login
2. Adicionar header: Authorization: Bearer <token>
3. Atualizar todas chamadas de API
Refs: #456Por quê usar o formato 2?
- ✅ Permite explicar o impacto
- ✅ Permite dar instruções de migração
- ✅ Mais visível em changelogs
- ✅ Ferramentas de release detectam melhor
Múltiplos Breaking Changes
feat(api): reestrutura endpoints de usuário
BREAKING CHANGE: estrutura de resposta foi alterada
Antes: { user: {...} }
Agora: { data: {...} }
BREAKING CHANGE: endpoint /users/list foi removido
Use /users com query params ?page=1&limit=10Corpo do Commit
Use o corpo quando a descrição não for suficiente.
Quando usar corpo:
# Explicar o "por quê"
fix(api): aumenta timeout de requisições
Requisições de relatório estavam falhando com timeout após 30s.
Aumentado para 60s baseado em análise de logs onde 95% das
requisições completam entre 45-50s.
# Explicar decisões técnicas
refactor(database): migra de UUID v4 para ULID
ULIDs são ordenáveis por tempo de criação, melhorando performance
de queries com ORDER BY. Mantém mesmas características de UUID
(único, 128 bits) mas com melhor performance em índices.
# Listar múltiplas mudanças relacionadas
feat(crud): adiciona validações avançadas
- CPF com validação de dígito verificador
- Data de nascimento não pode ser futura
- Email com verificação de domínio válido
- Telefone aceita formato nacional e internacionalFormatação do corpo:
- Linha em branco entre descrição e corpo
- Máximo 72 caracteres por linha
- Use listas quando aplicável
- Seja objetivo mas completo
Rodapés
Referência a Issues
# Issue única
Refs: #123
# Múltiplas issues
Refs: #123, #456, #789
# Fecha issue automaticamente (GitLab)
Closes: #123
Fixes: #123
Resolves: #123Co-autoria (Pair Programming)
feat(auth): implementa autenticação com JWT
Co-authored-by: João Silva <joao@senai.br>
Co-authored-by: Maria Santos <maria@senai.br>Reviewed-by
feat(api): adiciona endpoint de estatísticas
Reviewed-by: Pedro Oliveira <pedro@senai.br>Múltiplos rodapés
fix(notificacao): corrige envio duplicado de emails
Problema ocorria quando cron executava simultaneamente.
Adicionado lock distribuído com Redis para prevenir concorrência.
Refs: #234
Reviewed-by: Ana Costa <ana@senai.br>Casos Especiais
Merge Commits
Evite criar merge commits manualmente. Use rebase ou squash.
Se inevitável:
Merge branch 'feature/nova-funcionalidade' into developWork in Progress (WIP)
# Durante desenvolvimento
WIP: implementando autenticação com Google
# Quando finalizar, faça rebase interativo e corrija:
feat(auth): adiciona autenticação com GoogleCommits de Configuração Inicial
chore: configuração inicial do projeto
- Estrutura de pastas
- Docker compose
- Variáveis de ambiente
- GitLab CI/CDBoas Práticas
1. Commits Atômicos
Cada commit deve representar uma mudança lógica completa.
# ❌ Errado: múltiplas mudanças não relacionadas
feat: adiciona CRUD de usuários, corrige bug de login, atualiza README
# ✅ Certo: commits separados
feat(crud): adiciona CRUD de usuários
fix(auth): corrige validação de senha no login
docs: atualiza README com novos endpoints2. Descrição Clara e Específica
# ❌ Vago
fix: corrige bug
feat: adiciona funcionalidade
# ✅ Específico
fix(crud): corrige salvamento duplicado ao submeter formulário duas vezes
feat(relatorio): adiciona exportação de relatório em formato Excel3. Verbo no Imperativo
# ❌ Errado
feat: adicionado filtro de data
fix: corrigido bug de validação
# ✅ Certo
feat: adiciona filtro de data
fix: corrige validação de CPF4. Capitalização - Regras do Mercado
PADRÃO ANGULAR/CONVENTIONAL COMMITS
Seguimos rigorosamente o padrão Angular, adotado pelo mercado e pela spec Conventional Commits.
Regra Geral: Tudo Minúscula
A descrição sempre começa com letra minúscula:
# ❌ Errado
feat: Adiciona novo endpoint
fix: Corrige problema
docs: Atualiza documentação
# ✅ Certo
feat: adiciona novo endpoint
fix: corrige problema de timeout
docs: atualiza documentaçãoExceções: Nomes Próprios e Siglas
Mantêm capitalização original:
Nomes de tecnologias e empresas:
feat(auth): adiciona login com Google
chore(docker): atualiza imagem do Node para v20
feat(api): implementa autenticação JWT
feat: adiciona integração com PostgreSQL
fix: corrige conexão com RedisSiglas e acrônimos:
fix(api): corrige timeout na API
chore(ci): atualiza pipeline do CI/CD
feat(http): adiciona suporte a HTTP/2
docs(rest): documenta endpoints RESTArquivos especiais (convenção):
docs: atualiza README
docs: atualiza CHANGELOG
chore: corrige sintaxe no .gitignoreConceitos técnicos: sempre minúscula
# ✅ Certo
docs(development): adiciona definition of done
docs(git): documenta conventional commits
feat(relatorio): adiciona exportação de relatório
fix(crud): corrige validação de formulário
# ❌ Errado
docs(development): adiciona Definition of Done
docs(git): documenta Conventional CommitsResumo da Regra
| Elemento | Capitalização | Exemplo |
|---|---|---|
| Tipo | Minúscula | feat não Feat |
| Escopo | Minúscula | (auth) não (Auth) |
| Descrição | Minúscula | adiciona login não Adiciona login |
| Nomes Próprios | Original | Google, Node, PostgreSQL |
| Siglas | Maiúscula | API, CI/CD, JWT, HTTP |
| Arquivos especiais | Original | README, CHANGELOG |
| Conceitos | Minúscula | definition of done, conventional commits |
Regra Prática
Antes de commitar, pergunte:
- É nome de empresa/tecnologia? → Mantém capitalização (
Google,Redis) - É sigla conhecida? → Mantém maiúscula (
API,JWT) - É arquivo especial? → Mantém capitalização (
README) - É conceito/ação/descrição? → Minúscula (
adiciona,definition of done)
Quando em dúvida: Use minúscula. É sempre mais seguro.
5. Sem Ponto Final
# ❌ Errado
feat: adiciona login com Google.
# ✅ Certo
feat: adiciona login com GoogleErros Comuns
❌ Tipo em maiúscula
FEAT: adiciona funcionalidade # errado
feat: adiciona funcionalidade # certo❌ Espaço entre tipo e :
feat : adiciona funcionalidade # errado
feat: adiciona funcionalidade # certo❌ Descrição muito longa
feat: adiciona funcionalidade de exportação de relatórios em múltiplos formatos incluindo PDF e Excel com suporte a filtros # 120+ caracteres
# Certo: usar corpo
feat: adiciona exportação de relatórios em múltiplos formatos
Suporta PDF e Excel com filtros de período, status e usuário.❌ Commit genérico
fix: corrige bugs # qual bug?
feat: adiciona código # qual código?
# Certo
fix(auth): corrige validação de token expirado
feat(crud): adiciona validação de CPF no formulário❌ Misturar mudanças
feat: adiciona CRUD + corrige bug de login + atualiza README
# Certo: 3 commits separados❌ Capitalização incorreta
# Errado
feat: Adiciona endpoint de usuários
docs: Atualiza README do projeto
feat(api): Implementa autenticação
# Certo
feat: adiciona endpoint de usuários
docs: atualiza README do projeto
feat(api): implementa autenticaçãoExemplos do Mundo Real
Exemplo 1: Feature Completa
feat(equipamento): adiciona notificação de vencimento
Implementa sistema de notificação automática via email quando
equipamento está próximo do vencimento (7 dias antes).
Funcionalidades:
- Cron diário verificando vencimentos
- Template de email personalizável
- Configuração de dias de antecedência
- Log de notificações enviadas
Refs: #567
Co-authored-by: Carlos Silva <carlos@senai.br>Exemplo 2: Bug Crítico
fix(api): corrige vazamento de memória em endpoint de relatório
Query estava carregando todos registros em memória antes de
processar. Alterado para usar cursor/stream processando em lotes
de 1000 registros.
Impacto: reduz uso de memória de 2GB para ~100MB em relatórios grandes.
Fixes: #789Exemplo 3: Refatoração
refactor(service): extrai lógica de validação para classe dedicada
Validações estavam espalhadas em controllers e services.
Criada classe ValidatorService centralizando toda lógica.
Benefícios:
- Reutilização de código
- Testes mais simples
- Manutenção facilitada
- Consistência nas validaçõesExemplo 4: Breaking Change
feat(api)!: padroniza estrutura de resposta de todos endpoints
BREAKING CHANGE: estrutura de resposta da API foi padronizada
Antes:
GET /users → { users: [...] }
GET /equipamentos → { data: [...] }
Agora (todos endpoints):
{
"data": [...],
"meta": { "total": 100, "page": 1 }
}
Migração necessária em todos clientes da API.
Ver documentação completa: docs/api/migration-v2.md
Refs: #890Exemplo 5: Com Nomes Próprios
feat(auth): adiciona autenticação com Google OAuth
Implementa fluxo OAuth 2.0 para login com Google.
Utiliza biblioteca oficial do Google para Node.js.
Configuração necessária:
- Criar aplicação no Google Cloud Console
- Adicionar client_id e client_secret no .env
- Configurar redirect_uri autorizado
Refs: #445Exemplo 6: Múltiplas Tecnologias
chore(docker): atualiza stack de containers
Atualizações:
- Node: v18 → v20
- PostgreSQL: v14 → v16
- Redis: v7.0 → v7.2
- Nginx: v1.24 → v1.25
Testado em ambiente de staging sem problemas.Ferramentas
Commitlint
Valida mensagens de commit automaticamente.
# Instalação (será configurado no CI/CD)
npm install --save-dev @commitlint/cli @commitlint/config-conventional
# Configuração
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.jsCommitizen
Assistente interativo para criar commits.
# Uso
git add .
npm run commit # ao invés de git commit
# Irá perguntar:
# - Tipo do commit
# - Escopo
# - Descrição
# - Breaking changesRecursos
- Conventional Commits (spec oficial)
- Angular Commit Guidelines - Base do nosso padrão
- Semantic Versioning
- Keep a Changelog
Dúvidas? Consulte este guia ou pergunte no canal #dev do Teams.