Git Tutorial - Fusão de filiais
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
.
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook