Divide grandes mudanças em unidades mínimas significativas e faz commits sequenciais com mensagens de commit semânticas. Usa apenas comandos padrão do git, sem depender de ferramentas externas.
Splits large changes into meaningful units and creates sequential semantic commits.
/plugin marketplace add wasabeef/claude-code-cookbook/plugin install cook-pt@claude-code-cookbookDivide grandes mudanças em unidades mínimas significativas e faz commits sequenciais com mensagens de commit semânticas. Usa apenas comandos padrão do git, sem depender de ferramentas externas.
/semantic-commit [opções]
--dry-run : Mostra apenas as divisões de commit propostas sem fazer commits reais--lang <idioma> : Força especificação do idioma das mensagens de commit (en, pt)--max-commits <número> : Especifica o número máximo de commits (padrão: 10)# Analisa mudanças atuais e faz commits por unidade lógica
/semantic-commit
# Confirma apenas propostas de divisão (sem commits reais)
/semantic-commit --dry-run
# Gera mensagens de commit em inglês
/semantic-commit --lang en
# Gera mensagens de commit em português
/semantic-commit --lang pt
# Divide em no máximo 5 commits
/semantic-commit --max-commits 5
git diff HEADDetecta como grande mudança sob as seguintes condições:
# Análise da escala de mudanças
CHANGED_FILES=$(git diff HEAD --name-only | wc -l)
CHANGED_LINES=$(git diff HEAD --stat | tail -1 | grep -o '[0-9]\+ insertions\|[0-9]\+ deletions' | awk '{sum+=$1} END {print sum}')
if [ $CHANGED_FILES -ge 5 ] || [ $CHANGED_LINES -ge 100 ]; then
echo "Grande mudança detectada: divisão recomendada"
fi
# Identificação de unidades funcionais a partir da estrutura de diretórios
git diff HEAD --name-only | cut -d'/' -f1-2 | sort | uniq
# → src/auth, src/api, components/ui, etc.
# Arquivos novos vs modificação de arquivos existentes
git diff HEAD --name-status | grep '^A' # Arquivos novos
git diff HEAD --name-status | grep '^M' # Arquivos modificados
git diff HEAD --name-status | grep '^D' # Arquivos excluídos
# Detecção de mudanças em relacionamentos de importação
git diff HEAD | grep -E '^[+-].*import|^[+-].*require' | \
cut -d' ' -f2- | sort | uniq
# Obtém lista de arquivos modificados
git diff HEAD --name-only
# Analisa individualmente o conteúdo de mudanças de cada arquivo
git diff HEAD -- <file>
# Determina o tipo de mudança do arquivo
git diff HEAD --name-status | while read status file; do
case $status in
A) echo "$file: novo" ;;
M) echo "$file: modificado" ;;
D) echo "$file: excluído" ;;
R*) echo "$file: renomeado" ;;
esac
done
Unidade funcional: Arquivos relacionados à mesma funcionalidade
src/auth/ → funcionalidade de autenticaçãocomponents/ → componentes UITipo de mudança: Mesmo tipo de mudança
test:docs:chore:Dependências: Arquivos inter-relacionados
Escala de mudanças: Manutenção do tamanho adequado de commit
$ /semantic-commit
Analisando mudanças...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Mudanças detectadas:
• src/auth/login.ts (modificado)
• src/auth/register.ts (novo)
• src/auth/types.ts (modificado)
• tests/auth.test.ts (novo)
• docs/authentication.md (novo)
Divisão de commits proposta:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Commit 1/3
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Mensagem: feat: implement user registration and login system
Arquivos incluídos:
• src/auth/login.ts
• src/auth/register.ts
• src/auth/types.ts
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Commit 2/3
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Mensagem: test: add comprehensive tests for authentication system
Arquivos incluídos:
• tests/auth.test.ts
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Commit 3/3
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Mensagem: docs: add authentication system documentation
Arquivos incluídos:
• docs/authentication.md
Executar commits com esta divisão? (y/n/edit):
y : Executa com a divisão de commits propostan : Cancelaedit : Edita mensagens de commit individualmentemerge <número1> <número2> : Une os commits especificadossplit <número> : Divide ainda mais o commit especificado$ /semantic-commit --dry-run
Analisando mudanças... (DRY RUN)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[Exibição da proposta de divisão de commits]
ℹ️ Modo DRY RUN: commits reais não serão executados
💡 Para executar, re-execute sem a opção --dry-run
package.json, Cargo.toml, pom.xml, etc.# Detecção de padrão de correção de bugs
- Palavras-chave como "fix", "bug", "error"
- Adição de tratamento de exceções
- Modificação de ramificações condicionais
# Detecção de padrão de nova funcionalidade
- Criação de novos arquivos
- Adição de novos métodos
- Adição de endpoints de API
# Reset mudanças não-staged se existirem
git reset HEAD
git status --porcelain > /tmp/original_state.txt
# Confirmação da branch de trabalho
CURRENT_BRANCH=$(git branch --show-current)
echo "Branch de trabalho: $CURRENT_BRANCH"
# Carregamento do plano de divisão
while IFS= read -r commit_plan; do
group_num=$(echo "$commit_plan" | cut -d':' -f1)
files=$(echo "$commit_plan" | cut -d':' -f2- | tr ' ' '\n')
echo "=== Executando Commit $group_num ==="
# Staging apenas dos arquivos relevantes
echo "$files" | while read file; do
if [ -f "$file" ]; then
git add "$file"
echo "Staging: $file"
fi
done
# Confirmação do estado de staging
staged_files=$(git diff --staged --name-only)
if [ -z "$staged_files" ]; then
echo "Aviso: nenhum arquivo foi staged"
continue
fi
# Geração de mensagem de commit (análise por LLM)
commit_msg=$(generate_commit_message_for_staged_files)
# Confirmação do usuário
echo "Mensagem de commit proposta: $commit_msg"
echo "Arquivos em staging:"
echo "$staged_files"
read -p "Executar este commit? (y/n): " confirm
if [ "$confirm" = "y" ]; then
# Execução do commit
git commit -m "$commit_msg"
echo "✅ Commit $group_num concluído"
else
# Cancelar staging
git reset HEAD
echo "❌ Commit $group_num pulado"
fi
done < /tmp/commit_plan.txt
# Tratamento de falhas de pre-commit hooks
commit_with_retry() {
local commit_msg="$1"
local max_retries=2
local retry_count=0
while [ $retry_count -lt $max_retries ]; do
if git commit -m "$commit_msg"; then
echo "✅ Commit realizado com sucesso"
return 0
else
echo "❌ Falha no commit (tentativa $((retry_count + 1))/$max_retries)"
# Incorporar correções automáticas por pre-commit hooks
if git diff --staged --quiet; then
echo "Mudanças foram corrigidas automaticamente por pre-commit hooks"
git add -u
fi
retry_count=$((retry_count + 1))
fi
done
echo "❌ Falha no commit. Verificar manualmente."
return 1
}
# Recuperação de interrupções
resume_from_failure() {
echo "Processamento de commit interrompido detectado"
echo "Estado atual de staging:"
git status --porcelain
read -p "Continuar processamento? (y/n): " resume
if [ "$resume" = "y" ]; then
# Reiniciar a partir da posição do último commit
last_commit=$(git log --oneline -1 --pretty=format:"%s")
echo "Último commit: $last_commit"
else
# Reset completo
git reset HEAD
echo "Processamento foi resetado"
fi
}
# Confirmar se todas as mudanças foram commitadas
remaining_changes=$(git status --porcelain | wc -l)
if [ $remaining_changes -eq 0 ]; then
echo "✅ Todas as mudanças foram commitadas"
else
echo "⚠️ Mudanças não commitadas restantes:"
git status --short
fi
# Exibir histórico de commits
echo "Commits criados:"
git log --oneline -n 10 --graph
# Nota: não fazer push automático
echo "📝 Nota: push automático não será executado"
echo "Execute o push manualmente conforme necessário:"
echo " git push origin $CURRENT_BRANCH"
# Obter e classificar todos os arquivos alterados
git diff HEAD --name-status | while read status file; do
echo "$status:$file"
done > /tmp/changes.txt
# Estatísticas de mudanças por diretório funcional
git diff HEAD --name-only | cut -d'/' -f1-2 | sort | uniq -c
# Agrupamento baseado em diretórios
GROUPS=$(git diff HEAD --name-only | cut -d'/' -f1-2 | sort | uniq)
for group in $GROUPS; do
echo "=== Grupo: $group ==="
git diff HEAD --name-only | grep "^$group" | head -10
done
# Análise do tipo de mudança para cada arquivo
git diff HEAD --name-only | while read file; do
# Detecção de adição de novas funções/classes
NEW_FUNCTIONS=$(git diff HEAD -- "$file" | grep -c '^+.*function\|^+.*class\|^+.*def ')
# Detecção de padrões de correção de bugs
BUG_FIXES=$(git diff HEAD -- "$file" | grep -c '^+.*fix\|^+.*bug\|^-.*error')
# Determinar se é arquivo de teste
if [[ "$file" =~ test|spec ]]; then
echo "$file: TEST"
elif [ $NEW_FUNCTIONS -gt 0 ]; then
echo "$file: FEAT"
elif [ $BUG_FIXES -gt 0 ]; then
echo "$file: FIX"
else
echo "$file: REFACTOR"
fi
done
# Análise de relações de importação
git diff HEAD | grep -E '^[+-].*import|^[+-].*from.*import' | \
while read line; do
echo "$line" | sed 's/^[+-]//' | awk '{print $2}'
done | sort | uniq > /tmp/imports.txt
# Agrupamento de arquivos relacionados
git diff HEAD --name-only | while read file; do
basename=$(basename "$file" .js .ts .py)
related=$(git diff HEAD --name-only | grep "$basename" | grep -v "^$file$")
if [ -n "$related" ]; then
echo "Grupo de arquivos relacionados: $file <-> $related"
fi
done
# Ajuste do tamanho dos grupos
MAX_FILES_PER_COMMIT=8
current_group=1
file_count=0
git diff HEAD --name-only | while read file; do
if [ $file_count -ge $MAX_FILES_PER_COMMIT ]; then
current_group=$((current_group + 1))
file_count=0
fi
echo "Commit $current_group: $file"
file_count=$((file_count + 1))
done
# Verificação do resultado da divisão
for group in $(seq 1 $current_group); do
files=$(grep "Commit $group:" /tmp/commit_plan.txt | cut -d':' -f2-)
lines=$(echo "$files" | xargs git diff HEAD -- | wc -l)
echo "Commit $group: $(echo "$files" | wc -w) arquivos, $lines linhas alteradas"
done
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
Tipos obrigatórios:
feat: Nova funcionalidade (funcionalidade visível ao usuário)fix: Correção de bugTipos opcionais:
build: Mudanças no sistema de build ou dependências externaschore: Outras mudanças (não afetam o release)ci: Mudanças em arquivos de configuração ou scripts de CIdocs: Mudanças apenas na documentaçãostyle: Mudanças que não afetam o significado do código (espaços, formatação, ponto-e-vírgula, etc.)refactor: Mudanças no código que não corrigem bugs nem adicionam funcionalidadesperf: Melhoria de performancetest: Adição ou modificação de testesIndica o escopo de impacto das mudanças:
feat(api): add user authentication endpoint
fix(ui): resolve button alignment issue
docs(readme): update installation instructions
Em caso de mudanças que quebram a API:
feat!: change user API response format
BREAKING CHANGE: user response now includes additional metadata
ou
feat(api)!: change authentication flow
Importante: Quando existem convenções específicas do projeto, essas têm prioridade.
Detecta automaticamente configurações dos seguintes arquivos:
commitlint.config.jscommitlint.config.mjscommitlint.config.cjscommitlint.config.ts.commitlintrc.js.commitlintrc.json.commitlintrc.yml.commitlintrc.yamlcommitlint do package.json# Verificação de arquivos de configuração exemplo
cat commitlint.config.mjs
cat .commitlintrc.json
grep -A 10 '"commitlint"' package.json
Exemplo de tipos personalizados do projeto:
// commitlint.config.mjs
export default {
extends: ["@commitlint/config-conventional"],
rules: {
"type-enum": [
2,
"always",
[
"feat",
"fix",
"docs",
"style",
"refactor",
"test",
"chore",
"wip", // trabalho em progresso
"hotfix", // correção emergencial
"release", // release
"deps", // atualização de dependências
"config", // mudança de configuração
],
],
},
};
// Para projetos que usam mensagens em português
export default {
rules: {
"subject-case": [0], // desabilitar para suporte ao português
"subject-max-length": [2, "always", 72], // ajustar limite de caracteres para português
},
};
Busca por Arquivos de Configuração
find . -name "commitlint.config.*" -o -name ".commitlintrc.*" | head -1
Análise de Commits Existentes
git log --oneline -50 --pretty=format:"%s"
Estatísticas de Tipos Utilizados
git log --oneline -100 --pretty=format:"%s" | \
grep -oE '^[a-z]+(\([^)]+\))?' | \
sort | uniq -c | sort -nr
feat(scope): add new feature
fix(scope): fix bug
docs(scope): update documentation
✨ feat: add user registration
🐛 fix: resolve login issue
📚 docs: update API docs
feat: adicionar funcionalidade de registro de usuário
fix: corrigir bug no processo de login
docs: atualizar documentação da API
Lógica de detecção de idioma completa neste comando:
Configurações CommitLint verificam configurações de idioma
# Se a regra subject-case está desabilitada, detecta como português
grep -E '"subject-case".*\[0\]|subject-case.*0' commitlint.config.*
Análise do git log para detecção automática
# Analisa idioma dos últimos 20 commits
git log --oneline -20 --pretty=format:"%s" | \
grep -E 'ção|ões|agem|ário|ória|ência|português|brasil' | wc -l
# Se 50% ou mais for em português, modo português
Configurações de idioma dos arquivos do projeto
# Verificar idioma do README.md
head -10 README.md | grep -E 'ção|ões|agem|ário|ória|ência|português|brasil' | wc -l
# Verificar description do package.json
grep -E '"description".*(ção|ões|agem|ário|ória|ência|português|brasil)' package.json
Análise de comentários e strings nos arquivos alterados
# Verificar idioma dos comentários nos arquivos alterados
git diff HEAD | grep -E '^[+-].*//.*ção|ões|agem|ário|ória|ência|português|brasil' | wc -l
# Cálculo de pontuação para detecção de idioma
PORTUGUESE_SCORE=0
# 1. Configuração CommitLint (+3 pontos)
if grep -q '"subject-case".*\[0\]' commitlint.config.* 2>/dev/null; then
PORTUGUESE_SCORE=$((PORTUGUESE_SCORE + 3))
fi
# 2. Análise do git log (máximo +2 pontos)
PORTUGUESE_COMMITS=$(git log --oneline -20 --pretty=format:"%s" | \
grep -cE '(ção|ões|agem|ário|ória|ência|português|brasil)' 2>/dev/null || echo 0)
if [ $PORTUGUESE_COMMITS -gt 10 ]; then
PORTUGUESE_SCORE=$((PORTUGUESE_SCORE + 2))
elif [ $PORTUGUESE_COMMITS -gt 5 ]; then
PORTUGUESE_SCORE=$((PORTUGUESE_SCORE + 1))
fi
# 3. Verificação do README.md (+1 ponto)
if head -5 README.md 2>/dev/null | grep -qE '(ção|ões|agem|ário|ória|ência|português|brasil)'; then
PORTUGUESE_SCORE=$((PORTUGUESE_SCORE + 1))
fi
# 4. Verificação do conteúdo dos arquivos alterados (+1 ponto)
if git diff HEAD 2>/dev/null | grep -qE '^[+-].*(ção|ões|agem|ário|ória|ência|português|brasil)'; then
PORTUGUESE_SCORE=$((PORTUGUESE_SCORE + 1))
fi
# Detecção: 3 pontos ou mais para modo português
if [ $PORTUGUESE_SCORE -ge 3 ]; then
LANGUAGE="pt"
else
LANGUAGE="en"
fi
Durante a execução do comando, as configurações são verificadas na seguinte ordem:
Busca por Arquivos de Configuração CommitLint
# Busca na seguinte ordem e usa o primeiro encontrado
commitlint.config.mjs
commitlint.config.js
commitlint.config.cjs
commitlint.config.ts
.commitlintrc.js
.commitlintrc.json
.commitlintrc.yml
.commitlintrc.yaml
package.json (seção commitlint)
Análise do Conteúdo da Configuração
Análise do Histórico de Commits Existentes
# Aprende padrões de uso a partir de commits recentes
git log --oneline -100 --pretty=format:"%s" | \
head -20
commitlint.config.mjs padrão:
export default {
extends: ["@commitlint/config-conventional"],
rules: {
"type-enum": [
2,
"always",
["feat", "fix", "docs", "style", "refactor", "perf", "test", "chore"],
],
"scope-enum": [2, "always", ["api", "ui", "core", "auth", "db"]],
},
};
Configuração para suporte ao português:
export default {
extends: ["@commitlint/config-conventional"],
rules: {
"subject-case": [0], // desabilitar para português
"subject-max-length": [2, "always", 72],
"type-enum": [
2,
"always",
["feat", "fix", "docs", "style", "refactor", "test", "chore"],
],
},
};
Configuração com tipos customizados:
export default {
extends: ["@commitlint/config-conventional"],
rules: {
"type-enum": [
2,
"always",
[
"feat",
"fix",
"docs",
"style",
"refactor",
"test",
"chore",
"wip", // Work in Progress
"hotfix", // correção emergencial
"release", // preparação de release
"deps", // atualização de dependências
"config", // mudança de configuração
],
],
},
};
Quando nenhum arquivo de configuração é encontrado:
Análise do git log para inferência automática
# Extrai tipos dos últimos 100 commits
git log --oneline -100 --pretty=format:"%s" | \
grep -oE '^[a-z]+(\([^)]+\))?' | \
sort | uniq -c | sort -nr
Uso padrão do Conventional Commits
feat, fix, docs, style, refactor, perf, test, chore, build, ci
Detecção de idioma
git push após commits deve ser executado manualmentegit stash para backup antes de mudanças importantesPrioridade ao gerar mensagens de commit:
Configuração CommitLint (prioridade máxima)
commitlint.config.*Histórico de commits existente (segunda prioridade)
Tipo de projeto (terceira prioridade)
package.json → Projeto Node.jsCargo.toml → Projeto Rustpom.xml → Projeto JavaPadrão Conventional Commits (fallback)
Detecção automática de scope em Monorepo:
# Inferir scope a partir da pasta packages/
ls packages/ | head -10
# → api, ui, core, auth etc. propostos como scope
Convenções específicas por framework:
// Projeto Angular
{
'scope-enum': [2, 'always', [
'animations', 'common', 'core', 'forms', 'http', 'platform-browser',
'platform-server', 'router', 'service-worker', 'upgrade'
]]
}
// Projeto React
{
'scope-enum': [2, 'always', [
'components', 'hooks', 'utils', 'types', 'styles', 'api'
]]
}
Convenções específicas de empresa/equipe:
// Padrão comum em empresas japonesas
{
'type-enum': [2, 'always', [
'feat', 'fix', 'docs', 'style', 'refactor', 'test', 'chore',
'wip', // trabalho em progresso (para pull requests)
'hotfix', // correção emergencial
'release' // preparação de release
]],
'subject-case': [0], // suporte ao japonês
'subject-max-length': [2, 'always', 72] // configuração mais longa para japonês
}
Antes (1 commit gigante):
# Arquivos alterados (15 arquivos, 850 linhas alteradas)
src/auth/login.js # novo
src/auth/register.js # novo
src/auth/password.js # novo
src/auth/types.js # novo
src/api/auth-routes.js # novo
src/middleware/auth.js # novo
src/database/migrations/001_users.sql # novo
src/database/models/user.js # novo
tests/auth/login.test.js # novo
tests/auth/register.test.js # novo
tests/api/auth-routes.test.js # novo
docs/authentication.md # novo
package.json # adição de dependências
README.md # adição de instruções de uso
.env.example # adição de exemplos de variáveis de ambiente
# Commit problemático convencional
feat: implement complete user authentication system with login, registration, password reset, API routes, database models, tests and documentation
Depois (dividido em 5 commits significativos):
# Commit 1: Base do banco de dados
feat(db): add user model and authentication schema
Arquivos incluídos:
- src/database/migrations/001_users.sql
- src/database/models/user.js
- src/auth/types.js
Razão: Estrutura do banco de dados é a base para outras funcionalidades, por isso primeiro commit
# Commit 2: Lógica de autenticação
feat(auth): implement core authentication functionality
Arquivos incluídos:
- src/auth/login.js
- src/auth/register.js
- src/auth/password.js
- src/middleware/auth.js
Razão: Lógica de negócio central da autenticação commitada em lote
# Commit 3: Endpoints da API
feat(api): add authentication API routes
Arquivos incluídos:
- src/api/auth-routes.js
Razão: Camada da API depende da lógica de autenticação, por isso commit posterior
# Commit 4: Testes abrangentes
test(auth): add comprehensive authentication tests
Arquivos incluídos:
- tests/auth/login.test.js
- tests/auth/register.test.js
- tests/api/auth-routes.test.js
Razão: Adição de testes em lote após conclusão da implementação
# Commit 5: Configuração e documentação
docs(auth): add authentication documentation and configuration
Arquivos incluídos:
- docs/authentication.md
- package.json
- README.md
- .env.example
Razão: Documentação e configuração commitadas em lote por último
Antes (commit problemático com mistura):
# Arquivos alterados (8 arquivos, 320 linhas alteradas)
src/user/service.js # correção de bug + refatoração
src/user/validator.js # novo (refatoração)
src/auth/middleware.js # correção de bug
src/api/user-routes.js # correção de bug + melhoria de tratamento de erros
tests/user.test.js # adição de testes
tests/auth.test.js # adição de testes de correção de bugs
docs/user-api.md # atualização de documentação
package.json # atualização de dependências
# Commit problemático
fix: resolve user validation bugs and refactor validation logic with improved error handling
Depois (dividido em 3 commits por tipo):
# Commit 1: Correção emergencial de bugs
fix: resolve user validation and authentication bugs
Arquivos incluídos:
- src/user/service.js (apenas partes de correção de bugs)
- src/auth/middleware.js
- tests/auth.test.js (apenas testes de correção de bugs)
Razão: Bugs que afetam produção são corrigidos com prioridade máxima
# Commit 2: Refatoração da lógica de validação
refactor: extract and improve user validation logic
Arquivos incluídos:
- src/user/service.js (partes de refatoração)
- src/user/validator.js
- src/api/user-routes.js
- tests/user.test.js
Razão: Melhorias estruturais commitadas por unidade funcional
# Commit 3: Atualização de documentação e dependências
chore: update documentation and dependencies
Arquivos incluídos:
- docs/user-api.md
- package.json
Razão: Manutenção do ambiente de desenvolvimento commitada por último
Antes (commit gigante cruzando funcionalidades):
# Arquivos alterados (12 arquivos, 600 linhas alteradas)
src/user/profile.js # nova funcionalidade A
src/user/avatar.js # nova funcionalidade A
src/notification/email.js # nova funcionalidade B
src/notification/sms.js # nova funcionalidade B
src/api/profile-routes.js # API para nova funcionalidade A
src/api/notification-routes.js # API para nova funcionalidade B
src/dashboard/widgets.js # nova funcionalidade C
src/dashboard/charts.js # nova funcionalidade C
tests/profile.test.js # testes para nova funcionalidade A
tests/notification.test.js # testes para nova funcionalidade B
tests/dashboard.test.js # testes para nova funcionalidade C
package.json # dependências para todas as funcionalidades
# Commit problemático
feat: add user profile management, notification system and dashboard widgets
Depois (dividido em 4 commits por funcionalidade):
# Commit 1: Funcionalidade de perfil de usuário
feat(profile): add user profile management
Arquivos incluídos:
- src/user/profile.js
- src/user/avatar.js
- src/api/profile-routes.js
- tests/profile.test.js
Razão: Funcionalidade de perfil é uma unidade funcional independente
# Commit 2: Sistema de notificações
feat(notification): implement email and SMS notifications
Arquivos incluídos:
- src/notification/email.js
- src/notification/sms.js
- src/api/notification-routes.js
- tests/notification.test.js
Razão: Funcionalidade de notificação é uma unidade funcional independente
# Commit 3: Widgets do dashboard
feat(dashboard): add interactive widgets and charts
Arquivos incluídos:
- src/dashboard/widgets.js
- src/dashboard/charts.js
- tests/dashboard.test.js
Razão: Funcionalidade de dashboard é uma unidade funcional independente
# Commit 4: Atualização de dependências e infraestrutura
chore: update dependencies for new features
Arquivos incluídos:
- package.json
Razão: Atualizações de dependências comuns por último
| Item | Antes (Commit Gigante) | Depois (Divisão Adequada) |
|---|---|---|
| Revisabilidade | ❌ Muito difícil | ✅ Cada commit pequeno e revisável |
| Rastreamento de Bugs | ❌ Difícil identificar local do problema | ✅ Identifica commit problemático imediatamente |
| Revert | ❌ Necessário reverter tudo | ✅ Revert pontual apenas da parte problemática |
| Desenvolvimento Paralelo | ❌ Propenso a conflitos | ✅ Merge fácil por funcionalidade |
| Deploy | ❌ Deploy de todas as funcionalidades em lote | ✅ Deploy gradual possível |
--max-commitsedit manual