Conceito de Merge — Git e 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
O 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.
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).
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.