Alternar tema

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

Easton editorial illustration: bottleneck pressure gauge

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 funcionalidade
  • bugfix/ — correção de bug
  • hotfix/ — correção urgente
  • release/ — 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 feature quando ela estiver atrás da main
  • 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 commit
  • squash ou s — combinar o commit com o anterior
  • reword ou r — alterar a mensagem do commit
  • edit ou e — pausar nesse commit para modificar o conteúdo
  • drop ou d — 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 <​<<<<<< HEAD e =​====== está o código da sua branch atual
  • Entre =​====== e >​>>>>>> feature/new-login está 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:

  1. Executo os testes localmente para confirmar que tudo funciona
  2. Reviso as alterações com git diff para garantir que nenhum código foi apagado por engano
  3. 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ário
  • fix: corrigir bug na validação de senha
  • refactor: refatorar camada de serviço do usuário
  • docs: 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 feature pessoal, quando você tem certeza de que ninguém mais a utiliza

Quando nunca deve ser usado:

  • Em branches compartilhadas, como main ou master
  • 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/ e bugfix/
  • Incluir o número da tarefa no nome da branch
  • Limitar o ciclo de vida de branches feature a 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 .env ou 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 -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

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. 1

    Step 1: Escolher o workflow Git adequado à equipe

    Escolha o workflow conforme o tamanho da equipe:
  2. 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. 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. 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. 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. 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?
Recomendo o GitHub Flow pelos seguintes motivos:

• 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?
Padrão de nomes para branches:
• 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?
Diferença essencial:

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?
Como prevenir conflitos:

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?
Valor do code review:
• 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?
Erros comuns:

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

Easton BlogEaston Blog