Git Flow na prática: feature, release e hotfix
Um guia direto sobre o Git Flow: o papel de cada branch, os comandos de cada fluxo, nomes e versões, quando o modelo vale a pena e quando trunk-based ou GitHub Flow servem melhor.
Git Flow é um modelo de branches proposto por Vincent Driessen em 2010. A ideia é simples: cada branch tem um papel fixo. Isso deixa claro o que está em produção, o que vai entrar na próxima versão e o que é correção urgente.
Neste guia você vai ver para que serve cada branch, os comandos de cada fluxo, como nomear branches e versões, os erros mais comuns e em que tipo de projeto o modelo realmente ajuda.
Os branches do Git Flow
main: o que está em produção. Cada merge aqui vira uma versão, marcada com uma tag.develop: onde as features se encontram antes da próxima versão.feature/*: saem dadevelope voltam para adevelopquando ficam prontas.release/*: saem dadeveloppara preparar uma versão. Voltam para amaine para adevelop.hotfix/*: saem damainpara corrigir produção. Voltam para amaine para adevelop.
A main e a develop vivem para sempre. As outras são temporárias: nascem, cumprem o papel e são apagadas.
O fluxo de uma feature
Uma feature nasce da develop, recebe os commits do trabalho e volta para a develop com um merge:
git switch develop
git pull
git switch -c feature/login-sso
# commits da feature
git switch develop
git merge --no-ff feature/login-sso
git branch -d feature/login-sso
git push origin developO --no-ff cria um commit de merge mesmo quando o Git poderia só avançar o ponteiro. Assim o histórico mostra onde a feature começou e onde terminou, o que ajuda muito na hora de revisar ou reverter a feature inteira.
Em times que usam pull requests, o merge na develop costuma acontecer pelo GitHub, GitLab ou Azure DevOps, depois da revisão. A lógica é a mesma.
Fechando uma release
Quando a develop tem o que deve sair na próxima versão, abra um branch de release. A partir daí o escopo está congelado: entram só correções, ajuste de número de versão e changelog.
git switch -c release/1.4.0 develop
# ajustes finais, versão e changelog
git switch main
git merge --no-ff release/1.4.0
git tag -a v1.4.0 -m "Versão 1.4.0"
git switch develop
git merge --no-ff release/1.4.0
git branch -d release/1.4.0
git push origin main develop --tagsEnquanto a release está aberta, o time pode continuar abrindo features na develop. Elas só entram na versão seguinte.
Corrigindo produção com um hotfix
O hotfix segue a mesma lógica, mas parte da main, porque precisa corrigir exatamente o que está em produção:
git switch -c hotfix/1.4.1 main
# correção
git switch main
git merge --no-ff hotfix/1.4.1
git tag -a v1.4.1 -m "Versão 1.4.1"
git switch develop
git merge --no-ff hotfix/1.4.1
git branch -d hotfix/1.4.1Levar a correção para a develop é o passo mais esquecido. É ele que impede o bug de voltar na versão seguinte. Se houver uma release aberta, leve o hotfix para ela em vez da develop.
Nomes de branch e versões
- Use prefixos fixos:
feature/,release/ehotfix/. Ferramentas e pipelines dependem deles. - Na feature, descreva o assunto ou use o número da tarefa:
feature/login-ssooufeature/1234-login-sso. - Na release e no hotfix, use o número da versão:
release/1.4.0ehotfix/1.4.1. - Siga o versionamento semântico: o terceiro número sobe em correções, o segundo em novidades compatíveis e o primeiro em mudanças que quebram compatibilidade.
Git Flow, GitHub Flow ou trunk-based?
- Git Flow: bom para produtos com versões numeradas, apps desktop e mobile, bibliotecas e sistemas que mantêm mais de uma versão em paralelo.
- GitHub Flow: só a
maine branches curtos com pull request. Bom para aplicações web publicadas várias vezes por semana. - Trunk-based: todo mundo integra na
mainvárias vezes por dia, com feature flags para esconder o que não está pronto. Bom para times maduros com testes automatizados fortes.
Não existe modelo certo para todo mundo. Se o seu time publica em produção várias vezes por dia, o Git Flow vai parecer burocrático. Se você entrega versões para clientes instalarem, ele organiza muito o trabalho.
Os erros mais comuns
- Esquecer de levar o hotfix de volta para a
develop. - Deixar a release aberta por semanas, até ela virar uma segunda
develop. - Features que vivem muito tempo sem receber a
develope acumulam conflitos. - Fazer commits direto na
mainou nadevelop, sem passar por um branch. - Esquecer de criar a tag, o que deixa a versão em produção sem referência no histórico.
Git Flow no GitMuninn
No plano Pro, o GitMuninn inicia e conclui features, releases e hotfixes com os prefixos que o seu repositório já usa, sem decorar a sequência de comandos. E como cada branch tem uma cor no grafo, fica fácil ver se um hotfix já voltou para a develop ou se uma release ainda está aberta.

