- O que é um Conflito de Mesclagem no Git?
- Tipos de Mesclagem
- Tipos de Conflitos de Mesclagem no Git
- Comandos para Resolver Conflitos de Mesclagem no Git
- Ferramentas Visuais de Mesclagem
- Como Resolver um Conflito de Mesclagem no Git
- Conclusão
O que é um Conflito de Mesclagem no Git?
O sistema de controle de versão Git é todo sobre trabalhar em equipe e contribuir para projetos. Os desenvolvedores geralmente trabalham em branches isoladas, e quando terminam, mesclam as alterações com a branch principal. Este tipo de trabalho em equipe é altamente produtivo e eficaz para encontrar bugs. Às vezes, vários desenvolvedores estão trabalhando na mesma linha de código, e quando tentam mesclar as alterações, surgem conflitos.
Exemplo Simples de Conflito no Git
O diagrama acima fornece um exemplo perfeito de como ocorre um conflito de mesclagem típico no Git. A ramificação principal contém um arquivo com o texto “HELLO, WORLD!”. O usuário abid faz uma branch do main, e muda o texto para “HELLO, CAT!”. Enquanto abid estava fazendo as mudanças, a branch original do main também foi modificada para “HELLO, DOG!”. Mesclar essas branches fará com que apareça um problema de mesclagem e interromperá o processo.
O comando `git merge` principalmente é usado para combinar duas branches e resolver automaticamente os conflitos. No entanto, às vezes os conflitos aparecem quando duas pessoas mudam a mesma linha de código ou removeram arquivos críticos que outro desenvolvedor estava trabalhando. O Git marcará essas mudanças e interromperá o processo de mesclagem. Neste caso, o conflito não foi resolvido automaticamente; antes, o desenvolvedor tem que fazer as mudanças manualmente ou usar ferramentas para resolver o conflito.
Tipos de Mesclagem
A mesclagem do Git e o reabastecimento do Git são duas formas de integrar commit da branch de destino para a branch de origem. Além disso, a mesclagem do Git executa uma mesclagem de avançar ou não avançar. Se a head da branch de destino existe na branch de origem, então por padrão, o tipo de mesclagem será uma mesclagem de avançar e se estiver faltando, então será uma mesclagem de não avançar. O reabastecimento do Git é outro tipo de mesclagem que resequencia a história de commit da branch de destino.
Mesclagem de Avançar
Por padrão, o Git merge utiliza o fast-forward para integrar commits ausentes na branch de destino. Por exemplo, ele é usado para atualizar a branch local a partir de um servidor remoto usando o comando pull. O fast-forward não levanta problemas de conflito de merge, pois o Git não o aplicará se a cabeça da branch de destino estiver ausente na branch de origem.
Merge sem Fast-forward
Um merge sem fast-forward também é chamado de merge de três vias ou verdadeiro merge. Ele cria um novo commit em uma branch de destino integrando as mudanças tanto na branch de origem quanto na de destino. As mudanças são misturadas após o último commit comum em ambas as branches. No nosso caso, isso é após o C. Este tipo de merge irá solicitar conflitos de merge do Git se a branch de origem estiver em disputa com a branch de destino. No diagrama acima, o commit de merge (X) é criado integrando a branch de origem e a de destino, onde K e E são os pais do commit de merge.
Rebase
O Git rebase é um pouco diferente dos outros tipos. Ele altera a sequência do histórico de commit da branch de destino. O rebase integra a branch de origem de tal forma que a branch de destino contém todas as mudanças da branch de origem, seguidas por todos os commits da branch de destino após o último commit comum. No nosso caso, o último commit comum é o C, enquanto D e E são da branch de origem. O commit K* é o mesmo que K com um id de commit diferente. Em vez de ligar C, ele ligará E. Semelhante a um merge sem fast-forward, se houver problemas de compatibilidade na branch de origem e a de destino, o Git levantará um problema para resolver o conflito antes de finalizar o rebase.
Tipos de Conflitos de Merge no Git
Há dois tipos de conflitos de mesclagem no Git: no início e durante o processo de mesclagem – Atlassian. Nessa seção, vamos aprender sobre ambos os tipos e as formas de resolver cada cenário.
No Início da Mesclagem
A mesclagem do Git falhará no início se houver alterações no diretório de trabalho ou na área de preparo. Ela falha no início para evitar que as alterações sejam sobrescritas por commit de mesclagem vindos. Isso ocorre devido a conflitos com alterações locais, não com outras branchs ou desenvolvedores. Para estabilizar o estado local, você pode usar comandos como git stash
, git commit
, git checkout
, ou git reset
.
Durante a Mesclagem
Um falha durante a mesclagem significa que há um conflito entre a branch de origem e a branch de destino onde vários desenvolvedores modificaram o mesmo arquivo. Se a mesclagem automática falhar, o Git pedirá que você resolva os problemas manualmente. Você também pode usar ferramentas terceirizadas para o auxiliar a visualizar e integrar as mudanças.
Comandos para Resolver Conflitos de Mesclagem do Git
Nessa seção, vamos aprender sobre vários comandos nativos para visualizar e resolver conflitos de mesclagem do Git.
Comandos Comuns
O comando Git status é o mais frequentemente usado para exibir o status de arquivos modificados, área de preparo e commits. Durante o processo de mesclagem, ele é usado para identificar arquivos conflitantes.
git status
O registro do Git com argumentos –merge produz a lista de commits que estão em conflito com a ramificação de origem.
git log --merge
Por padrão, a opção git diff
mostrará a diferença entre as alterações não commitadas e os commits anteriores. O Git diff é usado para comparar ramificações, commits e arquivos. É útil para prevenir futuros conflitos de mesclagem.
git diff
Comandos para Falhas de Mesclagem no Início
O checkout é usado para desfazer alterações ou mudar para uma nova ou antiga ramificação.
git checkout
O Git reset é para reverter as alterações no diretório de trabalho e na área de preparação.
git reset --mixed
Comandos para Conflitos Durante a Mesclagem
O argumento –abort interromperá o processo de mesclagem e reverterá as alterações para seu estado original antes do início da mesclagem.
git merge --abort
O Git reset geralmente é usado durante o processo de mesclagem para reverter os arquivos em conflito para seu estado original.
git reset
Resolver Conflitos de Arquivo Deletado-Modificado
Um conflito no Git ocorrerá se você deletou o arquivo na ramificação atual e outra pessoa modificou ele em outra ramificação. Neste caso, você pode adicionar um arquivo e commitar,
git add <filename>
ou você pode remover o arquivo e commitar.
git rm <filename>
Ferramentas de Mesclagem Visual
Ferramentas de mesclagem são ferramentas visuais amigáveis para identificar e resolver todos os tipos de conflitos de mesclagem. Algumas das ferramentas suportam capacidades adicionais, como comparar alterações, operações do Git e gerenciamento de projeto e repositório. Existem dois tipos de ferramentas de mesclagem do Git: somente terminal e baseado em GUI. As ferramentas baseadas no terminal abrem no PowerShell ou no Bash, e as ferramentas baseadas em GUI abrem em um ambiente de janelas.
Para verificar a lista de ferramentas instaladas e válidas, use:
git mergetool --tool-help
A lista consiste em todas as ferramentas válidas que podem ser instaladas e integradas com comandos do git.
Por exemplo, temos o vim e o nvim instalados por padrão, e se você quiser ver a diferença entre um arquivo não submetido e um commit anterior, digite:
git difftool --tool=vimdiff3
A ferramenta vimdiff3 destaca as alterações e permite que você compare commits dentro do terminal.
Diferença Entre Duas Versões do Mesmo Arquivo no Vimdiff3
Meld
Meld é uma ferramenta livre e de código aberto que leva a resolução de conflitos de mesclagem a outro nível. Para integrá-la com o Git, você precisa primeiro baixar e instalar a configuração do site oficial. Em seguida, adicione-a à configuração global para que, por padrão, o Git iniciará o Meld para resolver conflitos.
Os comandos de configuração abaixo são aplicáveis apenas a usuários do Windows. A única alteração que você precisa fazer é alterar o caminho do arquivo instalado do Meld para Mac ou Linux.
git config --global merge.tool meld git config --global mergetool.meld.path "C:/Program Files (x86)/Meld/Meld.exe" git config --global diff.tool meld git config --global difftool.meld.path "C:/Program Files (x86)/Meld/Meld.exe"
Após definir os padrões, você pode digitar git difftool
dentro do diretório local do Git para lançar a versão Windows do Meld, ou pode usar git mergetool
para resolver conflitos de mesclagem como mostrado abaixo.
Resolvendo um Conflito de Mesclagem com Meld
VSCode
VSCode fornece a forma mais popular e melhor para resolver o conflito de mesclagem. Quando o Git não consegue mesclar arquivos automaticamente, o VSCode irá realçar o código em conflito e oferecerá quatro opções: aceitar alterações atuais, aceitar alterações vindas, aceitar ambas as alterações e comparar alterações. Você pode usar essas opções para limpar seu arquivo e resolver todos os problemas pendentes.
Resolvendo Conflito de Mesclagem com VSCode
Se você está procurando uma solução completa para suas operações no Git, experimente o GitKraken. Ele vem com um cliente grátis, extensão do VSCode e fornece uma ferramenta embutida para resolver conflitos de mesclagem.
Como Resolver um Conflito de Mesclagem no Git
Nesta seção, vamos aprender a criar um conflito de mesclagem Git e depois resolvê-lo. O tutorial é dividido em duas partes. Na primeira parte, vamos aprender a resolver conflitos Git localmente; a segunda parte é sobre resolver conflitos com um servidor remoto (GitHub).
Conflito de Mesclagem Local
Criar conflitos de mesclagem nos ajudará a entender como esses problemas surgem no início. Podemos então usar maneiras criativas para resolver esses problemas ou até mesmo preveni-los do futuro.
Agora, vamos criar um repositório Git com um único arquivo e criar nosso primeiro commit para começar.
- Crie uma pasta chamada datacamp.
- Mude o diretório para datacamp.
- Inicialize o Git.
- Crie um arquivo README.md com o título fornecido.
- Salve e committe as mudanças em um arquivo.
mkdir datacamp cd datacamp git init echo "# How to Resolve Git Merge Conflict" > README.md git add README.md git commit -m "first commit" >>> [main (root-commit) 8199ea2] first commit >>> 1 file changed, 1 insertion(+) >>> create mode 100644 README.md
A seguir, vamos criar uma nova branch chamada readme e alterar o título de “..Git Merge..” para “..Git..”. Adicione o arquivo e crie o commit usando o argumento -am.
git checkout -b readme echo "# How to Resolve Git Conflict" > README.md git commit -am "new branch conflict added" >>> [readme 155f694] new branch conflict added >>> 1 file changed, 1 insertion(+), 1 deletion(-)
Volte para a branch principal e adicione uma nova linha ao arquivo README.md usando >>. Salve as mudanças e crie commit, formando assim com sucesso um conflito entre duas versões do mesmo arquivo.
git checkout main echo "New change in base branch" >> README.md git commit -am " a line added to base branch Readme file" >>> [main f1f1874] a line added to base branch Readme file >>> 1 file changed, 1 insertion(+)
Como podemos ver, enquanto a mesclagem da branch readme, o Git apresentou uma mensagem dizendo que a mesclagem automática falhou e que precisamos fazer mudanças manualmente e depois commitar o resultado.
git merge readme >>> Auto-merging README.md >>> CONFLICT (content): Merge conflict in README.md >>> Automatic merge failed; fix conflicts and then commit the result.
Vamos resolver o problema manualmente abrindo e editando o arquivo no Notepad. A imagem abaixo mostra a seta com HEAD, um separador, e uma seta de direção diferente com readme. A parte HEAD mostra as mudanças existentes no branch principal, e a parte readme é o branch que queremos mesclar, que consiste em um título diferente.
Resolvendo um Conflito de Mesclagem Manualmente
Para resolver o problema, vamos remover a parte do branch readme, setas e separador. A versão final do arquivo deve parecer limpo, conforme mostrado abaixo.
Conflito Resolvido
Depois de adicionar o arquivo e criar um commit, o conflito de mesclagem será resolvido. É a maneira mais comum e simples de resolver problemas. Você também pode usar um ambiente de desenvolvimento integrado (IDE) para resolver problemas mais rápido.
git commit -am "conflict resolved in file README.md" >>> [main 9994a29] conflict resolved in file README.md
Conflito de Mesclagem Remoto
Para criar e resolver conflitos de mesclagem remotos, precisamos criar um novo repositório no GitHub.
Criando um Novo Repositório no GitHub
Em seguida, adicione o nome remoto (origin) com endereço ao repositório e envie todas as alterações de um repositório local para a branch principal remota usando upstream.
git remote add origin https://github.com/kingabzpro/DataCamp-Git-Merge-Guide.git git push --set-upstream origin main >>> Enumerating objects: 12, done. >>> Counting objects: 100% (12/12), done. >>> Delta compression using up to 4 threads >>> Compressing objects: 100% (6/6), done. >>> Writing objects: 100% (12/12), 998 bytes | 499.00 KiB/s, done. >>> Total 12 (delta 2), reused 0 (delta 0), pack-reused 0 >>> remote: Resolving deltas: 100% (2/2), done. >>> To https://github.com/kingabzpro/DataCamp-Git-Merge-Guide.git >>> * [new branch] main -> main >>> branch 'main' set up to track 'origin/main'.
Para criar um conflito, precisamos fazer alterações no arquivo README.md remoto e local. Você pode usar o editor de arquivos do GitHub para mudar “..Git merge..” para “..Sit-Merge..” e então confirmar as alterações.
Fazendo Alterações no Editor do GitHub
Depois, no repositório local, altere o arquivo README.md para adicionar apenas um título simples e confirme as alterações.
echo "# How to Resolve Merge Conflicts in Git Tutorial" > README.md git commit -am "local branch changes in README.md" >>> [main c677a13] local branch changes in README.md >>> 1 file changed, 1 insertion(+), 4 deletions(-)
Finalmente, envie as alterações para o servidor remoto. Note que o Git levantou um erro com dicas sobre como eliminar o problema.
git push >>> To https://github.com/kingabzpro/DataCamp-Git-Merge-Guide.git >>> ! [rejected] main -> main (fetch first) >>> error: failed to push some refs to 'https://github.com/kingabzpro/DataCamp-Git-Merge-Guide.git' >>> hint: Updates were rejected because the remote contains work that you do >>> hint: not have locally. This is usually caused by another repository pushing >>> hint: to the same ref. You may want to first integrate the remote changes >>> hint: (e.g., 'git pull ...') before pushing again. >>> hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Seguiremos a dica mais simples, que é puxar o arquivo do servidor remoto antes de enviar.
Puxar o arquivo falhou devido a um conflito de mesclagem no arquivo README.md. Poderíamos corrigi-lo manualmente usando o Notepad, mas desta vez usaremos uma ferramenta visual para nos ajudar nesse processo.
git pull >>> remote: Enumerating objects: 5, done. >>> remote: Counting objects: 100% (5/5), done. >>> remote: Compressing objects: 100% (2/2), done. >>> remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 >>> Unpacking objects: 100% (3/3), 681 bytes | 75.00 KiB/s, done. >>> From https://github.com/kingabzpro/DataCamp-Git-Merge-Guide >>> aaf149d..49b7d14 main -> origin/main >>> Auto-merging README.md >>> CONFLICT (content): Merge conflict in README.md >>> Automatic merge failed; fix conflicts and then commit the result.
A ferramenta de mesclagem Meld identificará os arquivos em conflito e os mostrará na aplicação GUI do Meld.
git mergetool >>> Merging: >>> README.md >>> Normal merge conflict for 'README.md': >>> {local}: modified file >>> {remote}: modified file
Existem três colunas: README_LOCAL_473.md, README.md e README_LOCAL_473.md. Se você achar que as alterações remotas são válidas, clique na seta preta na coluna remota; e se quiser que as alterações locais persistam, clique na seta preta na coluna local. É simples assim.
Conflito Resolvido Usando a Ferramenta de Mesclagem Meld
Após fazer alterações, salve o arquivo e faça o commit. Como pode ver, enviar um arquivo para um servidor remoto não gera um erro de conflito de mesclagem.
git commit -am "remote main branch conflict resolved" git push >>> Enumerating objects: 16, done. >>> Counting objects: 100% (16/16), done. >>> Delta compression using up to 4 threads >>> Compressing objects: 100% (6/6), done. >>> Writing objects: 100% (10/10), 1.08 KiB | 550.00 KiB/s, done. >>> Total 10 (delta 2), reused 0 (delta 0), pack-reused 0 >>> remote: Resolving deltas: 100% (2/2), completed with 1 local object. >>> To https://github.com/kingabzpro/DataCamp-Git-Merge-Guide.git >>> 49b7d14..8f5c3aa main -> main
Resolvemos com sucesso os conflitos de mesclagem locais e remotos. Esses conflitos são enfrentados diariamente por cientistas de dados e engenheiros de aprendizado de máquina. Para melhorar suas habilidades em operações Git, faça um curso de Introdução ao Git.
Conclusão
Resolver conflitos de mesclagem no Git é uma tarefa complexa e altamente arriscada, pois você pode quebrar o software ao mesclar código defeituoso. Ferramentas de mesclagem oferecem um ambiente amigável com uma maneira mais segura de detectar e resolver conflitos de mesclagem. Neste tutorial, aprendemos por que os conflitos do Git ocorrem e como resolvê-los. Também abordamos vários tipos de mesclagem e conflito, comandos úteis do Git e ferramentas visuais. Na seção final, criamos um conflito de mesclagem e o resolvemos em um repositório local e remoto.
Se você é novo no Git e quer aprender como ele funciona, leia: Introdução ao Tutorial de Git e GitHub.
Source:
https://www.datacamp.com/tutorial/how-to-resolve-merge-conflicts-in-git-tutorial