Mesclando branches e resolvendo conflitos


Sua branch de feature está pronta. O toggle funciona, você fez commit das mudanças, e agora quer que esse trabalho esteja em main onde o código do resto do time fica. Na maioria das vezes trazer isso é rápido e tranquilo: Git compara as duas branches, não encontra nada que se sobrepõe, e incorpora o trabalho sem passos extras. Às vezes, porém, você e um colega de trabalho mudaram exatamente as mesmas linhas em branches diferentes, e Git não consegue adivinhar qual versão você quer manter. Essa situação aparece em quase todo projeto com mais de uma pessoa fazendo commit nele. É uma parte normal e cotidiana do branching, e significa que Git encontrou duas ideias sobre as mesmas linhas e quer sua decisão sobre qual vence.
Trazendo uma branch de volta com git merge
Digamos que você construiu o toggle Fahrenheit em sua própria branch, add-fahrenheit-toggle, e main não se moveu desde que você a criou. Mude para main e execute git merge com o nome da branch que 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 a branch nomeada na branch em que você está no momento, então mudar para main primeiro é importante. A branch em que você está é a que recebe o merge. Após isso rodar, main tem todos os commits de add-fahrenheit-toggle. A branch de feature em si fica intocada: você pode continuar trabalhando nela ou deletá-la agora que seu trabalho vive em main também.
git merge branch-name traz os commits daquela branch para a branch em que você está no momento, então mude para main primeiro. A maioria dos merges acontece silenciosamente no fundo e você continua seu dia. Nada sobre a branch de feature em si muda; você pode continuar usando-a ou deletá-la uma vez que main tenha o trabalho. Como um conflito de merge se parece
Um conflito acontece quando as mesmas linhas mudam nos dois lados de um merge, e Git não tem jeito de dizer qual versão você quer. Digamos que um colega mesclou um spinner de carregamento em main que mudou uma função em src/index.js, e sua branch add-fahrenheit-toggle mudou a mesma função para adicionar o toggle. Fazer merge agora para no meio 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.Esse é um conflito de merge. Abra o arquivo e você encontrará que Git marcou 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 em sua branch (main, neste caso). ======= divide as duas versões. >>>>>>> add-fahrenheit-toggle marca o fim da versão da branch que vem entrando. Tudo entre os marcadores é o mesmo punhado de linhas, escrito de duas formas diferentes.
Um conflito significa que Git precisa de seu julgamento; nada está quebrado. Git encontrou duas mudanças nas mesmas linhas e não tem jeito de adivinhar qual você quer, então pausa e pede que você decida. Edite o arquivo até ele ler do jeito que você quer, mantendo uma versão, ambas, ou algo novo que as combine, depois delete as linhas de marcador em si:
showLoadingSpinner(true);
const tempF = celsiusToFahrenheit(tempC);Uma vez que o arquivo pareça certo, faça stage e commit exatamente como qualquer outra mudança:
$ git add src/index.js
$ git commitRodar git commit sem mensagem aqui abre seu editor com uma mensagem que Git já preparou, descrevendo o merge. Salve e feche, e o merge está completo.
<<<<<<<, =======, e >>>>>>>, edite até ler como você quer, depois delete essas linhas de marcador. Termine com git add e git commit. Meu primeiro conflito pareceu uma emergência; acabou sendo Git me fazendo uma pergunta bem ordinária. Trazendo de volta junto
Mergear é o que torna branching a pena fazer: você experimenta seguro em sua própria linha de histórico, coberto em Branches, depois dobra esse trabalho de volta em main uma vez que está pronto, conflitos e tudo. Em GitHub, a mesma operação geralmente acontece através de um pull request em vez de um git merge local na sua máquina; o capítulo fluxo de pull request cobre propor, revisar, e mesclar uma mudança em um projeto compartilhado. Se um merge pousar em algum lugar que você não pretendia após já ter feito commit, desfazendo coisas cobre como voltar seguro.

