[GIT] Merge Conflicts - Aula 13
Uma das grandes vantagens do Git é a capacidade de lidar com conflitos. Quando chega o momento de realizar o merge do seu trabalho com o de um companheiro, podem ocorrer conflitos. Veremos, então, como lidar com esse tipo de situação.
Conflito
Um conflito ocorre quando o mesmo código foi alterado duas vezes (geralmente em Branchs diferentes), entrando em contradição, ao realizar o Merge o Git não saberá qual código deve manter e qual deve alterar (é possível manter os dois), por isso ele irá pedir ao usuário que manualmente informe o que permanece.
Ao tentar realizar o Merge, e o Git informa-lo que há um conflito, use:
git status
Os arquivos listados como "Unmerged Paths" são os que contêm conflitos.
Ao abrir o arquivo conflituoso, podemos observar que o Git inseriu marcações para mostrar as diferenças entre as duas versões. O conteúdo será algo como:
<<<<<<< HEAD
Esta é a alteração na Branch atual.
=======
Esta é a alteração na Branch que você está tentando mesclar.
>>>>>>> feature-Branch
-
<<<<<<< HEAD
: Mostra a versão da Branch atual. -
=======
: Separa as duas versões conflitantes. -
>>>>>>> feature-branch
: Mostra a versão da Branch que está sendo mesclado.
Obs: Precisamos apagar manualmente os marcadores
Após realizadas as correções, é necessário mandar os arquivos para Staging Area (git add), e fazer um novo Commit.
Abort
Se os conflitos são muitos ou complexos e você prefere lidar com eles depois, basta cancelar completamente essa situação de Merge:
git merge --abort
Esse comando irá desfazer tudo e retornar ao estado inicial, sem nenhum impacto no código.
Rerere
O rerere.enable
(REuse REcorded REsolution) é uma configuração que permite que o Git lembre como você resolveu conflitos no passado e reutilize essas resoluções automaticamente, caso os mesmos conflitos ocorram novamente.
Mesmo Conflito
-
O conflito deve ocorrer no mesmo arquivo.
-
O conflito precisa acontecer na mesma linha ou bloco de código.
-
O conteúdo do código que causou o conflito precisa ser idêntico.
Ativar
Para ativar o recurso, basta:
git config --global rerere.enabled true
Isso habilita o rerere
em todos os seus repositórios.
Diretório de armazenamento
Quando o rerere
está ativado, o Git salva as informações de resolução no diretório oculto .git/rr-cache
dentro do repositório.
Obs: Essas informações ficam armazenadas localmente e não são compartilhadas com outros colaboradores.
Ours e Theirs
Em Git, Ours e Theirs são usados para se referir às versões de código de duas Branchs quando ocorre um conflito.
Ours: Refere-se à versão do código na Branch atual (a Branch onde você estava antes de iniciar o Merge ou Rebase).
Theirs: Refere-se à versão do código na Branch que você está tentando mesclar.
Uso prático
Temos o seguinte conflito:
<<<<<<< HEAD
print("Nosso") # Ours (main)
=======
print("Deles") # Theirs (feature)
>>>>>>> feature
Manter a versão da Branch atual (Ours):
git checkout --ours arquivo
Isso sobrescreve o arquivo com a versão da Branch atual.
Manter a versão da Branch mesclado (Theirs):
git checkout --theirs arquivo
Isso sobrescreve o arquivo com a versão da Branch que está sendo mesclada.
Feito isso é necessário refazer o Commit:
git add .
git commit -m "mensagem"