Git Flow vs. Trunk Based Development: Qual estratégia de branch usar?
Introdução
O desenvolvimento de software é um processo contínuo que envolve a criação, manutenção e evolução de sistemas complexos. Com o tempo, as equipes de desenvolvedores têm buscado formas eficientes e escaláveis para gerenciar seu código-fonte e processos de trabalho. Nesse contexto, duas estratégias de branchagem ganharam destaque: Git Flow e Trunk-Based Development (TBD). Essas abordagens pretendem melhorar a produtividade, reduzir conflitos e facilitar a colaboração em projetos de software. Neste artigo, vamos explorar as principais características das estratégias Git Flow e TBD para ajudá-lo a decidir qual é a mais adequada para sua equipe.
Ao ler este artigo, você aprenderá sobre os pontos fortes e fracos das duas estratégias, além de entender como elas podem ser implementadas em seu projeto. Além disso, você receberá dicas práticas para ajudá-lo a escolher a melhor abordagem para sua equipe.
O que é e por que importa
O Git Flow e o Trunk-Based Development são estratégias de branchagem utilizadas no desenvolvimento de software para gerenciar a vida cíclica do código-fonte. Elas visam proporcionar maior produtividade, reduzir conflitos entre colaboradores e facilitar a colaboração.
Git Flow
O Git Flow é uma abordagem que utiliza múltiplas branches para o desenvolvimento de software. As principais características incluem:
- Ramificação Master: Armazena a versão mais recente do código-fonte.
- Ramificação Develop: Representa a última versão estável do código-fonte.
- Feature Branches: Cada uma delas é dedicada ao desenvolvimento de uma nova funcionalidade específica.
- Release Branches: São utilizadas para liberar uma versão específica do software.
O Git Flow foi projetado para fornecer uma estrutura rigorosa e escalável, adequada para grandes equipes. Porém, pode se tornar complexo devido à necessidade de manter múltiplas branches sincronizadas.
Trunk-Based Development (TBD)
Por outro lado, o Trunk-Based Development utiliza apenas uma única branch principal, conhecida como trunk, que é atualizada com frequência. O desenvolvimento ocorre diretamente na trunk. As principais características incluem:
- Branches de Desenvolvimento: São criadas ocasionalmente para realizar alterações específicas.
- Merges: Eventos que ocorrem quando a branch de desenvolvimento é integrada à trunk.
O TBD foi projetado para promover uma abordagem mais simples e flexível, adequada para equipes menores ou com processos de trabalho mais estáveis.
Como funciona na prática
Git Flow
Ciclo de Desenvolvimento:
- Criar uma feature branch a partir da branch
develop. - Realizar alterações e desenvolver funcionalidades.
- Revisar e testar as alterações no ambiente de desenvolvimento.
- Solicitar revisão de outros colaboradores ou gerentes.
- Receber feedback e realizar ajustes necessários.
Integração na branch develop:
- Realizar merge da feature branch na branch
develop. - Resolver conflitos, se necessário.
- Manter a branch
developatualizada com as últimas alterações.
Ciclo de Liberação:
- Criar uma release branch a partir da branch
develop. - Realizar testes e depuração na branch de liberação.
- Preparar pacotes ou artefatos para distribuição.
- Liberar a versão atualizada do software.
Trunk-Based Development
Ciclo de Desenvolvimento:
- Criar uma branch de desenvolvimento a partir da trunk.
- Realizar alterações e desenvolver funcionalidades.
- Revisar e testar as alterações no ambiente de desenvolvimento.
- Solicitar revisão de outros colaboradores ou gerentes.
Integração na trunk:
- Realizar merge da branch de desenvolvimento na trunk.
- Resolver conflitos, se necessário.
Requisitos:
- As branches de desenvolvimento devem ser criadas somente quando necessário.
- A trunk deve ser atualizada com frequência.
Exemplo real
Git Flow: Um exemplo de Ciclo de Desenvolvimento e Liberação
Vamos supor que estamos trabalhando em uma aplicação web chamada MyBlog. Nossa equipe utiliza o Git Flow para gerenciar as alterações do código.
// Criação da feature branch "feature/new-post" a partir da branch develop
git checkout -b feature/new-post develop
// Alterações feitas na feature branch...
// Revisão e testes no ambiente de desenvolvimento
// Solicitação de revisão para outros colaboradores
// Revisões e ajustes necessários
// Merging da feature branch na develop
git checkout develop
git merge --no-ff feature/new-post
// Resolve conflitos se houver
// Liberar a versão atualizada do software (versão 1.2)
git checkout -b release/1.2 develop
git merge --no-ff release/1.2
// Preparação para distribuição (criação de pacotes, etc.)
// Liberação da versão atualizada do software (versão 1.2)
git tag -a v1.2
Trunk-Based Development: Um exemplo de Ciclo de Desenvolvimento
Agora, vamos considerar uma equipe utilizando o desenvolvimento com tronco para gerenciar suas alterações.
// Criação da branch de desenvolvimento "feature/new-post" a partir do tronco (master)
git checkout -b feature/new-post master
// Alterações feitas na branch de desenvolvimento...
// Revisão e testes no ambiente de desenvolvimento
// Solicitação de revisão para outros colaboradores
// Revisões e ajustes necessários...
// Merging da branch de desenvolvimento na trunk (master)
git checkout master
git merge --no-ff feature/new-post
// Resolve conflitos se houver
Esse exemplo mostra como ambos os métodos podem ser usados para desenvolver funcionalidades em uma aplicação. O Git Flow é mais adequado quando você tem um ciclo de vida de desenvolvimento mais complexo com diferentes equipes e requisitos específicos. Já o Trunk-Based Development é simples e pode funcionar bem em equipe menores ou que precisam gerenciar alterações de forma mais flexível.
Boas práticas
Trabalho em equipe e comunicação eficaz
- Faça revisões de código frequentes entre desenvolvedores para garantir consistência e qualidade do código.
- Estabeleça critérios claros para a aceitação de alterações, incluindo testes automatizados e revisão manual por outros desenvolvedores.
- Utilize ferramentas de colaboração como pull requests, comentários e discussões para garantir que todas as vozes sejam ouvidas.
Gerenciamento de branch e fluxo de trabalho
- Mantenha um padrão consistente para nomes de branches, incluindo nomeações claras do tipo de alteração (por exemplo, "feature/new-post").
- Utilize Git Flow ou Trunk-Based Development de acordo com as necessidades da equipe, garantindo que todos os membros entenda o fluxo de trabalho.
- Automatize a criação de tags e release na branch master após a conclusão de um ciclo de desenvolvimento.
Monitoramento e feedback
- Utilize ferramentas de monitoramento para rastrear problemas no código, como linter, sonarcloud ou codecov.
- Estabeleça práticas regular de revisões de código para garantir que todas as alterações estejam sob revisão.
- Priorize a automatização das tarefas possíveis e utilize ferramentas de Continuous Integration/Continuous Deployment (CI/CD) para otimizar os ciclos de desenvolvimento.
Armadilhas comuns
Branches paralelas sem fluxo claro
- Criação excessiva de branches sem um fluxo claro pode levar a confusão e problemas de merge. Evite criar novas branches apenas por necessidade temporária, em vez disso utilize branchs existente para alterações que não estão na diretoria principal do desenvolvimento.
- Dificuldade ao mergear alterações pode causar conflitos graves, especialmente se a equipe estiver trabalhando em diferentes áreas da aplicação.
Falta de revisões
- Não fazer revisões regulares entre colaboradores pode levar a problemas de qualidade no código e também à falta de segurança.
- A falta de regras claras para as revisões pode gerar confusão dentro da equipe, levando à baixa produtividade.
Conclusão
- A escolha entre Git Flow e Trunk-Based Development depende das necessidades específicas da equipe, mas ambos oferecem fluxos de trabalho que permitem a colaboração eficaz.
- Importante que os membros da equipe estejam alinhados com o fluxo de trabalho utilizado para evitar conflitos e melhorar a produtividade.
- Para garantir a qualidade do código é fundamental estabelecer práticas regulares de revisões, monitoramento e feedback em todos os ciclos de desenvolvimento.
- Considerar implementar automatizações de tarefas possíveis e utilizar ferramentas de CI/CD para otimizar os ciclos de desenvolvimento.
- Para aprofundar conhecimento sobre as estratégias de branch, consulte-se sobre o Git Flow e Trunk-Based Development, e também aprenda mais sobre práticas de desenvolvimento ágil.
Referências
- Gitflow: https://www.atlassian.com/br/git/tutorials/comparing-workflows/gitflow-workflow
- Trunk-Based Development: https://www.thoughtworks.com/pt-br/articles/trabalho-na-prancha-tronco
- Martin Fowler - Git Workflow Strategies: https://martinfowler.com/bliki/GitWorkflowStrategies.html
- Atlassian - Comparing Workflows: https://www.atlassian.com/br/git/tutorials/comparing-workflows
- ThoughtWorks - Trabalho na Prancha-Tronco: https://www.thoughtworks.com/pt-br/articles/trabalho-na-prancha-tronco