Criação de Apps

Conflito de merge no Git: o que significa e como resolver

Resposta rápida

O conflito de merge acontece quando duas branches alteraram o mesmo trecho de um arquivo e o Git não sabe qual versão manter. Para resolver, abra o arquivo, localize as marcas de conflito, edite deixando o texto final correto, apague as marcas, faça git add no arquivo e conclua com git commit. Se quiser desistir, use git merge --abort.

Neste artigo
  1. Por que o conflito acontece
  2. Como o arquivo fica
  3. Passo a passo para resolver
  4. Quando você quer desistir
  5. Como decidir qual versão manter
  6. E quando o conflito é em arquivo de dependências
  7. Ferramentas que ajudam a resolver
  8. Como reduzir a frequência de conflitos

Você tenta juntar duas branches e o Git responde algo como “CONFLICT (content): Merge conflict in arquivo.txt. Automatic merge failed”. A primeira reação é achar que quebrou o projeto. Não quebrou: o Git juntou tudo o que conseguiu e parou nos pontos onde precisa da sua decisão.

Se os conceitos de branch e merge ainda são novos, veja Git no dia a dia antes de continuar.

Por que o conflito acontece

O Git é inteligente para juntar mudanças que não se tocam. Se uma branch alterou o início de um arquivo e a outra o final, ele une as duas sem perguntar. O conflito surge quando:

  • as duas branches mudaram as mesmas linhas de forma diferente;
  • uma branch apagou um arquivo que a outra modificou;
  • as duas criaram um arquivo com o mesmo nome e conteúdos diferentes.

Nesses casos, o Git não tem como adivinhar o que você quer e deixa o arquivo marcado.

Como o arquivo fica

Ao abrir o arquivo com conflito, você verá marcas inseridas pelo Git. Elas têm este formato:

  • uma linha que começa com sete sinais de menor (<<<<<<<) seguida do nome da sua branch atual;
  • o trecho como está na sua branch;
  • uma linha com sete sinais de igual (=======) separando as duas versões;
  • o trecho como está na outra branch;
  • uma linha com sete sinais de maior (>>>>>>>) seguida do nome da outra branch.

Tudo entre a primeira marca e a linha dos iguais é a sua versão. Tudo entre os iguais e a última marca é a versão que está chegando. Seu trabalho é decidir o que fica.

Passo a passo para resolver

  1. Veja quais arquivos estão em conflito com git status. Eles aparecem como “both modified” (ambos modificados) ou sob a seção de caminhos não mesclados.
  2. Abra cada arquivo em um editor. Editores de código como o VS Code destacam os conflitos e oferecem botões para aceitar a versão atual, a que chega ou as duas (veja configurar o VS Code).
  3. Decida o resultado final. Há três saídas:
  • manter só a sua versão;
  • manter só a versão da outra branch;
  • combinar as duas, escrevendo um texto que contenha o que importa de cada uma.
  1. Apague as marcas (<<<<<<<, ======= e >>>>>>>). O arquivo final não pode conter nenhuma delas.
  2. Teste. Rode o projeto ou os testes. Um conflito mal resolvido pode gerar código que nem roda.
  3. Marque como resolvido com git add nome-do-arquivo.
  4. Conclua o merge com git commit. O Git já sugere uma mensagem padrão que você pode aceitar.

Quando você quer desistir

Se o conflito for grande demais, ou você percebeu que juntou a branch errada, dá para cancelar: git merge --abort. O repositório volta ao estado de antes do merge, sem perder nada. Depois, converse com quem fez a outra mudança ou refaça o merge com mais calma.

Se você estava atualizando sua branch com git pull e deu conflito, o raciocínio é o mesmo: resolver os arquivos, git add e commit. Se estiver usando rebase em vez de merge, os comandos de continuação e cancelamento são outros (rebase --continue e rebase --abort). Para quem está começando, o merge costuma ser mais fácil de entender.

Como decidir qual versão manter

