Da mesma forma que antes queriamos dividir nosso trabalho em diversas linhas, agora queremos juntar ou manipular essas linhas com suas diversas modificações.
Para isso, temos dois comandos principais: o git merge
e o git rebase
.
O Git é muito bom para automaticamente saber como juntar as modificações, mas, em alguns casos em que ele não consegue resolver isso sozinho, são gerados conflitos que devem ser resolvidos manualmente.
o-o-o
/ \
o-o-o-o-o-o-o-o-o (main)
Imagine o caso em que dois editores estão revisando um arquivo de texto em seções diferentes: um está editando o cabeçalho e outro o rodapé. Cada um deles passou horas editando sua parte e agora temos que juntar essas modificações.
Para isso, o Git nos dá a opção de fundir duas ou mais linhas de trabalho em uma só.
Isso é um merge e normalmente o executamos sobre dois branchs diferentes.
No nosso exemplo, executaríamos algo como:
git merge principal cabecalho
git merge principal rodape
E teríamos no final um único arquivo contendo todas as modificações.
Imagine o caso em que um desenvolvedor criou uma nova função para um sistema, mas devido a certas urgências o branch dessa nova funcionalidade ficou abandonado por meses. Então um gestor resolveu que era a hora de juntar aquela função, mas antes disso era preciso terminar o desenvolvimento dela.
Em vez de continuar desenvolvendo em um ambiente que não reflete mais a situação do sistema, o desenvolvedor corta o seu galho da árvore e o recoloca no ponto mais atual do projeto.
Árvore do Git após desenvolvimento de nova funcionalidade
o-o-o-o (nova_funcionalidade)
/
o-o-o-o-o-o (main)
Árvore do Git após mais desenvolvimento no ramo principal
o-o-o-o (nova_funcionalidade)
/
o-o-o-o-o-o-o-o-o (main)
Árvore do Git após rebase
o-o-o-o (nova_funcionalidade)
/
o-o-o-o-o-o-o-o-o (main)
O Git merge junta duas ou mais linhas de trabalho e suas modificações em um único ponto.
O Git rebase modifica o histórico dos commits, modificando qual o commit inicial daquela linha de trabalho.
Um conflito é criado quando o Git não sabe juntar as modificações de forma apropriada. Dessa forma, ele cria certos separados nos arquivos de texto para que manualmente seja resolvido como os arquivos devem ficar.
<<<<<<< HEAD
# Tarefa 1 do curso
=======
# Exercício 1 do curso Git
>>>>>>> dev
Escreva um texto abaixo do título como desejar
Editção do corpo do texto
Para resolver o conflito, basta editar os arquivos da forma que deseja que fiquem, adicioná-los ao stage e continuar o comando que estava sendo executado.
# Exercício 1 do curso Git
Escreva um texto abaixo do título como desejar
Editção do corpo do texto
Faça você mesmo:
git checkout master
git merge dev
git log