Início/

Conceito de Merge

  • 24/09/2022
  • 4 min
  • Git

    Github

Após conhecermos a tão famosa Branch que tem como propósito dividir a linha original do desenvolvimento do projeto, precisamos "trazer" de volta para a branch main/master, dei uma breve explicação de como fazer isso em Conceito de branch, porém chegou a hora de se aprofundar no merge e resolver os possíveis conflitos que irão aparecer(uma hora ou outra).

Merge

merge(mesclagem) é o jeito do Git de pegar duas branchs e unificar em apenas um histórico. O comando git merge permite que você pegue as linhas de desenvolvimento independentes criadas pelo git branch e junta elas em apenas uma ramificação.

É de extrema importância ter algo bem claro na hora de realizar um merge, sempre a branch que você está (HEAD) vai ser a que vai "receber" a branch, sendo atualizado para refletir a mesclagem, a branch alvo não sofre nenhum tipo de alteração.

git merge é usado sempre depois do git checkout para selecionar o branch atual que irá receber e com o git branch -d para excluir o branch alvo obsoleto.

Merge na prática

Vamos utilizar um exemplo prático, digamos que você desenvolveu um Header bem básico representado pela branch feat/header (Nomenclatura tirada do Git Flow, explicarei futuramente).

Depois de ter criado uma branch com git checkcout -b feat/header (Lembrando que a flag -b do checkout cria uma branch e já move para ela), realizamos as criações necessárias e commitamos o arquivo index.html com git commit -am "feat: header"(Lembrando que a flag -am adiciona os arquivos e já realiza o commit).

Agora o que precisamos fazer para juntar essa nova feature na branch principal, precisamos ir para a branch receptora, sempre atento para onde o HEAD está apontado, e realizamos o merge. Uma vez que a branch ficou obsoleta podemos excluir ela.

Resolvendo Conflitos

Durante o processo de criação e branchs e a junção com o merge, é possível que mais de um desenvolvedor edite a mesma linha de código, com isso o Git gera um conflito, por ter dois commits o Git não sabe qual utilizar, e não consegue resolver esse problema sozinho, é necessário que o usuário decida qual é o correto.

Digamos que você ficou responsável por editar um link do header e um colega recebeu uma task para alterar a logo do footer, porém acabou adicionando alguns caracteres sem querer no link que você está alterando.

Primeiro você cria uma nova branch de correção e realiza a alteração, cria um commit e mescla com a branch master, durante esse processo um colega adicionou o caractere acidental e realizou um commit na master.

Nossa alteração:

Acidente:

Você finalizou todas as alterações e da um git checkout master que será a branch receptora, e realiza o git merge fix/header, e acaba vendo um output no terminal CONFLICT, e repara que algo mudou no editor de texto (Visual Studio Code).

Terminal:

Visual Studio Code:

Reparamos que ele adicionou alguns caracteres:
<<<<<<< Branch receptora (HEAD)
>>>>>>> Branch de mesclagem (fix/header)
======= Separa as branchs, o de cima represente a branch recepctora e de baixo a de mesclagem.

E podemos ver que existe um menu (clicavel) acima do conflito, nele existe algumas opções rápidas que podemos realizar, as mais importantes são:

Accept Current Change: Irá aceitar a branch receptora, nesse caso ele iria manter os caracteres acidentais.
Accept Incoming Change: Irá aceitar a alteração realizada no header, nesse caso seria "Conheça nossa empresa"
Accpet Both Changes: Ele aceita as duas modificações, criando então duas linhas, uma com os caracteres e outra com as alterações.

No nosso caso queremos aceitar apenas o Accept Incoming Change para manter as alterações que realizamos na branch fix/header, podemos ver que nada muda, por que os arquivos conflitantes agora estão como "Unmerged patch", precisamos adicionar ele no próximo commit git add . e criar um commit de resolução git commit -m "resolve conflitos no header".

E pronto temos o nosso conflito mais comum de acontecer resolvido e já podemos excluir a branch obsoleta das modificações.