Fluxo de trabalho Git para desenvolvedores PHP: como parar de temer conflitos e amar a revisão de código
\n\nVocê já passou meio dia fazendo merge de branches para acabar com um "erro fatal" em produção? Ou talvez seu colega tenha enviado código "cru" diretamente para o master, e você só descobriu quando o site caiu? Se sim — bem-vindo ao clube. Mas a boa notícia é que 90% desses problemas são resolvidos com um fluxo de trabalho Git para desenvolvedores PHP adequado.
\n\nNeste artigo, não vamos apenas recontar a documentação. Vamos abordar cenários reais: como organizar branches, quando usar rebase e quando usar merge, e como configurar processos para que a equipe não se perca nos commits. Vamos nessa!
\n\nPor que "simplesmente git add . && git push" é prejudicial
\n\nMuitos desenvolvedores PHP, especialmente no início, usam o Git como um "pendrive na nuvem". Eles commitam tudo de qualquer jeito, não escrevem mensagens significativas e enviam diretamente para o master. Isso funciona até o primeiro conflito ou até o momento em que é necessário reverter uma alteração.
\n\nUm fluxo de trabalho git php correto deve resolver três problemas:
\n- \n
- Isolamento de alterações — para que uma funcionalidade ou correção de bug não quebre o código em funcionamento. \n
- Transparência — para que qualquer desenvolvedor entenda o que está acontecendo no projeto. \n
- Automação — para que testes e linters sejam executados antes do código chegar à produção. \n
Vamos ver como implementar isso na prática.
\n\nEscolhendo uma estratégia de ramificação: Git Flow, GitHub Flow ou algo próprio?
\n\nPara projetos PHP, não existe uma resposta única. Tudo depende do tamanho da equipe e da frequência de lançamentos. Mas existem dois modelos populares.
\n\nGit Flow — clássico para grandes projetos
\n\nSe você trabalha em uma aplicação monolítica com versões bem definidas (por exemplo, lançamento uma vez por mês), o Git Flow é a sua escolha. Branches principais:
\n- \n
master— apenas código estável, correspondente à produção. \n develop— branch de integração para todas as funcionalidades. \n feature/*— cada nova funcionalidade. \n release/*— preparação para o lançamento. \n hotfix/*— correções urgentes. \n
Exemplo para um desenvolvedor PHP: você está escrevendo um módulo de pagamento. Cria o branch feature/payment-module a partir de develop. Após a conclusão — pull request para develop. Quando funcionalidades suficientes forem acumuladas — cria release/2.3.0, onde apenas correções de bugs são feitas. Em seguida, faz merge em master e develop.
GitHub Flow — para iterações rápidas
\n\nSe você tem microsserviços ou faz deploy várias vezes ao dia, o GitHub Flow é mais simples:
\n- \n
main(oumaster) — sempre pronto para deploy. \n - Qualquer outro branch — para funcionalidade ou correção de bug. \n
- Após o pull request e a revisão — merge imediato em
main. \n
Para PHP, isso é especialmente conveniente quando você tem CI/CD configurado: após o merge em main, os testes e o deploy para staging ou produção são executados automaticamente.
\n\nEscrevendo commits significativos: exemplos em PHP
\n\nUm commit não é apenas "salvar". É um documento pelo qual você e seus colegas reconstruirão o histórico. Use conventional commits:
\n\nfeat: add payment processing via Stripe\nfix: correct SQL query in user repository\nrefactor: extract validation logic to trait\n\n\nAgora imagine que você está trabalhando em um projeto PHP com Laravel. Suponha que você adicionou um novo comando Artisan. Qual commit seria útil?
\n\nfeat: add artisan command to sync expired subscriptions\n\n- Created SyncExpiredSubscriptions command\n- Added subscription:sync tag to schedule\n- Updated Subscription model with scopeExpired\n\n\nEm um mês, você conseguirá encontrar rapidamente quando e por quê