Mesclando branches e resolvendo conflitos


Seu branch de feature está pronto. O toggle funciona, você já commitou as mudanças, e agora você quer que esse trabalho fique na main, onde vive o código do resto da equipe. Na maior parte do tempo, trazer esse trabalho de volta é rápido e silencioso: o Git compara os dois branches, não encontra nada que se sobreponha e incorpora o trabalho sem nenhuma etapa extra. Às vezes, porém, você e um colega de equipe alteraram exatamente as mesmas linhas em branches diferentes, e o Git não consegue adivinhar qual versão você quer manter. Essa situação aparece em quase todo projeto com mais de uma pessoa commitando nele. É uma parte normal e comum do trabalho com branches, e significa que o Git encontrou duas ideias diferentes para as mesmas linhas e quer que você decida qual delas prevalece.
Trazendo um branch de volta com git merge
Digamos que você criou o toggle de Fahrenheit em um branch próprio, add-fahrenheit-toggle, e a main não avançou desde que você criou esse branch a partir dela. Mude para a main e execute git merge com o nome do branch que você quer trazer:
$ git switch main
$ git merge add-fahrenheit-toggle
Updating 4f2a891..8c3d1a0
Fast-forward
src/index.js | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)git merge <branch> sempre mescla o branch indicado no branch em que você está no momento, então mudar para a main primeiro faz diferença. O branch em que você está é sempre o que recebe a mesclagem. Depois que isso é executado, a main passa a ter todos os commits de add-fahrenheit-toggle. O branch de feature em si permanece intacto: você pode continuar trabalhando nele ou apagá-lo agora que o trabalho também vive na main.
git merge branch-name traz os commits daquele branch para o branch em que você está no momento, então mude para a main primeiro. A maioria das mesclagens acontece silenciosamente em segundo plano e você segue com o seu dia. Nada muda no branch de feature em si; você pode continuar usando ele ou apagá-lo depois que a main já tiver o trabalho. Como é um conflito de merge
Um conflito acontece quando as mesmas linhas mudam nos dois lados de uma mesclagem, e o Git não tem como saber qual versão você quer. Digamos que um colega de equipe mesclou um spinner de carregamento na main que alterou uma função em src/index.js, e o seu branch add-fahrenheit-toggle alterou a mesma função para adicionar o toggle. Agora a mesclagem para na metade em vez de terminar:
$ git switch main
$ git merge add-fahrenheit-toggle
Auto-merging src/index.js
CONFLICT (content): Merge conflict in src/index.js
Automatic merge failed; fix conflicts and then commit the result.Isso é um conflito de merge. Abra o arquivo e você vai encontrar o Git marcando exatamente onde as duas versões discordam:
<<<<<<< HEAD
showLoadingSpinner(true);
=======
const tempF = celsiusToFahrenheit(tempC);
>>>>>>> add-fahrenheit-toggle<<<<<<< HEAD marca o início do que está atualmente no seu branch (main, nesse caso). ======= divide as duas versões. >>>>>>> add-fahrenheit-toggle marca o fim da versão do branch que está sendo trazido. Tudo entre os marcadores é o mesmo punhado de linhas, escrito de duas formas diferentes.
Um conflito significa que o Git precisa do seu julgamento; nada está quebrado. O Git encontrou duas mudanças nas mesmas linhas e não tem como adivinhar qual você quer, então ele pausa e pede para você decidir. Edite o arquivo até que ele fique do jeito que você quer, mantendo uma versão, a outra, as duas, ou algo novo que combine as duas, e então apague as linhas dos marcadores:
showLoadingSpinner(true);
const tempF = celsiusToFahrenheit(tempC);Depois que o arquivo estiver do jeito certo, adicione ao stage e faça o commit dele exatamente como faria com qualquer outra mudança:
$ git add src/index.js
$ git commitExecutar git commit sem mensagem aqui abre seu editor com uma mensagem que o Git já preparou, descrevendo a mesclagem. Salve e feche, e a mesclagem estará completa.
<<<<<<<, =======, e >>>>>>>, edite até ficar do jeito que você quer e depois apague essas linhas de marcadores. Termine com git add e git commit. Meu primeiro conflito pareceu uma emergência; no fim, era só o Git me fazendo uma pergunta bem comum. Juntando tudo de volta
Mesclar é o que faz o trabalho com branches valer a pena: você experimenta com segurança na sua própria linha de histórico, tema coberto em Branches, e depois incorpora esse trabalho de volta à main quando ele estiver pronto, conflitos e tudo. No GitHub, a mesma operação geralmente acontece por meio de um pull request em vez de um git merge local na sua máquina; o capítulo fluxo de pull request cobre como propor, revisar e mesclar uma mudança em um projeto compartilhado. Se uma mesclagem algum dia acabar em um lugar que você não pretendia depois de já ter commitado, desfazendo coisas cobre como recuar com segurança.

