Git avançado: boas práticas de colaboração em equipe e gestão de branches

Introdução
Um colega me marcou no grupo: “O código que você acabou de integrar sobrescreveu minha funcionalidade de login. Agora os usuários não conseguem entrar em produção…”
Quando abri o código, a tela estava cheia de marcadores de conflito. Eu já não conseguia distinguir o que era meu do que tinha sido escrito pelo colega. Naquela noite, aprendi uma lição: saber usar os comandos básicos do Git não significa saber colaborar em equipe.
Se você já teve tantas branches que nem lembrava mais de todas, ficou com receio de integrar código por causa de conflitos ou encontrou um histórico de commits mais embolado que um novelo, este artigo pode ajudar. Reuni a experiência prática destes últimos anos, desde a escolha do workflow e a resolução de conflitos até a organização do histórico e a criação de um processo de code review. Ao final, você saberá escolher uma estratégia de branches adequada à equipe, resolver conflitos de merge com segurança, organizar commits com rebase e estruturar revisões eficientes.
Capítulo 1: como escolher o workflow Git certo para sua equipe
Para ser sincero, quando comecei a liderar uma equipe, também não sabia qual workflow Git usar. Ouvi dizer que Git Flow era muito profissional e simplesmente copiei o modelo. O resultado foi que uma equipe de cinco pessoas gastava meia hora por dia só gerenciando branches, até todo mundo perder a paciência.
Só depois entendi que não existe o melhor workflow; existe o mais adequado.
Git Flow vs. GitHub Flow vs. Trunk Based Development
Vou explicar da forma mais simples possível as diferenças entre esses três modelos.
Git Flow é como uma fábrica com uma linha de produção rígida: há uma branch de desenvolvimento (develop), branches de funcionalidades (feature), de lançamento (release) e de correções urgentes (hotfix). Grandes empresas como Microsoft e IBM costumam usar esse modelo porque trabalham com ciclos de lançamento bem definidos, como uma nova versão por mês.
Para equipes pequenas, porém, o Git Flow é pesado demais. Uma equipe em que trabalhei fazia exatamente isso: a cada lançamento, criava uma branch release a partir de develop; depois dos testes, integrava em master e, em seguida, de volta em develop. Só esse processo já dava bastante trabalho.
GitHub Flow é muito mais simples. Há apenas uma branch principal (main ou master), e toda funcionalidade começa em uma branch feature criada a partir dela. Quando o desenvolvimento termina, abre-se um PR para fazer o merge. Esse modelo funciona especialmente bem em equipes de 3 a 10 pessoas, com foco em iteração rápida e entrega contínua.
Minha equipe atual usa GitHub Flow com testes automatizados em CI/CD e consegue publicar várias vezes ao dia. Os integrantes também acham o processo mais leve, pois não precisam memorizar tantas regras de branches.
Trunk Based Development (desenvolvimento no trunk) é ainda mais radical: todos trabalham diretamente sobre a branch principal, e as branches costumam durar menos de um dia. Empresas como Google e Facebook conseguem trabalhar assim porque têm uma infraestrutura muito robusta de testes automatizados.
Para uma equipe comum, TBD pode ser agressivo demais. Sem uma cobertura de testes acima de 90%, é muito fácil quebrar a branch principal.
Tendências em 2025
Depois de consultar bastante material recente, percebi que a tendência em 2025 são os modelos híbridos. Equipes pequenas, de 1 a 10 pessoas, normalmente usam GitHub Flow com GitHub Actions ou GitLab CI. Equipes médias e grandes combinam partes do Git Flow e do GitHub Flow conforme suas necessidades.
Na empresa de um amigo, por exemplo, uma equipe de 20 pessoas usa um modelo híbrido de “GitHub Flow + branch de release”: o trabalho diário segue o GitHub Flow, mas antes de cada lançamento a equipe cria uma branch release para estabilizar a versão.
Minha recomendação:
- Equipes pequenas, de 1 a 5 pessoas: usem GitHub Flow sem complicar
- Equipes médias, de 5 a 15 pessoas: GitHub Flow com um processo de release simplificado
- Acima de 15 pessoas: considerem Git Flow ou um modelo híbrido, acompanhado de uma boa estrutura de CI/CD
E há um ponto essencial: não complique além do necessário. Já vi muitas equipes começarem com uma estratégia de branches sofisticada demais. Ninguém queria segui-la e, no fim, cada pessoa voltou a trabalhar de um jeito diferente.
Capítulo 2: regras de ouro para a gestão de branches
Uma das maiores dores da colaboração em equipe é a desorganização das branches. Em um projeto anterior, o repositório tinha mais de 70 branches remotas, e pelo menos metade eram branches abandonadas havia dois anos. Encontrar a branch certa era sempre uma tarefa demorada.
Depois disso, criei um conjunto de “regras de ouro” para a gestão de branches. Quando a equipe passou a usá-las, o repositório ficou muito mais organizado.
Padrão de nomes para branches
Primeiro, o padrão de nomes. Hoje exigimos que todas as branches tenham um prefixo:
feature/— desenvolvimento de nova funcionalidadebugfix/— correção de bughotfix/— correção urgenterelease/— branch de lançamento
Também é obrigatório incluir o número da tarefa, por exemplo: feature/JIRA-1234-user-login.
Assim, basta olhar para entender a finalidade da branch e quem é responsável por ela. Antes, tínhamos uma branch chamada test; três meses depois, ninguém lembrava mais o que ela testava e acabamos simplesmente excluindo-a.
Outros cuidados importantes:
- Não use nomes de branch em chinês. Embora o Git aceite, alguns sistemas podem exibir caracteres incorretos
- Evite caracteres especiais, principalmente espaços e
@ - Separe palavras com hífen (
-), e não com underscore (_), conforme a convenção do setor
Gestão do ciclo de vida das branches
O caso mais absurdo que já vi foi uma branch feature permanecer aberta durante três meses. Quando chegou a hora do merge, havia tantos conflitos que foi impossível resolvê-los, e a funcionalidade precisou ser reescrita.
Por isso, hoje estabeleço uma regra para a equipe: uma branch feature não pode durar mais de três dias. Se a funcionalidade for grande demais, deve ser dividida em várias partes menores, integradas gradualmente.
Excluir a branch imediatamente depois do merge é regra. Muita gente evita apagar porque pensa: “E se eu precisar dela depois?”. Pode confiar: você não vai precisar. O Git preserva todo o histórico, e o código integrado pode ser recuperado a qualquer momento.
Guardo até hoje os comandos para excluir branches nas notas do celular:
# Excluir uma branch local
git branch -d feature/xxx
# Excluir uma branch remota
git push origin --delete feature/xxx
Se o repositório já acumulou muitas branches abandonadas, você pode limpá-las assim:
# Listar branches já integradas à main
git branch --merged main
# Excluir em lote (use com cuidado)
git branch --merged main | grep -v "main" | xargs git branch -d
Estratégia de proteção de branches
Outro ponto muito importante é proteger a branch principal.
Quando comecei a liderar equipes, qualquer pessoa podia fazer push diretamente na main. Certa vez, um estagiário enviou código inacabado por engano e derrubou todo o ambiente de testes.
Depois disso, configurei regras de proteção no GitHub e no GitLab:
- Proibir push direto na
main; toda alteração deve entrar por PR ou MR - Exigir a aprovação de pelo menos uma pessoa antes do merge
- Exigir que todas as verificações de CI sejam aprovadas, incluindo testes unitários e lint
No GitHub, a configuração fica em Settings → Branches → Branch protection rules.
Essas regras podem parecer burocráticas, mas evitam muitos erros básicos. Além disso, o próprio code review é uma ótima oportunidade de aprendizado: as pessoas conhecem o estilo de código e as regras de negócio umas das outras.
Capítulo 3: Git Rebase vs. Merge — quando usar cada um?
Quando usei rebase pela primeira vez, fiquei completamente perdido. Depois de executar git rebase, vi vários IDs de commits mudarem, pensei que o código tinha sumido e quase entrei em pânico.
Só depois entendi que, embora rebase e merge combinem código, eles funcionam de maneiras totalmente diferentes.
A diferença essencial entre Merge e Rebase
Gosto de explicar com uma analogia simples.
Merge é como o encontro de dois rios: você enxerga claramente o ponto em que eles se juntam e formam um curso maior. No Git, o merge cria um merge commit e deixa uma bifurcação bem visível na árvore do histórico.
Rebase é como redirecionar a água de um afluente para o rio principal, fazendo parecer que sempre existiu um único curso. O rebase reescreve o histórico e “move” cada commit para depois da branch de destino; por isso, os IDs dos commits mudam.
Em termos técnicos:
- Merge preserva todo o histórico, incluindo a criação e a integração da branch
- Rebase cria um histórico linear, mais limpo e organizado, mas perde o contexto da branch
Casos de uso e regra de ouro
Então, quando usar cada um? Pela minha experiência:
Use Merge para:
- Integrar definitivamente uma branch
featureàmain - Combinar branches compartilhadas pela equipe
- Preservar todo o histórico de integração
Use Rebase para:
- Atualizar sua branch
featurequando ela estiver atrás damain - Organizar o histórico de commits da sua branch pessoal antes do push
- Manter um histórico linear
Mas existe uma regra de ouro que você precisa memorizar:
Nunca faça rebase de commits que já receberam push em uma branch compartilhada!
Por quê? Porque o rebase muda os IDs dos commits. Se outra pessoa já começou a trabalhar sobre seus commits antigos, o histórico dela ficará desorganizado depois do rebase. Um colega cometeu esse erro certa vez, e toda a equipe precisou baixar as branches novamente. Ele ouviu reclamações durante uma semana.
Minha regra atual é: faça rebase localmente à vontade, mas pense bem antes do push.
Rebase interativo na prática
Ao falar de rebase, precisamos mencionar git rebase -i, o rebase interativo. É um recurso extremamente poderoso.
Durante o desenvolvimento de uma funcionalidade, cheguei a criar mais de dez commits com mensagens pouco profissionais como “fix”, “alteração” e “mudei de novo”. Antes de integrar na main, usei git rebase -i para transformá-los em três commits claros.
O processo foi este:
# Organizar os dez commits mais recentes
git rebase -i HEAD~10
O comando abre um editor com algo parecido com isto:
pick a1b2c3d adicionar login de usuário
pick e4f5g6h corrigir bug no login
pick i7j8k9l alterar novamente
pick m0n1o2p otimizar lógica de login
...
Você pode substituir as ações por:
pick— manter o commitsquashous— combinar o commit com o anteriorrewordour— alterar a mensagem do commiteditoue— pausar nesse commit para modificar o conteúdodropoud— excluir o commit
Por exemplo, eu mudaria a lista acima para:
pick a1b2c3d adicionar login de usuário
squash e4f5g6h corrigir bug no login
squash i7j8k9l alterar novamente
reword m0n1o2p otimizar lógica de login
Assim, os três primeiros commits serão combinados em um, e o quarto pedirá uma nova mensagem.
Sinceramente, o recurso pode parecer complexo na primeira vez, mas fica natural depois de alguma prática. O histórico realmente fica muito mais limpo, sem aqueles commits constrangedores chamados “alteração”, “mudei de novo” ou “outra mudança”.
A boa prática em 2025 é: use rebase localmente para organizar o histórico e merge para integrar na branch principal. Isso mantém o histórico da branch principal claro sem perder informações importantes sobre as integrações.
Capítulo 4: como deixar de temer os conflitos
Conflitos no Git já me causaram um verdadeiro trauma. Na primeira vez, fiquei olhando para uma tela cheia de <<<<<<< e >>>>>>> sem fazer ideia do que fazer. No fim, apaguei todo o meu código e escrevi tudo de novo.
Depois descobri que conflitos não são tão assustadores. O segredo é entender o que os marcadores dizem e dominar algumas técnicas de prevenção.
Boas práticas para prevenir conflitos
Muitos conflitos podem ser evitados. Hoje peço que minha equipe faça o seguinte:
1. Sincronize a branch principal pelo menos uma vez por dia
Antes de começar o trabalho, execute:
git checkout main
git pull origin main
git checkout feature/xxx
git merge main # ou git rebase main
Assim, sua branch feature não fica muito atrasada, e haverá menos conflitos no merge.
2. Faça commits pequenos e merges rápidos
Como mencionei, uma branch feature não deve durar mais de três dias. Quanto mais tempo uma branch existe e mais se afasta da principal, maior é a probabilidade de conflito.
3. Converse antes de editar em conjunto
Se duas pessoas precisarem alterar o mesmo arquivo, é melhor avisar com antecedência. Minha equipe mantém no Notion uma tabela de “funcionalidades em desenvolvimento”, que deixa claro quem está alterando cada arquivo.
Como interpretar e resolver os marcadores de conflito manualmente
Mesmo com prevenção, conflitos ainda acontecem. Nesse momento, você verá marcadores como estes:
<<<<<<< HEAD
function login(username, password) {
// Seu código
return api.post('/login', { username, password });
}
=======
function login(email, password) {
// Código do colega
return api.post('/auth/login', { email, password });
}
>>>>>>> feature/new-login
É mais simples do que parece:
- Entre
<<<<<<< HEADe=======está o código da sua branch atual - Entre
=======e>>>>>>> feature/new-loginestá o código da branch recebida
Você precisa decidir qual trecho manter ou combinar os dois. Neste exemplo, talvez seja necessário conversar com o colega: o login deve usar username ou email? Qual deve ser o caminho da API?
Depois de resolver todos os conflitos, apague os marcadores e execute:
git add .
git commit -m "resolver conflito de merge na funcionalidade de login"
Ferramentas visuais para ganhar eficiência
Para ser sincero, resolver conflitos manualmente é cansativo, principalmente quando há muitos. Hoje quase sempre uso a ferramenta integrada do VS Code.
No VS Code, os trechos em conflito aparecem destacados e acompanhados de alguns botões:
- “Accept Current Change” — manter seu código
- “Accept Incoming Change” — manter o código recebido
- “Accept Both Changes” — manter os dois
- “Compare Changes” — abrir a comparação
Um clique resolve o conflito, o que é muito mais prático do que editar tudo à mão.
Quando o conflito é especialmente complexo, também uso git mergetool com uma ferramenta profissional como p4merge. Ela apresenta três painéis — versão-base, sua versão e a versão da outra pessoa — e facilita a comparação.
Validação após resolver conflitos
Certa vez, resolvi um conflito, fiz commit e push imediatamente. Depois percebi que havia apagado uma parte essencial da lógica escrita por um colega, causando um problema em produção. A lição me fez criar um hábito: todo conflito resolvido precisa ser validado.
Agora, depois de cada resolução, eu:
- Executo os testes localmente para confirmar que tudo funciona
- Reviso as alterações com
git diffpara garantir que nenhum código foi apagado por engano - Se possível, peço também a revisão de um colega
Isso leva apenas alguns minutos e pode evitar muitos incidentes em produção.
Capítulo 5: como criar um processo eficiente de code review
Sinceramente, no início da carreira eu detestava code review. Achava que meu código já era muito bom e não entendia por que outras pessoas precisavam opinar. Além disso, as revisões muitas vezes exigiam várias mudanças, o que parecia um desperdício de tempo.
Quando comecei a revisar o código de outras pessoas, percebi que o valor do code review vai muito além de “encontrar bugs”.
O verdadeiro valor do code review
Hoje vejo pelo menos três grandes benefícios:
1. Compartilhamento de conhecimento — permite que todos saibam o que as outras pessoas estão fazendo e evita silos de informação. Várias vezes, só descobri uma forma interessante de implementar uma funcionalidade ao revisar o PR de um colega.
2. Garantia de qualidade — um segundo par de olhos sempre encontra algo que o autor não percebeu. Certa vez, escrevi uma função recursiva que passou nos meus testes, mas o revisor notou que eu não havia tratado uma condição de limite, o que quase provocou um estouro de pilha.
3. Crescimento técnico — ler código de qualidade é uma das melhores formas de aprender. Muitas das minhas técnicas de programação vieram da revisão de PRs de engenheiros sêniores.
Boas práticas para PRs
Para o code review ser eficiente, o próprio PR precisa ser bem preparado. Minha equipe segue alguns acordos.
Mantenha o PR em um tamanho adequado
O ideal é que um PR tenha entre 200 e 400 linhas de código, sem ultrapassar 500. Ninguém quer revisar com atenção um PR enorme; na prática, a revisão acaba superficial.
Se uma funcionalidade for grande, divida-a em vários PRs menores e faça a integração em etapas. Um sistema de usuários, por exemplo, pode ser separado assim:
- PR 1: design das tabelas do banco de dados e model básico
- PR 2: endpoint de cadastro de usuário
- PR 3: endpoint de login
- PR 4: endpoint para alterar dados do usuário
Escreva uma descrição clara
Minha equipe usa este modelo de descrição:
## Contexto
Explique brevemente por que esta alteração é necessária
## Alterações
- Adição da funcionalidade xxx
- Correção do bug xxx
- Refatoração do módulo xxx
## Testes
- [ ] Testes unitários aprovados
- [ ] Funcionalidade testada localmente
- [ ] Validação concluída no ambiente de testes
## Observações
Alterações de configuração, migrações de banco de dados e outros pontos que exigem atenção
Assim, o revisor entende de imediato o que você fez e por quê.
Padronize as commit messages
Hoje seguimos a especificação Conventional Commits, e toda mensagem precisa ter um prefixo de tipo:
feat: adicionar login de usuáriofix: corrigir bug na validação de senharefactor: refatorar camada de serviço do usuáriodocs: atualizar documentação da API
Além de permitir a geração automática do changelog, esse padrão facilita localizar alterações no histórico.
Responsabilidades do revisor e do autor
Code review é uma via de mão dupla: revisor e autor têm responsabilidades.
O revisor deve:
- Responder ao PR em até 24 horas; não o deixe parado durante dias
- Fazer sugestões construtivas, em vez de apenas apontar defeitos. É melhor escrever “Sugiro xxx porque…” do que “Isso está ruim”
- Priorizar lógica, legibilidade e possíveis bugs, não estilo de código; deixe o estilo para o lint
O autor deve:
- Responder aos comentários sem demora, em vez de ficar em silêncio
- Explicar as decisões de design. Se o revisor não entende, talvez o código não esteja claro o bastante
- Receber sugestões com abertura. Mesmo que pareçam inadequadas no início, vale refletir sobre o motivo delas
Quando comecei a revisar, costumava escrever comentários como “Isto está errado, altere”. O autor não fazia ideia do que eu esperava. Depois aprendi a formular assim: “Este loop pode causar problemas de desempenho com um volume grande de dados. Sugiro mudar para xxx ou xxx. O que você acha?”. A comunicação melhorou muito.
Tendência em 2025: code review assistido por IA
Em 2025, surgiram várias ferramentas de code review assistidas por IA. Em outubro, o GitHub lançou o Code Quality, capaz de detectar automaticamente problemas de manutenção e segurança.
Testei o recurso e ele realmente encontra coisas que podemos deixar passar, como:
- Exceções não tratadas
- Possíveis vazamentos de memória
- Funções complexas demais, com alta complexidade ciclomática
Ainda assim, a IA não consegue substituir a revisão humana. Ela encontra problemas técnicos, mas decisões de design e a coerência da lógica de negócio ainda dependem de pessoas.
Por isso, hoje deixo a ferramenta de IA fazer uma primeira análise e apontar problemas evidentes. Depois, uma pessoa revisa o design e a lógica em profundidade. Isso aumentou bastante a eficiência.
Capítulo 6: erros comuns e como evitá-los
Por fim, quero compartilhar alguns erros que eu e minha equipe já cometemos, para que você possa evitá-los.
O perigo do push forçado
Certa vez, minha branch feature estava muito atrás da principal. Depois de fazer rebase, não consegui executar push porque os históricos local e remoto eram diferentes.
Eu não sabia o que fazer, encontrei o comando git push -f em uma busca e pensei que “push forçado” parecia poderoso. Então executei.
O resultado foi que sobrescrevi todo o código que um colega acabara de enviar. Por sorte, tínhamos backup; caso contrário, ele teria perdido um dia inteiro de trabalho.
Só depois descobri que git push -f — ou git push --force — está entre os comandos mais perigosos do Git. Ele substitui à força o histórico remoto pelo histórico local, independentemente do que exista no remoto.
Quando pode ser usado:
- Em uma branch
featurepessoal, quando você tem certeza de que ninguém mais a utiliza
Quando nunca deve ser usado:
- Em branches compartilhadas, como
mainoumaster - Em qualquer branch utilizada por outras pessoas
Se realmente precisar fazer push forçado, use git push --force-with-lease, que é mais seguro. Ele verifica se há novos commits na branch remota e recusa o push quando encontra algum.
Outros erros frequentes
Além do push forçado, existem alguns erros recorrentes.
1. Desenvolver diretamente na branch main
Nunca faça isso. Mesmo uma alteração simples de uma palavra deve ser criada em uma branch e integrada por PR. Assim, há um registro da revisão e fica mais fácil reverter problemas.
2. Escrever commit messages vagas
“fix”, “alteração”, “111”, “asdf”… Já vi muitas mensagens absurdas. Ao investigar o histórico no futuro, elas não ajudam em nada.
Crie o hábito de escrever cada mensagem com atenção, deixando claro o que mudou e por quê.
3. Não excluir branches já integradas
Exclua a branch imediatamente após o merge, em vez de deixá-la ocupando espaço. GitHub e GitLab oferecem uma opção para excluir a branch automaticamente ao integrar um PR; lembre-se de ativá-la.
4. Usar git add . sem conferir
git add . coloca todas as alterações na staging area, inclusive arquivos que você não pretendia enviar. Já vi alguém incluir por engano um arquivo .env com senhas.
É melhor usar git add -p, que pergunta sobre cada alteração. O processo é um pouco mais lento, mas muito mais seguro.
Checklist de colaboração em equipe
Por fim, organizei um checklist de Git para equipes que você pode usar como referência.
Gestão de branches
- Usar um padrão consistente de nomes, como
feature/ebugfix/ - Incluir o número da tarefa no nome da branch
- Limitar o ciclo de vida de branches
featurea três dias - Excluir a branch imediatamente após o merge
- Configurar regras de proteção para a
main
Commits
- Seguir um padrão de commit messages com prefixo de tipo
- Dar um único objetivo a cada commit
- Executar lint e testes antes do envio
- Não enviar informações sensíveis, como
.envou chaves
Code review
- Manter o PR em um tamanho razoável, entre 200 e 400 linhas
- Escrever uma descrição clara, com contexto, alterações e testes
- Exigir pelo menos uma aprovação antes do merge
- Exigir que o CI seja aprovado antes do merge
- Responder ao PR em até 24 horas
Tratamento de conflitos
- Sincronizar a branch principal todos os dias
- Executar testes após resolver conflitos
- Em caso de dúvida, conversar imediatamente com os colegas
Operações proibidas
- Não desenvolver diretamente na
main - Não usar
git push -fem branches compartilhadas - Não fazer rebase de commits que já receberam push em uma branch compartilhada
- Não enviar código sem testes
Conclusão
Quando me lembro daquela madrugada resolvendo um incidente em produção, gostaria de já conhecer todas essas técnicas. Pelo menos os erros acabaram se transformando em experiência.
O Git em si não é difícil. O verdadeiro desafio é chegar a um acordo dentro da equipe. O melhor workflow e as regras mais detalhadas não servem para nada se ninguém os seguir.
Minha recomendação é: comece com o simples e melhore aos poucos. Não crie um conjunto de regras muito complexo logo no início; faça ajustes graduais conforme a realidade da equipe.
Por exemplo:
- Primeira semana: padronize os nomes das branches
- Segunda semana: configure regras de proteção
- Terceira semana: crie um processo de revisão de PRs
- Quarta semana: adote um padrão de commit messages
Avance com calma e dê tempo para a equipe se adaptar.
O mais importante é a comunicação. Não tente resolver tudo sozinho; converse com os colegas. Muitos conflitos no Git são, no fundo, problemas de comunicação, não problemas técnicos.
Se quiser aprofundar seus conhecimentos de Git, recomendo estes recursos:
- Tutorial de Git da Atlassian — um dos tutoriais mais completos sobre Git
- Livro Pro Git — livro oficial do Git, disponível gratuitamente on-line
- GitKraken ou SourceTree — clientes Git visuais e mais amigáveis para iniciantes
Talvez meu próximo artigo trate de técnicas avançadas do Git, como cherry-pick, stash e submodule. Se tiver interesse, acompanhe as próximas publicações.
Por fim, espero que a colaboração com Git na sua equipe fique cada vez mais tranquila — e que ninguém precise acordar de madrugada para resolver conflitos de merge.
Fluxo completo de colaboração em equipe com Git
Passo a passo completo, da escolha do workflow à criação do processo de code review, incluindo gestão de branches, resolução de conflitos e boas práticas
Estimated time: PT1H
-
1
Step 1: Escolher o workflow Git adequado à equipe
Escolha o workflow conforme o tamanho da equipe: -
2
Step 2: Criar regras para a gestão de branches
Padrão de nomes: use prefixos consistentes (feature/ para novas funcionalidades, bugfix/ para correções, hotfix/ para correções urgentes e release/ para versões), inclua sempre o número da tarefa (como feature/JIRA-1234-user-login), separe palavras com hífen em vez de underscore e evite chinês e caracteres especiais. Ciclo de vida: limite branches feature a três dias e exclua-as imediatamente após o merge (git branch -d feature/xxx e git push origin —delete feature/xxx); exclua em lote branches integradas com git branch —merged main | grep -v “main” | xargs git branch -d. Proteção: no GitHub ou GitLab, proíba push direto na main, exija PR, pelo menos uma aprovação e CI aprovado. -
3
Step 3: Dominar os casos de uso de Rebase e Merge
Use Merge para integrar definitivamente uma branch feature à main, combinar branches compartilhadas e preservar todo o histórico de integração. Use Rebase para atualizar uma branch feature atrasada em relação à main, organizar os commits de uma branch pessoal antes do push e manter o histórico linear. Regra de ouro: nunca faça rebase de commits que já receberam push em uma branch compartilhada, pois os IDs mudam e desorganizam as branches de outras pessoas. Faça rebase localmente à vontade, mas pense bem antes do push. No rebase interativo, git rebase -i HEAD~10 organiza os dez commits mais recentes com pick, squash, reword, edit e drop. Boa prática em 2025: rebase local para organizar o histórico e merge para integrar na branch principal. -
4
Step 4: Prevenir e resolver conflitos no Git
Previna conflitos sincronizando a branch principal pelo menos uma vez por dia (git checkout main && git pull origin main && git checkout feature/xxx && git merge main), fazendo commits pequenos e merges rápidos, mantendo branches feature por no máximo três dias e conversando antes de editar o mesmo arquivo. Entre <<<<<<< HEAD e ======= está seu código; entre ======= e >>>>>>> está o código recebido. Use a ferramenta visual do VS Code (Accept Current Change, Accept Incoming Change, Accept Both Changes e Compare Changes) ou git mergetool com p4merge em três painéis. Depois, execute testes localmente, revise com git diff e peça o review de um colega. -
5
Step 5: Criar um processo eficiente de code review
Boas práticas para PRs: mantenha entre 200 e 400 linhas, no máximo 500, e divida funcionalidades grandes em PRs menores. Use um modelo de descrição com contexto, alterações, testes e observações. Padronize commit messages com Conventional Commits e prefixos como feat, fix, refactor e docs. O revisor deve responder em até 24 horas e fazer sugestões construtivas sobre lógica, legibilidade e possíveis bugs; o autor deve responder, explicar as decisões de design e receber sugestões com abertura. Tendência em 2025: code review assistido por IA, com GitHub Code Quality detectando problemas de manutenção e segurança. A IA faz a primeira análise e as pessoas revisam design e lógica em profundidade. -
6
Step 6: Evitar erros comuns e criar padrões para a equipe
Operações proibidas: não desenvolva diretamente na main, não use git push -f em branches compartilhadas (git push —force-with-lease é mais seguro), não faça rebase de commits que já receberam push em branches compartilhadas e não envie código sem testes. Outros erros frequentes: mensagens de commit vagas, não excluir branches integradas e usar git add . sem conferir; prefira git add -p. Checklist: padronize nomes, inclua o número da tarefa, limite o ciclo de vida, exclua após o merge e proteja a branch principal; padronize commits, dê um único objetivo a cada um, execute lint e testes e não envie dados sensíveis; mantenha PRs pequenos, descrições claras, pelo menos uma aprovação, CI aprovado e resposta em até 24 horas; sincronize a main todos os dias, teste após resolver conflitos e comunique dúvidas imediatamente.
FAQ
Qual workflow Git uma equipe pequena deve escolher?
• Simples e rápido: há apenas uma branch principal, e toda funcionalidade nasce em uma branch feature criada a partir dela
• Iteração rápida: com CI/CD, é possível publicar várias vezes ao dia
• Baixa curva de aprendizado: é fácil para toda a equipe entender e seguir
Por que não recomendo o Git Flow:
• Processo complexo: exige manter várias branches, como develop, feature, release e hotfix
• Adequado a empresas grandes: só equipes maiores, com ciclos de lançamento bem definidos, costumam precisar dele
• Para uma equipe pequena, é burocrático demais e consome muito tempo só com a gestão das branches
Tendência em 2025: modelos híbridos. Equipes pequenas usam GitHub Flow, enquanto equipes médias e grandes incorporam apenas algumas partes do Git Flow. O ponto principal é não complicar além do necessário e escolher uma opção adequada ao tamanho da equipe.
Quais são as regras de ouro da gestão de branches e como evitar desorganização?
• Use prefixos consistentes: feature/ para novas funcionalidades, bugfix/ para correções, hotfix/ para correções urgentes e release/ para versões
• Inclua sempre o número da tarefa, como feature/JIRA-1234-user-login
• Separe palavras com hífen, e não com underscore, seguindo a convenção do setor
• Não use nomes de branch em chinês: embora o Git aceite, alguns sistemas podem exibir caracteres incorretos
• Evite caracteres especiais, principalmente espaços e @
Gestão do ciclo de vida:
• Uma branch feature não deve durar mais de três dias; divida funcionalidades grandes em partes menores e integre-as aos poucos
• Exclua a branch imediatamente após o merge:
- git branch -d feature/xxx remove a branch local
- git push origin --delete feature/xxx remove a branch remota
• Para excluir em lote branches já integradas: git branch --merged main | grep -v "main" | xargs git branch -d
Proteção de branches:
• No GitHub ou GitLab, proíba push direto na main e exija PR ou MR
• Exija a aprovação de pelo menos uma pessoa antes do merge
• Exija que as verificações de CI sejam aprovadas, incluindo testes unitários e lint
• No GitHub, configure em Settings → Branches → Branch protection rules
Qual é a diferença entre Rebase e Merge e quando usar cada um?
Merge:
• É como o encontro de dois rios: fica claro onde eles se juntaram e, depois disso, formam um curso maior
• No Git, o merge cria um merge commit e deixa a bifurcação visível no histórico
• Preserva todo o histórico, incluindo a criação e a integração da branch
Rebase:
• É como redirecionar a água de um afluente para o rio principal, fazendo parecer que sempre houve um único curso
• O rebase reescreve o histórico e move cada commit para depois da branch de destino; por isso, os IDs dos commits mudam
• Cria um histórico linear, mais limpo, mas perde o contexto da branch
Quando usar:
• Merge: para integrar definitivamente uma branch feature à main, combinar branches compartilhadas ou preservar todo o histórico de integração
• Rebase: para atualizar uma branch feature atrasada em relação à main, organizar commits de uma branch pessoal antes do push ou manter o histórico linear
Regra de ouro:
• Nunca faça rebase de commits que já receberam push em uma branch compartilhada. Como o rebase muda os IDs, qualquer pessoa que trabalhe sobre os commits antigos terá o histórico desorganizado
Princípio: faça rebase localmente à vontade, mas pense bem antes do push.
Boa prática em 2025: use rebase localmente para organizar os commits e merge para integrar na branch principal.
Como prevenir e resolver conflitos no Git?
1) Sincronize a branch principal pelo menos uma vez por dia:
• Antes de começar a trabalhar: git checkout main && git pull origin main && git checkout feature/xxx && git merge main ou git rebase main
2) Faça commits pequenos e merges rápidos:
• Não deixe uma branch feature viver por mais de três dias; quanto mais tempo ela existir e mais se afastar da principal, maior será o risco de conflito
3) Converse antes de editar em conjunto:
• Se duas pessoas precisarem alterar o mesmo arquivo, o ideal é avisar com antecedência
• Use uma tabela de funcionalidades em desenvolvimento no Notion para deixar claro quem está alterando cada arquivo
Como interpretar os marcadores de conflito:
• Entre <<<<<<< HEAD e ======= está o código da branch atual
• Entre ======= e >>>>>>> está o código da branch que será integrada
• Decida qual trecho manter ou combine os dois
• Depois de resolver todos os conflitos, apague os marcadores e execute git add . && git commit
Ferramentas visuais:
• O VS Code oferece Accept Current Change para manter seu código, Accept Incoming Change para manter o código recebido, Accept Both Changes para manter os dois e Compare Changes para abrir a comparação
• git mergetool com p4merge exibe três painéis: versão-base, sua versão e a versão da outra pessoa
Validação após a resolução:
• Execute os testes localmente para confirmar que tudo funciona
• Revise as alterações com git diff para garantir que nenhum código foi apagado por engano
• Se possível, peça também a revisão de um colega
Como criar um processo eficiente de code review e quais são as boas práticas para PRs?
• Compartilhamento de conhecimento: a equipe entende o trabalho de cada pessoa e evita silos de informação
• Garantia de qualidade: um segundo par de olhos encontra problemas que o autor pode não perceber
• Crescimento técnico: ler código de qualidade é uma das melhores formas de aprender
Boas práticas para PRs:
1) Tamanho adequado:
• O ideal é ter entre 200 e 400 linhas, sem ultrapassar 500
• Ninguém consegue revisar com atenção um PR enorme; divida uma funcionalidade grande em vários PRs menores
2) Descrição clara:
• Use um modelo com contexto, alterações, testes realizados e observações
• Assim, o revisor entende de imediato o que foi feito e por quê
3) Commit messages padronizadas:
• Siga Conventional Commits e inclua um prefixo de tipo:
- feat para uma nova funcionalidade
- fix para correção de bug
- refactor para refatoração
- docs para atualização de documentação
• Isso permite gerar changelogs automaticamente e facilita localizar mudanças no histórico
Responsabilidades de revisores e autores:
O revisor deve:
• Responder ao PR em até 24 horas
• Fazer sugestões construtivas, e não apenas apontar defeitos
• Priorizar lógica, legibilidade e possíveis bugs; deixe estilo para o lint
O autor deve:
• Responder aos comentários sem demora
• Explicar as decisões de design; se o revisor não entender, talvez o código não esteja claro o bastante
• Receber sugestões com abertura e refletir sobre o motivo delas
Quais são os erros mais comuns na colaboração com Git e como evitá-los?
1) O perigo do push forçado:
• git push -f ou git push --force está entre os comandos mais perigosos, pois substitui à força o histórico remoto pelo histórico local, mesmo que existam novos commits remotos
• Nunca use em branches compartilhadas, como main ou master, nem em qualquer branch utilizada por outras pessoas
• Se realmente precisar, prefira git push --force-with-lease: ele verifica se há commits novos na branch remota e recusa o push caso existam
2) Desenvolver diretamente na main:
• Nunca faça isso. Mesmo uma alteração de uma única palavra deve ser criada em uma branch e integrada por PR
• Assim, há um registro da revisão e fica mais fácil reverter problemas
3) Commit messages vagas:
• Mensagens como "fix", "alteração", "111" ou "asdf" não ajudam em nada ao investigar o histórico
• Escreva cada mensagem com atenção, explicando o que mudou e por quê
4) Não excluir branches já integradas:
• Exclua a branch imediatamente após o merge
• GitHub e GitLab oferecem uma opção para exclusão automática ao integrar o PR; lembre-se de ativá-la
5) Usar git add . sem conferir:
• O comando coloca todas as alterações na staging area, inclusive arquivos que você não queria enviar
• Alguém pode acabar incluindo um arquivo .env com senhas
• Prefira git add -p, que pergunta sobre cada alteração; é um pouco mais lento, porém mais seguro
Checklist de colaboração em equipe:
Gestão de branches:
• Nomes padronizados, número da tarefa, ciclo de vida de até três dias, exclusão após o merge e proteção da branch principal
Commits:
• Mensagens padronizadas, um único objetivo por commit, lint e testes antes do envio e nenhum dado sensível
Code review:
• PR com tamanho adequado, descrição clara, pelo menos uma aprovação, CI aprovado e resposta em até 24 horas
Conflitos:
• Sincronização diária da branch principal, testes após a resolução e comunicação imediata em caso de dúvida
Operações proibidas:
• Não desenvolver diretamente na main
• Não usar git push -f em branches compartilhadas
• Não fazer rebase de commits que já receberam push em uma branch compartilhada
• Não enviar código sem testes
24 min de leitura · Publicado em: 24 nov 2025 · Atualizado em: 4 set 2026



Comentários
Entre com GitHub para comentar