Vale a pena pedir ao Claude Code para resolver conflito de merge?

Pedir ao Claude Code para resolver conflito de merge vale a pena quando o conflito é mecânico: import reordenado, formatação, blocos independentes que cada lado adicionou. Aí ele é acelerador puro. O buraco aparece no conflito de intenção, quando duas pessoas mudaram a mesma regra por motivos diferentes: o porquê de cada lado não está no arquivo, então o agente infere e pode escolher errado em silêncio. O fluxo seguro passa por merge.conflictStyle zdiff3, git log --merge para levantar a intenção, plan mode antes de editar, revisão do diff e git merge --abort quando não fecha.
Fala aí, beleza? Poucas coisas são mais tentadoras que abrir o arquivo, ver aquele monte de <<<<<<< HEAD na tela e pensar "deixa o agente resolver isso e eu vou tomar um café"
E a tentação faz sentido: o Claude Code é uma ferramenta agêntica de terminal que lida com fluxo de git por linguagem natural, executando tarefa de rotina e explicando código complexo
Ele faz stage, escreve mensagem de commit, cria branch, abre PR
Então parece a ferramenta óbvia pro conflito de merge também
Só que tem uma pegadinha aqui: o resultado depende MUITO do tipo de conflito que tu tem na frente. Tem conflito que é trabalho braçal puro, e aí o agente voa. E tem conflito em que a informação que decide a parada nem está no arquivo…
O que o Git realmente marca como conflito:
Antes de decidir se joga pro agente ou não, vale entender o porquê do Git travar
O Git só bloqueia o merge quando ele não consegue escolher sozinho com segurança. Tipicamente em dois casos: quando os dois lados mudam a mesma linha do mesmo arquivo, ou quando um lado edita um arquivo e o outro lado apaga esse mesmo arquivo
Repara que o critério é textual, não semântico. O Git não sabe o que a tua regra de negócio significa, ele sabe que duas pessoas mexeram no mesmo pedaço de texto
Formação Claude Code
Domine Claude Code do absoluto zero até o avançado
- 118 aulas
- 4 projetos
- 9h 33min
E o que são aqueles símbolos? São os marcadores de conflito. Resolver na linha de comando significa apagar os marcadores <<<<<<<, ======= e >>>>>>> e escrever a versão final que tu quer no merge
Ou seja: o Git te entrega um texto sujo e transfere a decisão pra ti
Guarda isso, porque é exatamente daqui que sai o acerto e o erro do agente 🙂
Conflito mecânico x conflito de intenção: quando o Claude Code ajuda e quando atrapalha
Eu gosto de separar conflito em duas famílias, e essa separação resolve quase toda a dúvida de "peço ou não peço pro agente?"
| Critério | Conflito mecânico | Conflito de intenção |
|---|---|---|
| O que está em jogo | A forma do código: ordem, indentação, posição do bloco | Qual comportamento o sistema vai ter no fim |
| O que o agente infere do texto | Quase tudo: os dois lados querem a mesma coisa escrita de jeito diferente | Quase nada: o porquê de cada mudança vive na cabeça de quem fez, não no arquivo |
| Risco de resolução errada silenciosa | Baixo, o erro tende a estourar no build ou no lint | Alto, o arquivo compila lindo e a regra errada vence |
| Nível de revisão necessário | Ler o diff e rodar build e testes | Ler o diff, entender os dois lados e decidir na mão qual regra vale |
A linha do meio é a mais importante da tabela
No conflito de intenção, o dado que decide (o motivo de cada lado ter mudado aquilo) simplesmente NÃO está no texto que o agente lê. Ele vai preencher a lacuna com o que parece razoável
E "parece razoável" é diferente de "é o que o time combinou"
Onde o agente resolve bem (e onde eu não deixaria)
Bora pros cenários concretos, com o critério de decisão de cada um:
- Import reordenado nos dois lados: caso clássico de conflito mecânico. Os dois querem o import lá, só que em posições diferentes. Critério: se o resultado final contém tudo que os dois lados precisavam, tá resolvido
- Formatação, indentação, quebra de linha: mesma coisa. Não tem decisão de negócio escondida, tem estilo. O linter é o juiz aqui
- Blocos independentes que cada lado adicionou: um lado acrescentou uma função, o outro acrescentou outra, e o Git marcou porque ficaram grudadas. Manter os dois costuma ser a resposta. Critério: os dois blocos fazem coisas diferentes e não se sobrescrevem
- Renomeação em massa de um lado e uso do nome antigo do outro: aqui o agente ajuda bastante, porque é repetição pura. Critério: a renomeação é uma decisão já tomada, não uma disputa
- Regra de negócio alterada dos dois lados: essa eu não deixaria no automático. Uma pessoa mudou o desconto por um motivo, a outra mudou por outro. Não existe "merge" dessas duas cabeças, existe escolha
- Arquivo editado de um lado e apagado do outro: conflito de intenção disfarçado de conflito de arquivo. Alguém decidiu que aquilo morreu, alguém decidiu que aquilo evoluiu. Isso é conversa humana, não prompt
- Migração de schema: o pior cenário pra delegar sem ler. Ordem de migração e estado do banco são coisas que o agente não enxerga a partir do arquivo em conflito
O padrão é fácil de decorar: se a resposta certa está contida no texto, o agente é um acelerador massa. Se a resposta certa depende de contexto que só existe fora do arquivo, ele vira um chute confiante
Os erros conhecidos do Claude Code em conflito de merge
Aqui não é achismo, é registro público no repositório oficial
Sintoma 1: o arquivo fica com chaves desbalanceadas
A issue #28312 do anthropics/claude-code descreve um caso bem específico e bem sacana
Quando os dois branches adicionam blocos antes de uma chave de fechamento compartilhada, o algoritmo do Git tira essa chave de dentro dos marcadores de conflito
O Claude então mantém os dois blocos (o que faz sentido!) mas trata a chave de fora como contexto intocável
Resultado: falta chave de fechamento, o arquivo quebra. O relato descreve o problema como agnóstico de linguagem, citando C#, Java, TypeScript, C++, Go e Rust
Causa: a ambiguidade do formato padrão de conflito. Com só dois lados visíveis, não dá pra saber o que era o original
Prevenção: o próprio relato aponta a mitigação de custo zero disponível hoje, que é trocar o estilo de conflito
git config merge.conflictstyle zdiff3
Com isso o ancestral comum passa a aparecer entre os marcadores, e a ambiguidade some
Sintoma 2: a tela volta duplicada e com funcionalidade sumida
A issue #8287, aberta em 28/09/2025 no mesmo repositório, relata um dashboard quebrado depois de uma tentativa de merge entre dois branches: elementos de UI duplicados e funcionalidades perdidas
A issue foi fechada como not planned, então não trate como bug com correção prometida, trate como aviso
E repara que o estrago é de interface, que é justamente onde a duplicação passa despercebida no diff e só aparece quando alguém abre a página. Se tu já pediu design de tela no Claude Code, sabe que componente duplicado é fácil de nascer e difícil de notar
Prevenção: checagem de build e lint depois da resolução, sempre. E se o resultado não fechar, tem saída:
git merge --abort
O git merge --abort tenta reverter pro estado anterior ao merge. Ter esse botão de pânico na manga muda o teu nível de coragem 😀
Como descrever a intenção dos dois lados no prompt
Agora o fluxo em si. A ideia é simples: dar ao agente o contexto que o arquivo não tem, e só depois deixar ele escrever
- Configure o estilo de conflito antes de qualquer coisa
git config merge.conflictstyle zdiff3
O merge.conflictStyle aceita merge (que é o padrão), diff3 e zdiff3. O diff3 adiciona o marcador ||||||| com o texto original antes do =======, trazendo a versão base inline
O erro comum deste passo: deixar no padrão e esperar que o agente adivinhe o que era o original. Com a base na tela, ele para de tratar linha de fora como intocável
- Levante a intenção dos dois lados com o próprio Git
git log --merge
git log --merge -p
git diff
O git log --merge mostra só os commits de cada lado do merge que tocam arquivo atualmente em conflito. Com -p tu vê os diffs. E o git diff durante o merge mostra apenas o que ainda está em conflito
O erro comum deste passo: pular ele. É exatamente aqui que tu descobre que um lado mudou a regra por causa de um bug e o outro por causa de um pedido novo
- Entre em plan mode antes de deixar ele editar
No modo normal, o Shift+Tab passa primeiro para auto accept edits, e o Shift+Tab seguinte entra em plan mode
Em plan mode as ferramentas somente leitura rodam normalmente e edições de arquivo nunca são auto aprovadas, mesmo que exista regra de allow que combine. Ou seja: ele lê, entende e te devolve um plano, sem mexer nos teus arquivos
O erro comum deste passo: parar no auto accept edits achando que já está no plan mode. Um Shift+Tab a menos e ele sai editando 😛
- Escreva o prompt dizendo o que cada lado queria e qual comportamento deve valer
Nada de "resolva os conflitos". Esse é O erro clássico: tu transfere a decisão de negócio pra quem não tem como saber
O formato que funciona é mais ou menos assim: o lado A mudou X porque tal coisa, o lado B mudou X porque tal outra, o comportamento final deve ser Y, mantenha as duas funções novas e não altere a assinatura pública
O erro comum deste passo: descrever o resultado técnico e esquecer de dizer qual regra vence quando as duas não cabem juntas
- Revise o diff e rode build e testes
Leia o diff inteiro, sem pular. É o mesmo cuidado de quando tu pede refatoração sem mudar comportamento: o código pode ficar bonito e a semântica sair diferente do combinado
O erro comum deste passo: aceitar porque compilou. Compilar não é o mesmo que estar certo
- Se não fechar, aborta e resolve na mão
git merge --abort
Voltar ao estado anterior custa segundos. Consertar merge ruim que já virou commit custa a tarde inteira
O erro comum deste passo: insistir em pedir "conserta isso agora" em cima de um arquivo já bagunçado, empilhando erro sobre erro
Alternativas e reforços: mergetool, Copilot, GitHub web, worktrees, rerere e hooks
Um panorama honesto do entorno, porque conflito de merge não se resolve só com prompt
- claude-mergetool: existe, funciona como mergetool do Git, mas é projeto de terceiro. O claude-mergetool é mantido pelo usuário 9999years no GitHub, exige o CLI
claudeinstalado e no PATH, e roda viagit mergetool -t claude(oujj resolve --tool claude). Detalhe importante: o projeto lança o Claude com--permission-mode=acceptEdits, então ele edita sem te perguntar - Fix with Copilot no GitHub: o GitHub tem resolução automática de conflito por IA no merge box, com o botão Fix with Copilot, que aparece quando o acesso ao Copilot cloud agent está habilitado no repositório. O Copilot analisa as mudanças conflitantes, resolve e verifica se build, testes e linter continuam passando. Só que isso é Copilot, não é Claude Code
- Editor web do GitHub: dá pra resolver na interface apenas conflitos simples envolvendo mudanças concorrentes de linha. Os outros tipos pedem linha de comando mesmo
- git worktrees: ótimo pra reduzir colisão antes dela existir. Cada worktree é um checkout separado no próprio branch, criado a partir de um commit existente, então o repositório precisa ter ao menos um commit. Trabalhos paralelos ficam isolados e tu evita edição em cima de edição
- git rerere: esse é subestimado demais. O
git rereregrava o resultado do automerge conflitado junto com a tua resolução manual e reaplica depois, e ogit mergeinvoca ele automaticamente quando o automerge falha. Basta habilitar a variável de configrerere.enabled. Se tu resolve o mesmo conflito toda semana, isso é ouro - Hooks do Claude Code: hooks de PreToolUse podem negar comandos de Bash considerados perigosos, o que serve bem pra barrar comando de git que tu não quer que rode nunca. Só lembra que o PostToolUse dispara depois que o comando termina e não desfaz a ação, então prevenção só existe no Pre
Veredito: quando pedir, quando resolver na mão
Vale a pena? Vale, com escopo definido
Use o agente como acelerador de conflito mecânico: import, formatação, blocos independentes, renomeação repetitiva. É trabalho chato, repetitivo e verificável pelo build. Delegar isso é ganho puro
Use o agente também como leitor de contexto nos casos de intenção. Pedir pra ele ler o git log --merge -p e te explicar o que cada lado estava tentando fazer é MUITO útil, e não tem risco nenhum: ele não está decidindo, está resumindo
O que não delega: a escolha de qual regra vence. Essa continua humana, e vai continuar sendo por um bom tempo
E a regra que não tem exceção: ninguém aceita o merge sem ler o diff e rodar build e testes. Nem quando o agente jura que está tudo certo 😀
Conclusão
Conflito de merge é um daqueles casos em que o agente parece perfeito e nem sempre é
Ele enxerga o texto, e o texto é metade do problema. A outra metade (o porquê de cada lado) tu precisa colocar no prompt na mão
Próximo passo concreto, que dá pra fazer agora em dois comandos: habilita o zdiff3 e o rerere no teu repositório
git config merge.conflictstyle zdiff3
git config rerere.enabled true
Depois treina o fluxo em um conflito pequeno, em plan mode, antes de confiar em um merge grande. Erra barato primeiro, beleza?
E me conta aqui nos comentários qual tipo de conflito mais aparece no teu dia: mecânico ou daqueles em que duas pessoas mudaram a mesma regra por motivos diferentes?
até o próximo post!
Perguntas frequentes
Como faço o Claude Code entender a intenção de cada lado antes de resolver o conflito?
Antes de mandar resolver, use git log –merge para ver só os commits de cada lado que tocam o arquivo em conflito, e adicione -p pra ver os diffs. Isso mostra o motivo da mudança, algo que não aparece no arquivo com os marcadores. O git diff durante o merge mostra só o que ainda está conflitante, o que ajuda a limitar o que o agente precisa olhar.
Dá pra usar o plan mode do Claude Code antes de deixar ele editar o arquivo em conflito?
Sim, o plan mode faz o Claude Code ler os arquivos e propor um plano sem editar nada, já que edições nunca são auto aprovadas nesse modo. Ele é acionado com Shift+Tab a partir do modo normal, passando primeiro por auto accept edits e depois entrando em plan mode. É uma forma de revisar a proposta de resolução antes de ela virar mudança real no arquivo.
Como desfazer um merge se a resolução do Claude Code sair errada?
O comando git merge –abort tenta reverter o repositório para o estado anterior ao merge. Vale rodar isso se notar que a resolução ficou estranha antes de commitar, em vez de tentar corrigir o arquivo já quebrado na mão. É a rede de segurança básica pra qualquer merge que desanda, com ou sem agente envolvido.
Existe uma ferramenta oficial da Anthropic pra automatizar merge conflict com Claude Code?
Não. O que existe é o claude-mergetool, um projeto de terceiro que se integra ao Git como mergetool, sem vínculo com a Anthropic. Por ser projeto externo, trate como ferramenta de terceiro mesmo: o cuidado de revisar o diff e rodar build e testes antes de aceitar o merge continua valendo igual.
O GitHub resolve conflito de merge com IA direto na interface web?
Sim, mas com o Copilot, não com o Claude Code. Com o Copilot cloud agent habilitado no repositório aparece o botão Fix with Copilot no merge box, que analisa as mudanças conflitantes e verifica se build, testes e linter continuam passando. O editor de conflito padrão do GitHub, sem IA, só resolve casos simples de mudança concorrente de linha.
Como evitar resolver o mesmo conflito de merge de novo em cada rebase?
O Git tem o git rerere, que grava o resultado do automerge conflitado junto com a resolução manual feita e reaplica isso depois automaticamente. Ele é acionado sozinho pelo git merge quando o automerge falha, mas precisa da variável rerere.enabled habilitada. É útil justamente em rebases longos onde o mesmo trecho conflita repetidas vezes.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares
Bateu o limite de uso do Claude Code? Como retomar a tarefa sem refazer tudo
Bateu o limite de uso do Claude Code? Veja como retomar a tarefa de onde parou com /usage, CLAUDE.md e --continue, sem refazer nada.
Como pagar o Claude Code no Brasil: cartão, dólar, IOF e quanto fica em reais
Claude Code preço Brasil na prática: câmbio, IOF de 3,5% e quanto fica na fatura. Planos Pro e Max convertidos em reais e como pagar com cartão.
Como instalar uma skill no Claude Code: passo a passo
Saiba como instalar skill no Claude Code: use a pasta pessoal para todas as sessões ou a pasta de projeto para versionar. Frontmatter YAML é obrigatório.
