Git Flow vs. Trunk Based Development: qual estratégia de branch usar
1. Introdução às Estratégias de Branch no Git
Estratégias de branch no Git são padrões organizacionais que definem como os desenvolvedores criam, nomeiam e mesclam branches durante o ciclo de vida do software. Escolher a estratégia correta é crucial porque impacta diretamente a velocidade de entrega, a qualidade do código e a colaboração da equipe. Duas abordagens antagônicas dominam o debate atual: Git Flow, com sua estrutura rígida e múltiplos branches, e Trunk Based Development (TBD), que prega simplicidade e integração contínua.
Enquanto o Git Flow é ideal para projetos de longo prazo com releases programadas, o TBD brilha em cenários de entrega contínua, onde deploys múltiplos por dia são a norma. A escolha entre eles não é apenas técnica, mas também cultural e organizacional.
2. Git Flow: Estrutura e Funcionamento
Proposto por Vincent Driessen em 2010, o Git Flow define cinco tipos de branches:
main: contém o código de produção, sempre estáveldevelop: branch de integração para o próximo releasefeature/: branches criados a partir dedeveloppara novas funcionalidadesrelease/: preparação de uma nova versão a partir dedevelophotfix/: correções urgentes a partir demain
O fluxo típico funciona assim:
# Iniciar uma nova feature
git checkout develop
git checkout -b feature/nova-funcionalidade
# Desenvolver e commitar
git add .
git commit -m "Implementa nova funcionalidade"
# Finalizar a feature (merge em develop)
git checkout develop
git merge --no-ff feature/nova-funcionalidade
# Iniciar um release
git checkout develop
git checkout -b release/1.2.0
# Finalizar o release (merge em main e develop)
git checkout main
git merge --no-ff release/1.2.0
git tag -a 1.2.0 -m "Versão 1.2.0"
git checkout develop
git merge --no-ff release/1.2.0
Vantagens:
- Controle granular sobre releases com branches dedicados
- Suporte a múltiplas versões simultâneas (ideal para manutenção de versões legadas)
- Separação clara entre código em desenvolvimento e código estável
3. Trunk Based Development (TBD): Simplicidade e Velocidade
O TBD, defendido por Paul Hammant e a equipe do Google, propõe que todos os desenvolvedores trabalhem em um único branch principal (trunk ou main). As práticas essenciais incluem:
- Commits pequenos e frequentes (idealmente várias vezes ao dia)
- Feature flags para isolar código incompleto
- Testes automatizados robustos para garantir que o trunk nunca quebre
Exemplo de fluxo TBD:
# Atualizar o trunk local
git checkout main
git pull origin main
# Fazer alterações diretamente ou via branch curto
git checkout -b ajuste-pequeno
git add .
git commit -m "Ajusta validação de email"
git checkout main
git merge ajuste-pequeno
git push origin main
Com feature flags, o código incompleto é desabilitado em produção:
// Exemplo de feature flag em JavaScript
if (featureFlags.isEnabled('nova-funcionalidade')) {
executarNovoFluxo();
} else {
executarFluxoAntigo();
}
Vantagens:
- Integração contínua real: código é integrado ao trunk várias vezes ao dia
- Redução drástica de conflitos de merge (branches duram horas, não dias)
- Ciclos de feedback rápidos: problemas são detectados minutos após o commit
4. Comparação Direta: Quando Usar Cada Estratégia
| Critério | Git Flow | Trunk Based Development |
|---|---|---|
| Tamanho da equipe | Times grandes e distribuídos | Squads ágeis pequenos (até 10 pessoas) |
| Frequência de releases | Programadas (semanal/mensal) | Múltiplos deploys por dia |
| Complexidade do projeto | Produtos com suporte a versões legadas | SaaS e aplicações web modernas |
| Maturidade do processo | Equipes maduras com processos bem definidos | Equipes experientes em CI/CD |
| Tolerância a riscos | Baixa (releases controladas) | Alta (rollback rápido via feature flags) |
Git Flow é recomendado quando:
- Você mantém versões antigas do software para clientes específicos
- O ciclo de release é longo (semanas ou meses)
- A equipe é grande e distribuída geograficamente
TBD é recomendado quando:
- Você faz deploys múltiplas vezes ao dia
- A equipe é pequena e co-localizada
- O produto é um SaaS ou aplicação web sem versões legadas
5. Desafios e Armadilhas Comuns
Git Flow:
- Branches longos geram conflitos massivos e dificuldade de integração
- Complexidade desnecessária para equipes pequenas
- Dificuldade em fazer hotfixes rápidos sem interromper o fluxo
TBD:
- Exige disciplina rigorosa em testes automatizados (cobertura acima de 80%)
- Feature flags precisam ser gerenciadas e removidas após estabilização
- Qualquer commit quebrado no trunk afeta toda a equipe imediatamente
Mitigação:
- Use pull requests curtos (máximo 200 linhas) com revisão obrigatória
- Implemente pipelines de CI/CD robustos com testes unitários, de integração e E2E
- Estabeleça branch policies que bloqueiem merges sem aprovação e sem testes verdes
6. Híbrido e Adaptações: Estratégias Personalizadas
GitHub Flow: simplificação do Git Flow com apenas main e feature branches. Ideal para equipes que querem mais estrutura que o TBD puro, mas menos complexidade que o Git Flow.
# Fluxo GitHub Flow
git checkout -b feature/ajuste-ui
git commit -m "Ajusta layout responsivo"
git push origin feature/ajuste-ui
# Abrir Pull Request no GitHub
# Após aprovação, fazer merge em main
git checkout main
git pull origin main
GitLab Flow: combina branches de ambiente (ex.: staging, production) com trunk. Útil quando há necessidade de ambientes intermediários antes da produção.
A chave é adaptar a estratégia à cultura da empresa sem rigidez dogmática. Muitas equipes bem-sucedidas usam uma abordagem híbrida: TBD para o dia a dia com branches de release para versões específicas.
7. Implementação Prática: Exemplos de Comandos e Ferramentas
Git Flow com Git Extensions (instale git-flow primeiro):
# Inicializar git-flow no repositório
git flow init
# Iniciar uma feature
git flow feature start autenticacao-2fa
# Finalizar a feature (merge automático em develop)
git flow feature finish autenticacao-2fa
# Iniciar um release
git flow release start 2.0.0
# Finalizar o release (merge em main e develop, com tag)
git flow release finish 2.0.0
TBD com proteção de branch no GitHub:
# Configurar branch protection rule via GitHub CLI
gh api repos/:owner/:repo/branches/main/protection \
--method PUT \
--field required_status_checks='{"strict":true,"contexts":["continuous-integration/jenkins","code-review"]}' \
--field enforce_admins=true \
--field required_pull_request_reviews='{"required_approving_review_count":1}'
Feature flags com LaunchDarkly (exemplo em Python):
import ldclient
from ldclient.config import Config
ldclient.set_config(Config("sdk-key-12345"))
client = ldclient.get_client()
if client.variation("nova-funcionalidade", {"key": "user-1"}, False):
print("Nova funcionalidade ativada")
else:
print("Fluxo antigo")
8. Conclusão e Recomendações Finais
A escolha entre Git Flow e Trunk Based Development resume-se a um trade-off entre complexidade vs. simplicidade e controle vs. velocidade. O Git Flow oferece controle granular sobre releases e suporte a múltiplas versões, mas com custo de complexidade operacional. O TBD oferece velocidade e integração contínua real, mas exige disciplina técnica e cultural.
Critérios objetivos para escolha:
1. Frequência de deploy: se for diária ou múltiplas vezes ao dia, escolha TBD
2. Maturidade da equipe: times experientes em CI/CD se beneficiam mais do TBD
3. Suporte a versões: se você precisa manter versões antigas, Git Flow é quase obrigatório
Minha recomendação final: comece com TBD se a equipe tiver até 10 pessoas e o produto for SaaS. Evolua para Git Flow (ou um híbrido como GitHub Flow) conforme a equipe crescer e a necessidade de suporte a versões surgir. Lembre-se: a melhor estratégia é aquela que sua equipe consegue seguir consistentemente.
Referências
- Git Flow — Documentação oficial de Vincent Driessen — Artigo original que definiu o modelo Git Flow, com diagramas e explicações detalhadas
- Trunk Based Development — Guia completo de Paul Hammant — Site de referência sobre TBD, com práticas, exemplos e estudos de caso
- GitHub Flow — Documentação oficial do GitHub — Guia prático do fluxo simplificado do GitHub, com exemplos de pull requests
- GitLab Flow — Documentação oficial do GitLab — Explicação do modelo híbrido do GitLab, combinando branches de ambiente com trunk
- Feature Flags — Guia da LaunchDarkly — Artigo sobre como implementar feature flags para suportar TBD e deploys seguros
- Continuous Delivery — Livro de Jez Humble e David Farley — Referência fundamental sobre práticas de CI/CD que sustentam tanto Git Flow quanto TBD