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
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
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 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