Projeto final: histórico de commits em Conventional Commits
2 min de leitura
Chegou a hora de juntar tudo num desafio prático. Você vai pegar um
histórico de commits bagunçado - desses com wip, fix stuff e asd - e
reescrevê-lo em Conventional Commits, do jeito que alimentaria a versão e o
changelog automaticamente.
Este é um milestone: quando completar, você terá demonstrado na prática que sabe ler, avaliar e reescrever mensagens de commit com a convenção.
Objetivo
Criar (ou resgatar) um repositório Git e transformar um histórico caótico num histórico limpo, semântico e preparado pra release.
Passo a passo sugerido
1. Monte o contexto sujo
Num repo de teste, faça alguns commits bagunçados de propósito:
git init cc-pratica
cd cc-pratica
echo "base" > app.js && git add . && git commit -m "wip"
echo "const x = 1" > app.js && git add . && git commit -m "asd"
echo "function hello(){}" > app.js && git add . && git commit -m "fix stuff"
git log --oneline
# pare com um histórico que você não entenderia daqui a 1 mês
2. Avalie cada commit
Para cada linha, responda usando o que aprendeu:
- que tipo é (feat/fix/refactor/docs/chore)?
- há escopo útil (
app)? - o assunto está em verbo imperativo e minúscula?
- precisa de corpo (porquê)? precisa de
BREAKING CHANGE?
3. Reescreva com git rebase -i
Dentro do editor, escolha reword pra renomear mensagens sem duplicar a
mudança:
git rebase -i --root
# no editor: marque os commits como "reword" e troque a mensagem
# para o formato convencional
4. Valide com git log
Confira o resultado - ele deve agora contar uma história:
git log --oneline
# feat(app): adiciona função hello
# fix(app): corrige variável x
# chore: inicializa repositório
5. (Extra) experimente o filtro que a automação usaria
# o que entrou de novo numa "release"
git log --oneline --grep="^feat"
# ou rode um changelog convencional se tiver a ferramenta instalada
Desafios extras (opcional)
feat!: force um commit comBREAKING CHANGE:e veja como ele se destacaria num changelog (bump major em semver).- Adote o tooling: inicialize
commitlint+huskynesse repo e veja um commit fora do padrão ser rejeitado na hora - aí tente gravar um convencional passando de primeira. - Commitizen: rode
npx cze monte uma mensagem pelo assistente. - Gitmoji: decida um emoji e reescreva o histórico com ele (mantendo o
typepresente). - Squash: acerte um
featgrande que foi feito em 5 passos, usandogit rebase -icom squash pra colapsar numa mensagem só.
Critérios de sucesso
- O
git log --onelinedo repo final conta uma história semwip/asd. - Cada mensagem segue
type(escopo): descriçãocom verbo imperativo. - Um
fixe umfeatestão presentes e são distinguíveis. - Você conseguiu usar
git rebase -i(reword e/ou squash) em segurança. - (Se fez o extra) Um
BREAKING CHANGE:aparece com bump major lógico.
Dica final: a meta não é decorar mensagens - é que o histórico conte uma história que você (e bots de release) consigam ler. Sempre que tiver dúvida, volte aos nós desta trilha:
type → escopo → assunto → corpo → rodapé, e tudo se encaixa.
// Quiz
Qual é o critério de sucesso principal do projeto final?
Parabéns - você completou a trilha Conventional Commits! 🎉 Agora cada git commit que você escrever (e cada histórico que você ler) fala a mesma língua:
a língua do release, do changelog e do time.