Nem sempre a escolha é óbvia. Algumas perguntas ajudam:

  • O que cada lado queria fazer? Veja as mensagens de commit com git log.
  • As duas mudanças são compatíveis? Muitas vezes dá para ficar com as duas.
  • Qual é a mais recente, ou a que tem a regra de negócio correta?
  • Existe teste que valide o comportamento esperado?

Em equipe, o melhor é falar com a pessoa que fez a outra alteração. Em dúvida, uma conversa de dois minutos evita horas de retrabalho.

E quando o conflito é em arquivo de dependências

Arquivos gerados automaticamente, como os de travamento de versões de pacotes, costumam gerar conflitos longos. Em vez de editar à mão, a prática comum é escolher uma versão e depois pedir ao gerenciador de pacotes que regenere o arquivo. Confira a documentação da ferramenta que usa.

Ferramentas que ajudam a resolver

Resolver tudo à mão no texto é possível, mas há recursos que facilitam:

  • Editores de código com destaque visual: mostram as duas versões lado a lado e oferecem botões como aceitar a mudança atual, a recebida ou ambas.
  • Ferramentas de comparação (diff e merge tools): o Git pode abrir uma delas com o comando git mergetool, se estiver configurada.
  • Interfaces do GitHub: para conflitos simples em propostas de mudança, o site oferece um editor para resolver no navegador.

Qualquer que seja a ferramenta, o resultado precisa ser o mesmo: arquivo coerente, sem marcas, testado e adicionado ao commit. Em conflitos grandes, resolva um arquivo por vez e vá confirmando o que já está pronto.

Como reduzir a frequência de conflitos

  • Branches de vida curta. Quanto mais tempo uma branch fica isolada, mais ela se afasta da principal.
  • Atualize sua branch com frequência. Traga as novidades da principal para a sua com regularidade, resolvendo conflitos pequenos no caminho.
  • Commits pequenos e focados.
  • Combine a divisão do trabalho: evite que duas pessoas editem o mesmo arquivo grande ao mesmo tempo.
  • Evite reformatações em massa misturadas com mudanças de lógica.

Conflitos fazem parte de qualquer projeto com mais de uma linha de trabalho. Quando você os encara como uma pergunta do Git, “qual das versões vale?”, deixam de ser um susto e viram uma tarefa de dez minutos. Para ampliar o domínio da ferramenta, volte a Git e GitHub para iniciantes.

  • Git
  • Programação
  • Erros

Perguntas frequentes

O conflito de merge significa que fiz algo errado?

Não. É uma situação normal quando duas pessoas, ou duas branches, mexem na mesma região do código. O Git só pede que um humano decida qual versão fica.

Posso cancelar um merge que deu conflito?

Sim. Enquanto o merge não foi concluído, o comando git merge --abort desfaz a tentativa e devolve o repositório ao estado de antes. Nenhum commit é perdido.

Como evitar conflitos?

Faça commits pequenos, atualize sua branch com frequência a partir da principal, combine com a equipe quem mexe em cada arquivo e evite reformatar arquivos inteiros sem necessidade, porque isso altera muitas linhas de uma vez.

Leia também

Criação de Apps

Como configurar o VS Code para programar: guia para iniciantes

Instalação, ajustes essenciais, extensões confiáveis e atalhos para deixar o editor pronto para estudar.

· 5 min de leitura
Criação de Apps

Git e GitHub para iniciantes: o que são e como usar

O que cada um faz, os comandos essenciais e o fluxo mais simples para guardar o histórico dos seus códigos.

· 5 min de leitura
Criação de Apps

Git no dia a dia: commit, branch e como desfazer erros sem pânico

Os comandos de Git que você realmente usa toda semana e como voltar atrás quando algo dá errado.

· 5 min de leitura
Criação de Apps

Como ler mensagens de erro e depurar código sem desespero

Um método passo a passo para entender o que o computador está dizendo e corrigir bugs com calma.

· 5 min de leitura

Deixe seu comentário