Mamura
Mamura Programador web com mais de 15 anos de experiência.

Já deu o pull hoje? Boas práticas para Git em grandes equipes

Já deu o pull hoje? Boas práticas para Git em grandes equipes

Trabalhar com Git em projeto individual é relativamente simples. Você cria uma branch, faz seus commits, abre um pull request e segue o fluxo.

O problema começa quando o projeto cresce. Mais pessoas alterando os mesmos arquivos. Mais features em paralelo. Mais correções urgentes. Mais conflitos. Mais branches antigas. Mais pull requests acumulados. Mais risco de sobrescrever trabalho de alguém.

Em grandes equipes, Git deixa de ser apenas uma ferramenta de versionamento e passa a ser parte importante da organização do trabalho.

E é aí que entra a pergunta: já deu o pull hoje?

Essa frase pode parecer brincadeira, mas ela representa uma prática essencial: manter seu ambiente local sempre atualizado com o estado mais recente do projeto.

O problema de trabalhar com código desatualizado

Imagine o seguinte cenário:

Você começa o dia criando uma branch a partir da main. Trabalha nela por dois dias. Enquanto isso, outros desenvolvedores fazem merge de novas features, ajustes de arquitetura, alterações em migrations, mudanças em contratos de API e refatorações em arquivos compartilhados. Quando você finalmente abre o pull request, sua branch está muito distante da base atual.

O resultado costuma ser previsível:

  • conflitos difíceis de resolver;
  • testes quebrando por mudanças que você não acompanhou;
  • retrabalho para adaptar sua implementação;
  • revisão mais demorada;
  • risco de sobrescrever alterações recentes;
  • dificuldade para entender se o bug veio do seu código ou da defasagem da branch.

Quanto mais tempo uma branch fica isolada, maior é o custo de integrá-la depois.

Pull não é só atualizar código

Dar git pull não é apenas “baixar as últimas mudanças”. É sincronizar seu trabalho com a realidade atual do projeto.

Em uma equipe grande, o código muda o tempo todo. Se você passa muito tempo sem atualizar sua branch, está desenvolvendo sobre uma fotografia antiga do sistema.

Isso pode gerar uma falsa sensação de segurança. Localmente tudo funciona, os testes passam, a feature parece pronta. Mas quando a branch encontra a base atual, aparecem os problemas. Por isso, atualizar a branch com frequência reduz o atrito de integração.

Antes de começar: atualize sua branch principal

Uma boa prática simples é sempre começar o dia atualizando a branch principal do projeto.

Exemplo:

1
2
git checkout main
git pull origin main

Ou, se o projeto usa develop como branch base:

1
2
git checkout develop
git pull origin develop

Depois disso, crie sua branch de trabalho a partir da versão mais recente:

1
git checkout -b feature/minha-nova-funcionalidade

Esse cuidado evita que você comece uma tarefa em cima de uma base já ultrapassada.

Durante o desenvolvimento: sincronize com frequência

Se sua tarefa dura mais de algumas horas, vale a pena atualizar sua branch com frequência.

Existem duas formas comuns de fazer isso: merge e rebase.

Com merge:

1
2
3
git checkout minha-branch
git fetch origin
git merge origin/main

Com rebase:

1
2
3
git checkout minha-branch
git fetch origin
git rebase origin/main

A escolha entre merge e rebase depende do padrão adotado pela equipe. O importante é não deixar sua branch envelhecer demais.

Merge ou rebase?

Essa é uma discussão comum.

O merge preserva o histórico exatamente como aconteceu. Ele cria um commit de merge quando incorpora alterações da branch base.

Exemplo:

1
git merge origin/main

Já o rebase reaplica seus commits no topo da branch mais recente, deixando o histórico mais linear.

Exemplo:

1
git rebase origin/main

Em muitos times, o rebase é preferido antes de abrir ou atualizar um pull request, porque deixa o histórico mais limpo. Mas ele exige cuidado, principalmente quando a branch já foi compartilhada com outras pessoas.

Uma regra segura:

  • use merge quando estiver trabalhando em branch compartilhada;
  • use rebase em branches individuais, desde que você entenda o impacto;
  • nunca faça rebase descuidado em branch que outras pessoas também estão usando.

Commits pequenos facilitam tudo

Em grandes equipes, commits gigantes são um problema. Eles dificultam code review, tornam conflitos mais complexos e atrapalham o entendimento do histórico.

Prefira commits pequenos, com uma intenção clara.

Ruim:

1
git commit -m "ajustes"

Melhor:

1
git commit -m "adiciona validação de CPF no cadastro de cliente"

Ou:

1
git commit -m "corrige cálculo de total no checkout"

Um bom commit deve responder rapidamente: o que mudou e por quê?

Pull requests menores são revisados mais rápido

Um pull request com 40 arquivos alterados, múltiplas responsabilidades e vários contextos misturados tende a demorar mais para ser revisado.

Em equipes grandes, isso vira gargalo. Sempre que possível, divida o trabalho em partes menores.

Em vez de um único PR com:

  • migration;
  • model;
  • controller;
  • service;
  • refatoração;
  • ajuste visual;
  • teste;
  • melhoria de performance.

Considere separar em etapas menores, quando fizer sentido.

