Um passo a passo do tutorial Resolver conflitos de merge: por que fazer merge da mudança da Alice colide com a sua, como ler os marcadores de conflito e como concluir o merge.
Este cenário coloca você em uma situação muito comum em equipe: você e um colega mudaram a mesma linha, e o Git precisa de ajuda para combinar as duas. Você vai trazer o trabalho do colega, fazer merge na sua branch, resolver a colisão à mão e concluir o merge.
A situação
O Git faz merge sozinho de edições em linhas diferentes; a mesma linha mudada nos dois lados é um conflito.
Você está na branch feature/update-subtitle, onde reescreveu o subtítulo do hero em index.html. Enquanto isso, sua colega Alice fez push da própria edição dessa mesma linha de subtítulo em main.
Duas edições diferentes na mesma linha, em duas branches. O Git consegue fazer fast-forward ou merge automático em mudanças que tocam pontos diferentes, mas quando ambos os lados mudam a mesma linha ele não tem como adivinhar qual vence. Isso é um conflito de merge, e só você pode decidir o resultado.
Um conflito não é um erro seu. É o Git pausando para um humano escolher, porque as duas edições, isoladamente, são válidas.
Passo a passo
Resolver um conflito: edite o arquivo, prepare-o e então commite.
Trazer main para o último estado
git checkout main
git pull
Trocar para main e dar pull traz a mudança de subtítulo da Alice do remoto, então seu main local já tem o trabalho dela.
Fazer merge de main na sua branch de feature
git checkout feature/update-subtitle
git merge main
O Git tenta combinar a linha de subtítulo da Alice com a sua, falha nessa linha e relata um conflito em index.html. O merge pausa aqui.
Abrir o arquivo e ler os marcadores
A região em conflito fica assim:
<<<<<<< HEAD
sua versão do subtítulo
=======
versão da Alice do subtítulo
>>>>>>> main
HEAD é sua branch; a parte após ======= é a mudança entrando de main.
Resolver e concluir o merge
git add index.html
git commit
Edite index.html para conter apenas o único subtítulo final que você quer, e remova as linhas <<<<<<<, ======= e >>>>>>>. Preparar o arquivo diz ao Git que o conflito foi resolvido, e o commit registra o merge.
Como ler os marcadores de conflito
Os três marcadores e os dois lados que eles envolvem.
Os três marcadores aparecem sempre na mesma ordem:
<<<<<<< HEAD até ======= é o seu lado.
======= até >>>>>>> é o lado entrando.
- Resolver significa deixar o conteúdo que você quer e remover as três linhas de marcadores.
git status durante um conflito lista os arquivos pendentes em "Unmerged paths". Quando essa lista esvazia, é hora de commitar.
Não deixe nenhuma linha de marcador no arquivo. Um ======= esquecido será commitado como conteúdo real e quebrará a página. Procure pelos marcadores no arquivo antes de prepará-lo.
Se quiser começar do zero
Se a resolução virar bagunça, você pode abortar o merge inteiro e voltar ao estado anterior:
git merge --abort
Comandos de conflito de merge que você vai usar de verdade
Além deste cenário, estes são os comandos que aparecem toda vez que você bate num conflito:
- Ver quais arquivos estão em conflito —
git status, ou git diff --name-only --diff-filter=U para só a lista
- Abrir o conflito — edite o arquivo e remova os marcadores
<<<<<<<, =======, >>>>>>>, mantendo o texto final
- Manter um lado inteiro de um arquivo —
git checkout --ours <arquivo> (sua branch) ou git checkout --theirs <arquivo> (a branch entrando), depois git add <arquivo>
- Concluir o merge — prepare os arquivos resolvidos com
git add, depois git commit (ou git merge --continue)
- Desistir e voltar —
git merge --abort restaura o estado anterior ao merge
A forma mais rápida de ganhar confiança é provocar um conflito de propósito no terminal aqui e resolvê-lo de algumas maneiras diferentes: à mão, com --ours e com --theirs.