Guia de Fluxo de Trabalho Git
Este documento descreve a estratégia profissional de ramificação e lançamento para o Elo Orgânico, combinando a disciplina estrutural do Git Flow com o poder de colaboração da GitHub CLI (gh).
Modelo de Ramificação (Branching)
Seguimos o modelo padrão Git Flow para garantir a estabilidade do nosso código de produção, adaptado para nossa estrutura de monorepo.
| Branch | Propósito | Estabilidade |
|---|---|---|
main | Lançamentos de produção. Cada commit é uma release tagueada. | Ultra Estável |
develop | Desenvolvimento da próxima release. Branch de integração. | Estável |
feature/* | Novas funcionalidades ou mudanças de UI. Ramifica de develop. | Experimental |
bugfix/* | Correções de bugs para o próximo ciclo de desenvolvimento. | Experimental |
release/* | Preparação para uma nova release de produção. | Polimento Final |
hotfix/* | Correções de bugs críticos para a versão de produção. | Urgente |
support/* | Ramificações de suporte de longo prazo para versões major antigas. | Estável |
Configuração da CLI do Git Flow
Nosso repositório local está configurado com os seguintes prefixos e regras de tag:
Branch name for production releases: main
Branch name for "next release" development: develop
Feature branch prefix: feature/
Bugfix branch prefix: bugfix/
Release branch prefix: release/
Hotfix branch prefix: hotfix/
Support branch prefix: support/
Version tag prefix: v
Requisitos de Ferramental
Para seguir este fluxo de trabalho de forma eficiente, recomendamos:
- Git Flow CLI (Edição AVH): Geralmente incluído no Git for Windows ou disponível via pacote
gitflow. - GitHub CLI (
gh): Utilizada para Pull Requests, monitoramento de status e releases oficiais.
Padrões de Commit (Conventional Commits)
Para manter um histórico limpo e automatizado, todos os commits devem seguir a especificação Conventional Commits.
Formato: <tipo>(<escopo>): <descrição>
Tipos
- feat: Uma nova funcionalidade (correlaciona-se com
MINORno SemVer). - fix: Uma correção de bug (correlaciona-se com
PATCHno SemVer). - docs: Mudanças apenas na documentação.
- style: Mudanças que não afetam o significado do código (espaço em branco, formatação, etc).
- refactor: Uma alteração de código que não corrige um bug nem adiciona uma funcionalidade.
- perf: Uma alteração de código que melhora a performance.
- test: Adição de testes ausentes ou correção de testes existentes.
- chore: Mudanças no processo de build ou ferramentas/bibliotecas auxiliares.
Escopos do Monorepo
Use o contexto ou nome do pacote como escopo:
instance: Mudanças nos apps ou core da Instância da Comunidade.portal: Mudanças nos apps ou core do Portal Global.core: Mudanças na lógica de domínio compartilhada.studio: Tokens de design, ativos ou configuração do Penpot.tools: Servidores MCP, scripts ou infraestrutura.deps: Atualizações de dependências (gerenciadas via catalogs).
Exemplo: feat(instance): add Pix payment reconciliation to checkout
Fluxo de Contribuição
1. Iniciando uma Nova Funcionalidade
Sempre ramifique a partir de develop.
git flow feature start minha-funcionalidade-incrivel
2. Colaborando e Propondo Mudanças
Em vez de realizar o merge localmente, usamos Pull Requests para revisão de código e validação de CI.
- Envie sua branch:
git push -u origin feature/minha-funcionalidade-incrivel - Crie um Pull Request:
Usegh pr create --base develop --fill --web
--fillpara usar automaticamente suas mensagens de commit para a descrição do PR.
3. Estratégia de Merge Sênior (Squash & Merge)
Para manter o histórico da develop limpo e significativo, usamos Squash Merges. Isso combina todos os commits de uma branch de funcionalidade em um único commit bem descrito na develop.
- Ação: Merge via interface do GitHub ou CLI usando o método
squash. - Comando CLI:
gh pr merge --squash --delete-branch
Fluxo de Release & Versionamento (Changesets)
Utilizamos o Changesets combinado com o GitHub Actions para automatizar o nosso versionamento, compilação de changelogs e criação de Pull Requests de release. Os desenvolvedores não alteram manualmente as versões dos pacotes nos arquivos package.json.
1. Gerando um Changeset (Local)
Quando sua funcionalidade ou correção de bug estiver pronta e antes de abrir um Pull Request:
- Execute a ferramenta interativa de changeset a partir da raiz do repositório:
pnpm version:changeset
- Selecione o(s) pacote(s) que foram modificados utilizando a barra de espaço.
- Escolha o nível de SemVer apropriado (Major para alterações que quebram compatibilidade, Minor para novas funcionalidades retrocompatíveis ou Patch para correções de bugs).
- Forneça uma descrição técnica e clara da alteração (em inglês, em conformidade com nossos padrões de commit).
- Um arquivo markdown temporário será criado no diretório
.changeset/(por exemplo,.changeset/warm-dogs-run.md). - Comite esse arquivo markdown junto com seu código e envie-o com sua branch de funcionalidade.
Crie um changeset por alteração isolada. Se uma branch de funcionalidade contiver várias correções ou adições independentes, você pode executar pnpm version:changeset múltiplas vezes para gerar notas separadas para cada uma.
2. Pipeline de Versionamento Automatizado (GitHub Actions)
Nosso workflow de CI/CD gerencia o bump de versão de forma automatizada quando o código é integrado:
- Pull Request & Integração: Os desenvolvedores abrem um Pull Request direcionado à branch
develop. - Merge para
develop: Uma vez aprovado e mesclado nadevelop, o workflow de GitHub Actions Manage Version Bumps and Releases é acionado automaticamente. - Geração do PR de Release:
- O pipeline analisa os arquivos
.changeset/*.mdpresentes na branch. - Ele calcula as novas versões, consome (deleta) os arquivos markdown temporários de changeset, faz o bump dos respectivos arquivos
package.jsone atualiza os arquivos de changelog de cada pacote. - Ele comita essas mudanças automaticamente e abre (ou atualiza) um Pull Request no GitHub intitulado
chore(release): version packagescom destino à branchdevelop.
- O pipeline analisa os arquivos
3. Finalizando a Release (Apenas Mantenedores)
Para publicar e consolidar a release:
- Abra o Pull Request automatizado
chore(release): version packagesno GitHub. - Revise as alterações de versão e changelogs gerados.
- Faça o merge do Pull Request na branch
develop. Como os arquivos de changeset já foram consumidos e removidos, mesclar este PR consolida as novas versões de pacotes no repositório.
Nunca edite o campo "version" no package.json de um pacote manualmente durante o desenvolvimento de uma branch. Sempre use pnpm version:changeset e permita que o pipeline do GitHub Actions gerencie os lançamentos.
Correções Críticas (Hotfixes)
Se um bug for encontrado em produção:
git flow hotfix start fix-crash- Aplique a correção e finalize:
git flow hotfix finish fix-crash - Sincronize tanto a
mainquanto adevelop.
Práticas Proibidas
- Sem commits diretos na
mainoudevelop: Sempre use branches de funcionalidade e PRs. - Sem Force Pushes: A menos que seja em sua própria branch de funcionalidade isolada e necessário para um rebase.
- Sem Dirty Merges: Evite fazer merge da
mainde volta parafeature/*. Sempre faça rebase sobre adevelopse sua branch de funcionalidade ficar desatualizada.
A adesão a este fluxo de trabalho garante um histórico limpo e uma distribuição de software de alta qualidade.