Pull requests menores têm várias vantagens:

  • revisão mais rápida;
  • menos risco de conflito;
  • menor chance de bug passar despercebido;
  • rollback mais simples;
  • histórico mais compreensível.

Nomeie branches com clareza

O nome da branch também comunica contexto.

Evite nomes genéricos como:

  • ajustes
  • teste
  • nova-feature
  • corrige-bug

Prefira algo mais descritivo:

1
2
3
4
feature/customer-import
bugfix/order-total-calculation
hotfix/login-token-expiration
refactor/payment-service

Algumas equipes também usam o código da tarefa:

1
2
feature/ABC-123-customer-import
bugfix/ABC-456-order-total

Isso facilita rastrear a branch no board, no pull request e no histórico do projeto.

Cuidado com arquivos compartilhados

Em projetos grandes, alguns arquivos são naturalmente mais sensíveis a conflitos.

Exemplos comuns:

  • arquivos de rotas;
  • arquivos de configuração;
  • migrations;
  • services muito centrais;
  • componentes globais;
  • arquivos de tradução;
  • arquivos de lock, como composer.lock ou package-lock.json.

Ao alterar esse tipo de arquivo, redobre o cuidado. Antes de commitar, verifique se a mudança realmente deveria estar ali. Depois de atualizar a branch, revise se o conflito foi resolvido corretamente.

Um conflito mal resolvido em arquivo de configuração pode quebrar o projeto inteiro.

Não faça commit de tudo automaticamente

Um erro comum é usar:

1
git add .

Ele não é necessariamente errado, mas pode ser perigoso quando usado sem revisão. Antes de commitar, revise o que será enviado:

1
2
git status
git diff

Ou adicione arquivos de forma seletiva:

1
2
git add app/Services/CheckoutService.php
git add tests/Feature/CheckoutTest.php

Também é possível usar:

1
git add -p

Esse comando permite selecionar trechos específicos do arquivo para o commit. É muito útil quando você fez alterações diferentes no mesmo arquivo, mas quer separar os commits por contexto.

Pull antes de push

Antes de enviar sua branch, atualize a base.

Fluxo comum:

1
2
3
git fetch origin
git rebase origin/main
git push origin minha-branch

Ou, usando merge:

1
2
3
git fetch origin
git merge origin/main
git push origin minha-branch

Isso reduz a chance de abrir um pull request já defasado. Também ajuda a encontrar conflitos localmente, antes de envolver o restante do time.

Resolva conflitos com atenção

Conflito não se resolve no automático. Quando o Git aponta um conflito, ele está dizendo que não conseguiu decidir sozinho qual alteração deve prevalecer.

Exemplo:

1
2
3
4
5
<<<<<<< HEAD
código da sua branch
=======
código vindo da main
>>>>>>> origin/main

O erro mais comum é escolher um lado sem entender o contexto.

Antes de resolver:

  • entenda o que mudou na branch base;
  • entenda o que sua alteração faz;
  • preserve as duas intenções quando necessário;
  • rode os testes depois;
  • revise o diff final.

Conflito resolvido sem critério é uma fonte clássica de bugs difíceis de rastrear.

Nunca use force push sem entender o impacto

O comando abaixo pode ser útil, mas também perigoso:

1
git push --force

Ele sobrescreve o histórico remoto da branch. Se outra pessoa também estiver trabalhando nela, você pode apagar commits do colega.

Quando for realmente necessário, prefira:

1
git push --force-with-lease

O --force-with-lease é mais seguro porque verifica se a branch remota mudou desde a última vez que você a buscou.

Ainda assim, a regra é simples: só use force push quando souber exatamente o que está fazendo.

Combine Git com comunicação

Git ajuda a organizar o código, mas não substitui comunicação. Em grandes equipes, avise quando for alterar partes críticas do sistema. Principalmente se a mudança afetar contratos, arquitetura, banco de dados ou comportamento global.

Exemplos:

  • “Vou refatorar o fluxo de autenticação.”
  • “Vou alterar a estrutura dessa migration.”
  • “Estou mexendo no componente global de formulário.”
  • “Vou renomear esse service usado em vários módulos.”

Esse tipo de aviso evita trabalho duplicado e reduz conflitos desnecessários.

Crie uma rotina simples

Uma rotina saudável com Git pode ser algo assim:

1
2
3
git checkout main
git pull origin main
git checkout -b feature/minha-tarefa

Durante o desenvolvimento:

1
2
3
4
git status
git diff
git add -p
git commit -m "mensagem clara"

Antes de abrir o PR:

1
2
3
4
5
git fetch origin
git rebase origin/main
composer test
npm test
git push origin feature/minha-tarefa

Adapte os comandos ao stack do projeto, mas mantenha a ideia central: atualizar, revisar, testar e só então enviar.

Git bem usado reduz atrito

Em grandes equipes, boas práticas de Git não são burocracia. Elas reduzem retrabalho, melhoram a qualidade dos pull requests, facilitam revisão, diminuem conflitos e tornam o histórico do projeto mais confiável.

No fim, o objetivo não é apenas “usar Git corretamente”. O objetivo é permitir que várias pessoas trabalhem no mesmo código sem transformar cada merge em um evento traumático.

Então, antes de começar mais uma tarefa, vale a pergunta:

Já deu o pull hoje?

Rating:

comments powered by Disqus