Gitflow
Quando usar
- Acionar quando a pessoa pedir explicitamente o modelo Gitflow (branches
main/master,develop,feature/*,release/*,hotfix/*) ou quando já existir configuraçãogit flow(git config --get-regexp '^gitflow\.') ou instrução do projeto declarando essa escolha. - Acionar também para nomear, sequenciar ou fechar uma branch
feature/,release/ouhotfix/dentro de um projeto que já declarou Gitflow como estratégia de branch. - Não acionar para propor Gitflow a um projeto que não pediu isso — a escolha
do modelo de branch é decisão explícita de quem conduz o projeto, nunca
inferida pela presença de uma branch chamada
developou pelo volume de branches abertas. - Não acionar para resolver um conflito já em andamento
(
$specsfy-specialist-merge-conflict-resolution) nem para desenhar o pipeline ou a promoção de artefato entre ambientes ($specsfy-specialist-delivery-engineering) — aqui o foco é a topologia e a política das branches, não a resolução textual nem a entrega.
Fluxo
- Confirmar que a pessoa pediu Gitflow explicitamente, ou apontar a configuração/instrução existente que já declara essa escolha, antes de aplicar qualquer convenção — nunca presumir Gitflow a partir da estrutura do repositório.
- Verificar o estado real das branches (
git branch -a,git config --get-regexp '^gitflow\.') para saber semain/masteredevelopjá existem e se a nomenclatura das branches auxiliares já diverge do padrão adotado. - Definir com a pessoa os nomes das branches permanentes (
mainde produção,developde integração) e os prefixos das branches de vida curta (feature/,release/,hotfix/,support/quando aplicável). - Registrar a decisão como regra confirmada do projeto (
$specsfy-aux-rulesgrava em.specsfy/RULES.md), incluindo prefixos, branch-alvo de cada tipo e política de merge — não deixar a convenção apenas verbal. - Orientar a abertura, a integração e o fechamento de cada tipo de branch:
feature/*parte de e volta paradevelop;release/*parte dedevelope vai paramainedevelop;hotfix/*parte demaine vai paramainedevelop; sempre commerge --no-ff. - Coordenar a tag de versão no merge de
release/*ouhotfix/*emmain, alinhando com a estratégia de versionamento já adotada pelo projeto (semver ou outra). - Verificar que
developrecebeu de volta toda correção aplicada emrelease/*ouhotfix/*antes de considerar o ciclo fechado — divergência aqui reaparece como regressão no próximo release.
Padrões
- Usar
git merge --no-ffpara toda integração defeature/*,release/*ehotfix/*— merge fast-forward apaga o registro de que aquela branch existiu, do qual a auditoria de release do Gitflow depende. - Nomear com prefixo consistente e o mesmo separador em todo o projeto
(
feature/<slug>,release/<versao>,hotfix/<versao-ou-slug>); não misturar convenções (feature-xefeature/yno mesmo repositório). - Fazer
release/*ehotfix/*partirem exatamente do commit dedevelopoumaincorrespondente, sem cherry-pick seletivo de commits ainda não integrados. - Aplicar em
release/*somente correção de bug, texto, documentação e preparação de release (changelog, versão) — funcionalidade nova não entra numa branch de release já aberta; volta para a próximafeature/*. - Fechar todo
hotfix/*mesclando emmain(com tag) e emdevelop(ou narelease/*aberta, se houver uma) na mesma operação — hotfix que só chega emmaindesaparece do próximo release. - Apagar a branch de vida curta (
feature/*,release/*,hotfix/*) depois do merge confirmado nos dois destinos — branch finalizada e não apagada convida retrabalho sobre código já integrado.
Antipadrões
- Push direto ou merge fast-forward em
main/developsem passar porfeature/,release/ouhotfix/: quebra a rastreabilidade que justifica adotar Gitflow em vez de um modelo mais simples. - Funcionalidade nova adicionada dentro de uma
release/*já aberta "para aproveitar a janela": aumenta o escopo testado depois do corte e atrasa a liberação sem necessidade. - Hotfix mesclado apenas em
main, deixandodevelopdivergente: a próximarelease/*cortada dedevelopreintroduz o bug já corrigido em produção. - Adotar Gitflow num projeto com deploy contínuo várias vezes ao dia: a
sobrecarga de branches longas de
release/hotfixconflita com entrega contínua; nesse contexto, avalie com a pessoa se GitHub Flow ou trunk-based atende melhor antes de aplicar Gitflow por hábito. - Confundir "temos uma branch chamada develop" com "o projeto usa Gitflow": sem a política de merge, os prefixos e o ciclo de release completos, é apenas uma branch com esse nome, não o modelo.
Validação
git log --graph --oneline --all(ougit log --first-parent main) mostrando os merges--no-ffde cadafeature/,release/ouhotfix/como commits de merge identificáveis, não commits lineares indistinguíveis.git branch -a --merged developegit branch -a --merged mainconferidos antes de apagar uma branch de vida curta, garantindo que o merge realmente aconteceu nos dois destinos esperados.- Tag de versão presente em
mainpara cadarelease/*ouhotfix/*fechado (git tag --contains <commit-do-merge>), e a mesma correção presente emdevelop(git log develop --oneline | grep <commit>ou equivalente). .specsfy/RULES.md(ou instrução equivalente do projeto) registrando a convenção de nomes e a política de merge, revisitada por$specsfy-aux-rulesquando alguém a violar.- Não declarar "o projeto segue Gitflow" apenas porque existe uma branch
develop; a evidência exige prefixos consistentes, merges--no-ffrastreáveis e o ciclo derelease/hotfixfechado nos dois destinos.
Skills relacionadas
$specsfy-specialist-merge-conflict-resolutionquando uma integração defeature/,release/ouhotfix/já em andamento gerar conflito — esta skill decide a topologia e a política de branch, a outra resolve o conflito textual ou semântico já aberto.$specsfy-specialist-delivery-engineeringquando o merge emmainou a tag de release precisar disparar pipeline, build de artefato ou promoção entre ambientes — esta skill entrega a branch e a tag corretas, a outra decide como o pipeline reage a elas.
Leia references/standards.md para o mapa completo
de branches, os comandos git flow equivalentes em Git puro e as fontes
oficiais do modelo.