RFC-002: Adoção de Git Flow Simplificado com Rebase Obrigatório
| Campo | Valor |
|---|---|
| Status | Aprovada |
| Author | Arthur Ferreira |
| Created | 2026-01-15 |
| Updated | 2026-04-10 |
| Reunião | 2026-04-10 |
| Deciders | Todo o time técnico |
Status
Valores possíveis:
- 🟡 Draft: RFC em elaboração, ainda não apresentada
- 🔵 Em Revisão: RFC apresentada e em discussão na reunião
- ✅ Aprovada: RFC aprovada pelo time, pronta para implementação
- ❌ Rejeitada: RFC rejeitada após discussão
- 🟠 Deprecada: RFC anteriormente aprovada mas não mais válida
Contexto e Problema
Atualmente nosso fluxo Git não está formalmente documentado, podendo causar:
- Inconsistência: Cada desenvolvedor segue um fluxo diferente
- Confusão: Não está claro quando usar rebase vs merge
- Falta de clareza: Processo de hotfix não está definido
- Riscos: Deploys podem ir para produção sem passar por staging
- Dificuldade de onboarding: Novos membros não sabem qual fluxo seguir
- Histórico poluído: Uso de merge commits torna o histórico confuso e difícil de navegar
Por que resolver isso agora?
- Precisamos de previsibilidade nos deploys
- Necessidade de ambiente de staging estável
- Reduzir riscos de bugs em produção
- Histórico limpo facilita debugging e code review
Impacto de não resolver
- Continuar com processos informais e inconsistentes
- Alto risco de bugs em produção
- Dificuldade de rastrear o que está em cada ambiente
- Perda de tempo com conflitos e problemas de Mesclar o código
- Histórico Git confuso e difícil de navegar
Documentação relacionada:
- docs/development/git-workflow.md - Workflow atual
- docs/development/code-review.md - Processo de review
Proposta de Solução
Adotar Git Flow Simplificado com duas branches principais e rebase obrigatório para sincronização:
dev→ Ambiente staging (Testes)main→ Ambiente production (código estável e aprovado)
Visão Geral
gitGraph
commit id: "Initial setup"
branch dev
checkout dev
commit id: "Dev base"
branch feature-123
checkout feature-123
commit id: "WIP: Feature"
commit id: "Complete feature"
checkout dev
merge feature-123 id: "PR approved" tag: "Deploy staging"
commit id: "Testing in staging"
checkout main
merge dev id: "PR to prod" tag: "Deploy production"
branch hotfix-critical
checkout hotfix-critical
commit id: "Fix critical bug"
checkout main
merge hotfix-critical id: "Hotfix PR" tag: "Deploy prod"
checkout dev
merge main id: "Sync dev with main"
Fluxo de Feature
- Branch a partir de
dev:feature/ISSUE-123-description - Desenvolver a feature
- Rebase com
devantes do PR (OBRIGATÓRIO) - PR para
dev(code review + CI) - Deploy automático para staging
- Testes com sucesso
- PR de
devparamain - Deploy para production
Fluxo de Hotfix
- Branch a partir de
main:hotfix/bug-description - Corrigir o bug
- PR para
main(fast-track se crítico) - Deploy para production
- Rebase
devcommain(OBRIGATÓRIO) - Deploy para staging
Regras Fundamentais
- ✅ Sempre usar rebase (NUNCA merge) para sincronizar branches
- ✅ PRs obrigatórios para
devemain - ✅ CI deve passar antes do merge
- ✅ Feature branches de curta duração (máx 1 sprint)
- ✅ Commits seguem Conventional Commits:
type(scope): message - ✅ Rebase interativo para limpar histórico antes do PR
Rebase: Regra Obrigatória
Por que Rebase ao invés de Merge?
Benefícios do Rebase:
- ✅ Histórico linear e limpo: Fácil de entender a evolução do código
- ✅ Commits organizados cronologicamente: Ordem natural dos eventos
- ✅ Facilita code review: Reviewer vê mudanças em sequência lógica
- ✅ Reverts mais seguros: Reverter commits é mais previsível
- ✅ Integração contínua real: Código sempre testado em cima da versão mais recente
Problemas do Merge:
- ❌ Histórico poluído: Merge commits criam "diamantes" no grafo
- ❌ Difícil de navegar:
git logfica confuso com múltiplos merges - ❌ Conflitos postergados: Problemas só aparecem no merge final
- ❌ Code review difícil: Mudanças espalhadas em múltiplos commits de merge
Fluxo 1: Feature
1. Criar Feature Apartir da Branch de Dev
# Certifique-se de estar em dev atualizada
git checkout dev
git pull origin dev
# Criar branch da feature
git checkout -b feature/ISSUE-123-add-user-authentication
Nomenclatura de branches:
feature/ISSUE-123-description- Nova funcionalidaderefactor/improve-performance- Refatoraçãodocs/update-api-docs- Apenas documentação
2. Desenvolver
# Fazer alterações no código
# Adicionar testes
# Atualizar documentação
# Commits frequentes e atômicos
git add .
git commit -m "feat(auth): add JWT token generation
- Implement JWT token service
- Add token expiration logic
- Add tests for token generation
Implements #123"
Convenção de Commits (Conventional Commits):
Types:
feat: Nova funcionalidadedocs: Documentaçãostyle: Formatação (não afeta código)refactor: Refatoraçãotest: Adicionar/modificar testeschore: Manutenção, deps, config
Exemplos:
git commit -m "feat(auth): add JWT validation"
git commit -m "docs(readme): update setup instructions"
git commit -m "test(users): add integration tests for user creation"
3. Sincronizar com dev (Rebase)
Antes de abrir PR, sincronize com dev usando rebase:
# Buscar últimas mudanças
git fetch origin
# Rebase sua branch com dev
git rebase origin/dev
# Se houver conflitos:
# 1. Resolver conflitos nos arquivos
# 2. git add <arquivos-resolvidos>
# 3. git rebase --continue
# 4. Repetir até finalizar rebase
4. Push e Abrir PR
# Push da branch (primeira vez)
git push origin feature/ISSUE-123-add-user-authentication
# Se já fez push antes e fez rebase:
git push origin feature/ISSUE-123-add-user-authentication --force-with-lease
Abrir PR no CodeCommit da Aws:
- Acesse repositório no CodeCommit
- Clique em "Pull requests"
- Clique em Create pull request
- selecione o source(Sua branch criada para desenvolver) para o Destination(dev) e clique em compare.
- Preencha template do PR:
- Título claro
-
Descrição do que foi feito
-
Clique em "Create pull request"
5. Code Review
Aguarde o Code Review Ver guia de Code Review →
6. Merge e Deploy
Após aprovação:
- Merge via CodeCommit (rebase)
- Branch deve ser marcada para deletar automaticamente
- Sempre fazer o merge com "Fast forward merge"
- CI/CD faz deploy automático para staging
- Teste sua feature em staging
7. Deploy para Produção
Quando staging estiver testado e aprovado:
Repita o processo, mas não exclua a branch de DEV:
- Abrir o PR de dev para main.
- Code Review
- Merge e Deploy
Fluxo 2: Hotfix (Produção)
Para bugs críticos em produção que não podem esperar:
1. Criar Hotfix Branch
# Branch a partir de main
git checkout main
git pull origin main
git checkout -b hotfix/fix-critical-payment-bug
Nomenclatura de branches:
- hotfix/ISSUE-456-bug-description - Bug fix(Utilizado somente no fluxo de hotfix)
2. Implementar Fix
# Fazer correção mínima necessária
# Adicionar teste que reproduz o bug
# Verificar que fix resolve o problema
git add .
git commit -m "fix(payment): prevent duplicate charge
- Add idempotency check
- Add test for duplicate payment scenario
Fixes #789 (CRITICAL)"
Convenção de Commits (Conventional Commits):
Types:
fix: Bug fix
Exemplos:
3. PR para main
Abrir PR:
- Source:
branch criado para o hotfix - Destination:
main - Preencher titulo e descrição.
- Aguardar code review
4. Deploy para Produção
- Deploy automático para production após aprovação do code review
- Monitorar intensivamente por 30 minutos
- Verificar que bug foi resolvido
5. Sincronizar dev
IMPORTANTE: Após hotfix em main, sincronizar dev:
git checkout dev
git pull origin dev
git rebase origin/main
git push origin dev --force-with-lease
# Isso garante que dev tem o hotfix também
Deploy automático para staging ocorre após push.
Comandos uteis
Atualizar a branch criada com a branch dev
# No seu feature branch
git checkout feature/ISSUE-123-description
# Buscar últimas mudanças
git fetch origin
# Rebase com dev
git rebase origin/dev
# Se tiver conflitos, resolver e continuar
# (ver seção "Resolvendo Conflitos")
# Force push (branch pessoal, ok fazer force push)
git push origin feature/ISSUE-123-description --force-with-lease
Boas Práticas de Rebase
DO ✅:
- Fazer rebase frequentemente (diariamente se dev está ativo)
- Usar
--force-with-leaseao invés de--force - Resolver conflitos localmente, testar, depois push
- Fazer commits atômicos que passam testes
- Usar mensagens de commit descritivas
DON'T ❌:
- Fazer rebase sem atualizar as branchs
- Usar
--forcesem o--lease(pode sobrescrever trabalho de outros) - Rebase depois que PR já foi aprovado e revisado
- Reescrever histórico de commits já mergeados em main
- Fazer force push em branches compartilhadas
Git Aliases Úteis
Adicionar ao ~/.gitconfig:
[alias]
# Rebase shortcuts
rb = rebase
rbi = rebase -i
rbc = rebase --continue
rba = rebase --abort
# Update feature branch com dev
update = !git fetch origin && git rebase origin/dev
# Limpar histórico
cleanup = rebase -i origin/dev
# Force push seguro
pushf = push --force-with-lease
# Log bonito
lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
Alternativas Consideradas
Opção 1: Trunk-based Development
Descrição: Uma única branch main, feature flags para controlar releases
Prós: - Mais simples e ágil - Integração contínua verdadeira - Menos overhead de branches
Contras: - Requer feature flags implementadas (não temos) - Arriscado sem testes automatizados robustos (ainda estamos construindo) - Difícil reverter features parciais - Curva de aprendizado para o time
Custo/Esforço: Médio (requer implementar feature flags)
Por que não escolhemos: Não temos infraestrutura de feature flags e testes suficientes ainda.
Opção 2: Git Flow Completo
Descrição: Branches develop, main, release, hotfix, feature
Prós: - Muito estruturado e bem documentado - Suporta múltiplas releases simultâneas - Processo maduro e testado
Contras: - Overhead para time pequeno (2-5 pessoas) - Release branches desnecessárias (fazemos release contínuo) - Complexidade adicional sem benefício proporcional - Mais difícil de aprender e manter
Custo/Esforço: Alto (complexidade desnecessária)
Por que não escolhemos: Muita complexidade para nosso tamanho de time e cadência de releases.
Opção 3: GitHub Flow
Descrição: Apenas main, feature branches com deploy direto
Prós: - Muito simples - Usado por grandes empresas (GitHub, etc.) - Documentação abundante
Contras: - Não tem staging explícito - Todo PR vai direto para produção - Difícil fazer QA manual antes de produção
Custo/Esforço: Baixo
Por que não escolhemos: Precisamos de um ambiente de staging para QA manual.
Opção 4: Merge ao invés de Rebase
Descrição: Usar merge commits para sincronizar branches
Prós: - Mais familiar para alguns desenvolvedores - Preserva histórico completo (incluindo merges) - Não requer force push
Contras: - Histórico poluído com merge commits - Difícil navegar no git log - Code review mais difícil - Bisect menos efetivo
Custo/Esforço: Baixo
Por que não escolhemos: Rebase oferece histórico muito mais limpo e facilita manutenção do código.
Análise de Impacto
Impacto Técnico
Times afetados: - Todo time de desenvolvimento - Testes precisam usar staging consistentemente
Sistemas afetados: - CI/CD pipelines precisam ser atualizados - Proteção de branches no CodeCommit - Webhooks de deploy (se houver)
Dependências: - Configurar CI/CD para ambas as branches - Documentar processo para o time (incluindo rebase) - Treinar novos membros em workflow de rebase - Criar aliases e ferramentas para facilitar rebase
Impacto em Negócio
- ✅ Redução de bugs em produção
- ✅ Maior previsibilidade de deploys
- ✅ Time de People pode testar em ambiente estável
- ✅ Histórico limpo facilita debugging
- ✅ Code review mais eficiente
- ⚠️ Processo de deploy ligeiramente mais longo (mas mais seguro)
- ⚠️ Curva de aprendizado para rebase (1-2 semanas)
Riscos Identificados
Risco 1: Time pode esquecer de fazer rebase
- Mitigação: Documentação clara + code review + pre-commit hook que detecta merges
- Impacto: Médio
- Probabilidade: Baixa
Risco 2: Conflitos de rebase mais frequentes
- Mitigação: Feature branches de curta duração, rebase frequente (diário)
- Impacto: Baixo
- Probabilidade: Média
Risco 3: Dev e main podem divergir
- Mitigação: PRs de dev→main frequentes, monitoramento
- Impacto: Médio
- Probabilidade: Baixa
Risco 4: Force push acidental em branch compartilhada
- Mitigação: Proteção de branches, usar
--force-with-lease - Impacto: Alto
- Probabilidade: Muito Baixa
Plano de Implementação
Fase 1: Configuração (Semana 1)
Tasks:
- Documentar processo no
development/git-workflow.md - Padronizar todos os projetos com as branchs principais
- Configurar proteção de branches (
devemain) - Atualizar CI/CD para suportar ambas as branches
- Criar PR template com checklist incluindo rebase
- Criar git aliases úteis e distribuir para o time
Responsável: Arthur Ferreira Prazo estimado: 3 dias
Fase 2: Migração (Semana 1-2)
Tasks:
- Configurar deploy automático de
devpara staging - Testar fluxo completo com feature de teste
- Migrar PRs abertos para o novo fluxo
Responsável: Arthur Ferreira Prazo estimado: 4 dias
Fase 3: Monitoramento (Semanas 3-4)
Tasks:
- Monitorar adoção do processo
- Acompanhar casos de conflito de rebase
- Coletar feedback do time sobre rebase
- Ajustar documentação conforme necessário
- Resolver dúvidas e problemas
- Pair programming para casos difíceis de rebase
Responsável: Todo o time
Prazo estimado: Contínuo
Métricas de Sucesso
Após 1 mês
- ✅ 100% dos PRs seguem o novo fluxo
- ✅ Zero deploys acidentais em produção
- ✅ Staging reflete sempre a branch
dev - ✅ Time se sente confortável com o processo
- ✅ 90%+ dos PRs usam rebase corretamente
- ✅ Histórico Git permanece linear em dev e main
Após 3 meses
- ✅ Tempo médio de deploy reduzido (menos rollbacks)
- ✅ Onboarding de novos devs mais rápido
- ✅ Zero confusão sobre qual fluxo seguir
- ✅ 100% dos PRs usam rebase
- ✅ Code review 30% mais rápido (histórico linear)
- ✅ Zero merge commits em histórico de dev/main
Decisão da Reunião
Data da Reunião: 10/04/2026
Participantes:
- Maria Alice
- Igor Santiago
- Marcio vignoli
- Arthur Ferreira
Discussão Principal:
Revisão e aprovação da proposta de um fluxo Git simplificado focou em branches principais, processos de desenvolvimento e regras fundamentais para consistência.
Fluxo Git Simplificado Proposto A reunião começou com a introdução de um fluxo Git simplificado para resolver problemas atuais, melhorar o histórico de código e garantir maior clareza processual. Foi acordado que a documentação seria ajustada para formalizar o fluxo e esclarecer o uso de rebase versus merge.
Definição de Branches Principais A proposta estabeleceu as branches dev para stage/testes e main como código estável em produção, exigindo Pull Request e code review obrigatórios para ambas. Também foram definidos fluxos separados para features (a partir de dev) e hotfixes (a partir de main) para gerenciar o desenvolvimento.
Regras e Sincronização de Branches Foi decidido utilizar rebase em vez de merge para sincronização e limitar feature branches a um prazo máximo de 1 sprint (15 dias) para garantir que sejam de curta duração. A documentação será ajustada, removendo repetições e integrando um link para o guia formal de Code Review.
Feedback Recebido:
- Igor Santiago, informou que havia muito conteúdo repetido e que poderia ser revisto e simplificado
- Todos concordaram com a revisão e aprovação
Ações Requeridas (se aplicável):
- Arthur ficou responsavel de revisar e ajustar o documento.
Resultado: Aprovada