- O que é um Conflito de Merge no Git?
- Tipos de Merge
- Tipos de Conflitos de Merge no Git
- Comandos para Resolver Conflitos de Merge no Git
- Ferramentas Visuais de Merge
- Como Resolver um Conflito de Merge no Git
- Conclusão
O que é um Conflito de Merge 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 isolados, e quando terminam, eles mesclam as mudanças com a branch principal. Esse 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 mudanças, 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 branch principal contém um arquivo com o texto “HELLO, WORLD!”. O usuário abid divide a branch principal, e altera o texto para “HELLO, CAT!”. Enquanto abid está fazendo as mudanças, a branch original principal também é modificada para “HELLO, DOG!”. A mesclagem destas branches fará com que surja um conflito de mesclagem e interromperá o processo.
O comando `git merge` tem como principal função combinar duas branches e resolver automaticamente os conflitos. No entanto, às vezes os conflitos são expostos quando duas pessoas mudaram a mesma linha de código ou removeram arquivos críticos que outro desenvolvedor estava trabalhando. O Git marcará essas mudanças e parará o processo de mesclagem. Neste caso, o conflito não foi resolvido automaticamente; ao invés disso, 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 rebase do Git são duas formas de integrar commit da branch alvo para a branch fonte. Além disso, a mesclagem do Git executa uma mesclagem de fast-forward ou de no-fast-forward. Se a cabeça da branch alvo existir na branch fonte, então por padrão, o tipo de mesclagem será de fast-forward e se estiver faltando, então será de no-fast-forward. O rebase do Git é outro tipo de mesclagem que resequencia o histórico de commit da branch alvo.
Mesclagem de Fast-forward
Por padrão, o Git merge usa o modo fast-forward para integrar commitss faltantes 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 causa problemas de conflito de merge, pois o Git não aplicará se a cabeça da branch de destino estiver faltando na branch de origem.
No-fast-forward Merge
Um merge sem fast-forward também é chamado de merge de três caminhos ou merge verdadeiro. Ele cria um novo commit na branch de destino integrando as mudanças em ambas as branchs de origem e de destino. As mudanças são fundidas após o último commit comum em ambas as branchs. No nosso caso, é após o C. Este tipo de merge fará o Git identificar conflito de merge 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 branch 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 muda a sequência da história de commit da branch de destino. O rebase integra a branch de origem de modo que a branch de destino contenha todas as mudanças da branch de origem, seguidas de todos os commits da branch de destino após o último commit comum. No nosso caso, o último commit comum é 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 vai estar ligando E. Similar a um merge sem fast-forward, se houver problemas de compatibilidade entre a branch de origem e a branch de destino, o Git vai levantar um problema para resolver o conflito antes de finalizar o rebase.
Tipos de Conflitos de Merge no Git
Existem dois tipos de conflitos de mesclagem no Git: no início e durante o processo de mesclagem – Atlassian. nesta seção, nós vamos aprender sobre ambos os tipos e as formas de resolver cada cenário.
Ao Iniciar a Mesclagem
A mesclagem do Git falhará no início se houver mudanças no diretório de trabalho ou área de staging. Ela falha no início para evitar que as mudanças sejam sobrescritas por commit de mesclagem vindos. Isto ocorre devido a conflitos com mudanças 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
.
Ao Longo da 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 de terceiros para o auxiliar a visualizar e integrar as mudanças.
Comandos para Resolver Conflitos de Mesclagem no Git
Nesta seção, nós vamos aprender sobre vários comandos nativos para visualizar e resolver conflitos de mesclagem no Git.
Comandos Comuns
O comando Git status é o mais frequentemente usado para exibir o status de arquivos modificados, área de staging 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 serve 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 entre Arquivos Excluídos e Modificados
Um conflito no Git ocorrerá se você excluir o arquivo na ramificação atual e alguém else modificará 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 junção são ferramentas visuais amigáveis que auxiliam na identificação e resolução de todos os tipos de conflitos de junção. Algumas das ferramentas oferecem funcionalidades adicionais, como a comparação de mudanças, operações no Git e gerenciamento de projetos e repositórios. Existem dois tipos de ferramentas de junção do Git: as que funcionam apenas no terminal e as baseadas em GUI. As ferramentas de terminal abrem dentro do PowerShell ou 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, vim e nvim estão instalados por padrão, e se você quiser ver a diferença entre um arquivo não cometido e um commit anterior, digite:
git difftool --tool=vimdiff3
A ferramenta vimdiff3 destaca as mudanças e permite que você compare commits dentro do terminal.
Diferença Entre Duas Versões do Mesmo Arquivo em Vimdiff3
Meld
Meld é uma ferramenta livre e de código aberto quelevanta resolver conflitos de junção a um nível superior. Para integrá-la com o Git, você precisa primeiro baixar e instalar o setup do site oficial. Em seguida, adicione-a à configuração global para que, por padrão, o Git abra Meld para resolver conflitos.
Os comandos de configuração abaixo são válidos apenas para usuários do Windows. A única mudança que você precisa fazer é alterar o caminho do arquivo instalado de Meld para o 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 o 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 o VSCode
Se você está procurando uma solução completa para suas operações no Git, tente o GitKraken. Ele vem com um cliente grátis, uma extensão para o 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 evitá-los no futuro.
Agora vamos criar um repositório Git com um arquivo simples 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.
- Marque e committe as mudanças no 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 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, ao mesclar a branch readme, o Git exibiu uma mensagem dizendo que a mesclagem automática falhou e que precisamos fazer alterações manualmente e então committe 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 uma seta com HEAD, um separador, e uma seta em direção diferente com um readme. A parte HEAD mostra as mudanças existentes no branch principal, e a parte readme é o branch que queremos mesclar, que consiste de 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
Após adicionarmos o arquivo e criarmos 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
Aqui, adicione o nome remoto (de origem) com o endereço ao repositório e envie todas as mudanças do repositório local para a branch principal remota usando o 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 mudanças no arquivo README.md local e remoto. Você pode usar o editor de arquivos do GitHub para alterar “..Git merge..” para “..Sit-Merge..” e então comitar as mudanças.
Fazendo Mudanças no Editor do GitHub
Em seguida, no repositório local, altere o arquivo README.md para adicionar apenas um título simples e comita as mudanças.
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 mudanças para o servidor remoto. Note que o Git apresentou o 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.
Nós seguiremos a dica mais simples, que é fazer o pull do arquivo do servidor remoto antes de enviar.
O pull do arquivo falhou devido a um conflito de mesclagem no arquivo README.md. Podemos corrigi-lo manualmente usando o Notepad, mas esta vez vamos usar uma ferramenta visual para nós auxiliar neste 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á arquivos conflitantes e mostrará-los na aplicação gráfica do Meld.
git mergetool >>> Merging: >>> README.md >>> Normal merge conflict for 'README.md': >>> {local}: modified file >>> {remote}: modified file
Há três colunas: README_LOCAL_473.md, README.md e README_LOCAL_473.md. Se você acha que as mudanças remotas são válidas, clique na seta negra na coluna remota; e se quiser que as mudanças locais persistam, clique na seta negra na coluna local. É assim que é simples.
Conflito resolvido usando o mergetool Meld
Após fazer as mudanças, salve o arquivo e commit. Como podem ver, enviar um arquivo para um servidor remoto não causa 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
Nós resolução com sucesso tanto conflitos locais como remotos. Esses conflitos são lidados diariamente por cientistas de dados e engenheiros de aprendizagem automática. Para melhorar suas habilidades em operações Git, tenha um curso de Introdução a Git.
Conclusão
Resolvendo conflitos de mesclagem Git é uma tarefa complexa e altamente arriscada, pois pode quebrar o software mesclando código defeituoso. As ferramentas de mesclagem fornecem um ambiente amigável ao usuário com uma maneira mais segura para detectar e resolver conflitos de mesclagem. Neste tutorial, aprendemos porque os conflitos do Git ocorrem e como resolvê-los. Também abordamos diferentes tipos de mesclagem e conflitos, comandos úteis de Git e ferramentas visuais. Na seção final, criamos um conflito de mesclagem e resolvemos-lo em um repositório local e remoto.
Se você está novo em Git e quer saber como funciona, então leia: Introdução a Git e GitHub Tutorial.</
Source:
https://www.datacamp.com/tutorial/how-to-resolve-merge-conflicts-in-git-tutorial