Merge
É possível aplicar as mudanças de uma branch à outra, num processo chamado de
merge. Usa-se o comando git merge
. Por exemplo, suponha que estejamos em
uma branch minha-branch
, e queiramos aplicar os commits de outra-branch
em minha-branch
:
git merge outra-branch
Um merge aplica somente os commits que as branches não têm em comum.
Conflitos
Por padrão, sempre que houver um conflito em um arquivo, o Git tenta resolver mesclando as versões dos arquivos. No entanto, nem sempre é válida essa mesclagem. Nesses casos, o Git falha em resolver o conflito, e intervenção manual é requisitada.
Em cada arquivo, o que é comum entre as duas branches é mantido. Onde há o conflito, é indicado o quê pertence à branch atual, e o que pertence à outra branch. Assim:
int main()
{
<<<<<<< HEAD
vindo_da_minha_branch();
=======
vindo_da_outra_branchl();
>>>>>>> outra-branch
return 0;
}
Uma resolução de conflitos manual consiste em ir em cada um desses arquivos com
conflito, e, em cada conflito, escolher uma das versões, ou até mesmo
mesclá-las. Para descobrir-se quais arquivos precisam de interveção, basta
executar o comando git status
. Após a resolução dos conflitos, e necessário
fazer um novo commit contendo os arquivos corrigidos.
Existem, no entanto, ferramentas para auxiliar na resolução dos conflitos, como
o kdiff
.
Exemplo
Suponha o seguinte cenário, uma branch master
e uma teste
:
master teste
HEAD -> 80ba4e4 b49a7ed
| |
| 4b12d0a
| /
| /
ec49a96
|
3c97506
Suponha que queiramos aplicar as os dois commits 4b12d0a
e b49a7ed
à
branch master
. Façamos o seguinte:
git merge teste
O resultado será o seguinte:
master
HEAD -> 47d7959
| \
| \ teste
80ba4e4 b49a7ed
| |
| 4b12d0a
| /
| /
ec49a96
|
3c97506
Note que a branch teste
continuará existindo. Podemos fazer um novo commit
nela:
master teste
47d7959 0935946 <- HEAD
| \ |
| \ |
80ba4e4 b49a7ed
| |
| 4b12d0a
| /
| /
ec49a96
|
3c97506