Executando verificação de segurança...
2

[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"
Carregando publicação patrocinada...