Git Tutorial - Fusão de filiais

  1. Fast Forward git merge
  2. Merge recursivo git merge
  3. Resolver Conflitos

Aprenderemos a fundir ramos e também a lidar com conflitos, caso exista, neste tutorial.

No último tutorial, o que fizemos é que criamos um novo ramo para trabalhar em algumas novas funcionalidades que não queremos estragar o ramo master.

Depois de fazermos esses novos branches e ficarmos felizes com as novas funcionalidades, precisamos fundi-lo de volta no branch master. Para que quando publicarmos o próximo código de lançamento, a nova funcionalidade também seja incluída.

Fast Forward git merge

Digamos que estamos felizes com as mudanças no ramo new_test_branch e vamos fundi-lo de volta para o master.

  • Confira o ramo master
    $ git checkout master
    
  • Fundir o ramo ao master
    $ git merge new_test_branch
    Updating 5fef94e..e7a7e81
    	Fast-forward
    	test3.txt | 3 ++-
    	1 file changed, 2 insertions(+), 1 deletion(-)
    

Nós pegamos a característica do ramo new_test_branch e a fundimos neste ramo master.

O Fast-forward mostrado na mensagem após a fusão significa que o git faz o fastforward até as mudanças de código que fizemos no branch porque no tempo entre a ramificação e a fusão de volta ao master, nós não fizemos nenhuma mudança no branch master.

Merge recursivo git merge

Antes de demonstrarmos esta diferente git merge, precisamos criar dois ramos test_branch_A e test_branch_B e fazer diferentes alterações neles. Então fundiremos o ramo test_branch_A de volta para o ramo master.

Agora vamos fundir o ramo test_branch_B com o master.

$ git merge test_branch_B
Merge made by the 'recursive' strategy.
 test1_rename.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

A diferença entre esta fusão e a fusão fast-forward é que a fusão é feita pela estratégia recursiva porque este código do ramo não tem a funcionalidade test_branch_A nele. Em outras palavras, o ramo master mudou depois que o ramo test_branch_B foi criado.

Agora o master está atualizado com essas duas funcionalidades, e não importa que tenhamos trabalhado nelas ao mesmo tempo, pessoas diferentes fazendo-as com as duas apenas fundindo-as de volta e tudo está bem.

Resolver Conflitos

O que nós modificamos em dois ramos de teste não tem nenhum conflito, mas e se houver conflitos quando você fundir alguns ramos para o master?

Vamos criar dois ramos test_branch_C e test_branch_D, depois anexar texto A letra deve ser C ao arquivo test3.txt no ramo test_branch_C e anexar texto A letra deve ser D ao arquivo test3.txt no ramo test_branch_D.

Então fundimos o arquivo test_branch_C de volta no ramo master.

Agora, vamos fundir o arquivo test_branch_D no ramo master,

$ git merge test_branch_D
Auto-merging test3.txt
CONFLICT (content): Merge conflict in test3.txt
Automatic merge failed; fix conflicts and then commit the result.

Você poderia ver aqui que ele não poderia ser fundido com sucesso porque detecta o conflito no arquivo test3.txt. Precisamos resolver manualmente o conflito editando o arquivo conflitante.

O arquivo test3.txt mostra o conflito como

<<<<<<< HEAD
The letter should be C
=======
The letter should be D
>>>>>>> test_branch_D

O texto entre HEAD e ======= é o texto no ramo master que vem do ramo fundido test_branch_C, que difere do texto no ramo a ser fundido test_branch_D.

Você precisa escolher qual texto deve ser mantido no master, e deletar todos os símbolos como <<<<< e >>>>>>.

Digamos que o texto anexado deve ser A letra deve ser D. Atualizamos a área conflitante para ser The letter should be D.

Após resolvermos o conflito, podemos cometer o conflito resolvido utilizando git commit.