Git na prática: branches, pull requests e como resolver conflitos
Trabalhar com Git branches e pull requests é o passo seguinte ao básico do Git (commit, push, pull): cada mudança fica em uma branch separada, revisada por meio de um pull request antes de entrar no código principal. Esse fluxo evita que código quebrado chegue à produção, deixa um histórico claro de cada decisão e é exatamente o que empresas esperam de um desenvolvedor júnior. Se você ainda não conhece os comandos básicos, comece por Git e GitHub para iniciantes.
O que é uma branch no Git
Uma branch é uma linha independente de desenvolvimento. A branch principal (normalmente main) guarda o código estável. Para cada nova funcionalidade ou correção, você cria uma branch, trabalha nela e, quando terminar, propõe juntar as mudanças à main.
git switch main
git pull # atualiza a main
git switch -c feature/login # cria a branch e entra nela
Em versões antigas do Git, o equivalente é git checkout -b feature/login.
Nomes de branch
Use nomes que digam o propósito: feature/cadastro-cliente, fix/erro-calculo-frete, docs/readme-instalacao. Muitas equipes incluem o número da tarefa: fix/231-calculo-frete.
Commits pequenos e com boas mensagens
Faça commits a cada passo lógico, não um commit gigante no fim do dia:
git add src/main/java/.../ClienteController.java
git commit -m "Adiciona validação de e-mail no cadastro de cliente"
Boas mensagens dizem o que mudou e, se necessário, por quê. "Ajustes" e "correções" não ajudam ninguém daqui a seis meses.
Enviando e abrindo o pull request
git push -u origin feature/login
No GitHub, aparece a opção de abrir um pull request (PR). Um bom PR tem:
- Título claro: "Adiciona login com e-mail e senha".
- Descrição: o que foi feito, por quê, e como testar.
- Tamanho razoável: PRs pequenos são revisados mais rápido e com mais cuidado. Se ficou enorme, divida.
- Testes: inclua ou atualize os testes. Veja testes automatizados com JUnit.
- Prints, se houver mudança visual.
Modelo de descrição:
## O que muda
Adiciona endpoint POST /auth/login com validação de credenciais.
## Por quê
Necessário para o painel do cliente (tarefa #231).
## Como testar
1. Rode a aplicação com o perfil dev.
2. Envie POST /auth/login com o usuário de teste.
3. Verifique o token retornado.
Rascunhos (draft pull requests) são úteis para mostrar trabalho em andamento e pedir opinião cedo.
Revisão de código
A revisão (code review) é onde a equipe aprende junto. Ao receber comentários:
- não leve para o lado pessoal: a revisão é sobre o código;
- responda a cada comentário, mesmo que seja para explicar uma decisão;
- faça os ajustes em novos commits na mesma branch; o PR é atualizado automaticamente.
Ao revisar o código de outra pessoa, seja específico e gentil: "Este método pode retornar null quando o cliente não existe; que tal usar Optional?" é melhor que "isso está errado".
Mantendo a branch atualizada
Enquanto você trabalha, outras pessoas atualizam a main. Para trazer essas mudanças:
git switch main
git pull
git switch feature/login
git merge main
Algumas equipes preferem git rebase main, que deixa o histórico linear. Regra importante: não faça rebase de branches que outras pessoas também usam, porque o rebase reescreve o histórico.
Resolvendo conflitos
Um conflito acontece quando duas pessoas alteram as mesmas linhas. O Git marca o trecho:
<<<<<<< HEAD
private static final int LIMITE = 10;
=======
private static final int LIMITE = 20;
>>>>>>> main
Para resolver:
- Abra o arquivo e decida o conteúdo correto. Às vezes é uma das versões, às vezes a combinação das duas.
- Remova os marcadores
<<<<<<<,=======e>>>>>>>. - Compile e rode os testes.
- Marque como resolvido e finalize:
git add arquivo-resolvido.java
git commit
IDEs como IntelliJ e VS Code têm ferramentas visuais que facilitam muito essa etapa. Se tiver dúvida sobre a intenção da outra mudança, pergunte a quem a fez.
Formas de fazer o merge
| Tipo | Resultado | Quando usar |
|---|---|---|
| Merge commit | Mantém todos os commits e cria um commit de merge | Histórico completo da branch |
| Squash and merge | Junta todos os commits da branch em um só | Histórico da main limpo, um commit por PR |
| Rebase and merge | Reaplica os commits na main sem commit de merge | Histórico linear com commits individuais |
Siga o padrão da equipe. Depois do merge, apague a branch.
Desfazendo erros comuns
- Mudanças não commitadas que você quer descartar:
git restore arquivo. - Arquivo adicionado por engano:
git restore --staged arquivo. - Mensagem errada no último commit (ainda não enviado):
git commit --amend. - Desfazer um commit já enviado:
git revert <hash>, que cria um novo commit invertendo as mudanças, sem reescrever o histórico. - Trabalho em andamento que precisa ficar de lado:
git stashe, depois,git stash pop. - "Perdi um commit":
git reflogmostra tudo o que aconteceu recentemente e permite recuperar quase qualquer coisa.
Evite git push --force em branches compartilhadas. Se precisar, prefira git push --force-with-lease, que não sobrescreve trabalho que você ainda não viu.
Proteção da branch principal
No GitHub, configure regras para a main: exigir pull request, exigir aprovação e exigir que os testes passem. Isso impede que alguém envie código direto para produção por engano. Se o site é publicado automaticamente a partir da main, essas regras são ainda mais importantes; veja deploy de site estático grátis.
Por que isso importa para a carreira
Um perfil no GitHub com projetos organizados em branches, PRs bem descritos e testes mostra que você sabe trabalhar em equipe. Veja portfólio de desenvolvedor júnior e entrevista técnica para júnior.
Sistemas sob medida
A PruPru desenvolve APIs, sistemas web e integrações com as mesmas práticas descritas neste guia. Se a sua empresa precisa de software bem construído, conheça os serviços.
Ver serviços →Perguntas frequentes
Qual a diferença entre merge e rebase?
O merge junta as duas linhas de desenvolvimento e cria um commit de merge, preservando o histórico. O rebase reaplica os seus commits sobre a outra branch, criando um histórico linear, mas reescrevendo os commits. Não faça rebase de branches compartilhadas.
O que fazer quando aparece um conflito?
Abra os arquivos indicados, escolha o conteúdo correto em cada trecho marcado, remova os marcadores, compile, rode os testes, adicione os arquivos e finalize o commit. Em caso de dúvida, converse com quem fez a outra alteração.
Qual o tamanho ideal de um pull request?
O menor possível que faça sentido sozinho. PRs pequenos, com algumas centenas de linhas no máximo, são revisados mais rápido e com mais atenção.
Como desfazer um commit que já foi enviado?
Use git revert com o identificador do commit. Ele cria um novo commit que desfaz as mudanças sem reescrever o histórico, o que é seguro em branches compartilhadas.