Lidando com Conflitos
Conflito
Um conflito no Git ocorre quando ele não consegue mesclar automaticamente as alterações feitas em dois branches diferentes. Isso acontece quando ambos modificam a mesma parte do código e o Git não sabe qual alteração deve ser mantida.
Conflitos são comuns quando várias pessoas colaboram em um projeto. Por exemplo:
Duas pessoas editam as mesmas linhas de um arquivo.
Alguém exclui um arquivo enquanto outra pessoa faz alterações nele.
Arquivos são movidos ou renomeados em diferentes branches.
O Git precisa da sua intervenção para resolver essas situações e decidir qual versão do código será mantida.
Situações em que um conflito pode ocorrer:
Alterações no mesmo trecho do código: Quando o mesmo trecho de um arquivo é alterado em ambos os branches.
Alterações conflitantes: Quando um arquivo foi removido em um branch e modificado no outro.
Mudanças na estrutura de diretórios: Quando há conflitos na estrutura de diretórios, como arquivos movidos ou renomeados em ambos os branches.
Situações em que o Git consegue resolver sozinho:
Alterações em arquivos diferentes: Quando as mudanças são feitas em arquivos diferentes, o Git pode mesclar automaticamente.
Alterações em partes diferentes do mesmo arquivo: Quando as alterações acontecem em áreas separadas de um arquivo, o Git pode combinar automaticamente.
Arquivos adicionados em apenas um branch: Se um arquivo foi adicionado em um branch, mas não existe no outro, o Git pode integrá-lo automaticamente.
Por que o Git não Consegue Resolver o Conflito Sozinho?
O Git não pode decidir qual versão do código é a correta porque ele não entende a intenção e o contexto por trás das mudanças. Imagine um exemplo em que duas pessoas editaram a primeira linha de um mesmo arquivo:
Alice alterou um texto para "Boas vindas ao nosso sistema!"
Bob alterou o mesmo texto para "Olá! Esperamos que goste do nosso produto."
O Git não pode simplesmente escolher uma versão sem interferência humana, porque não sabe qual das mensagens é mais apropriada. Essa decisão precisa ser feita por uma pessoa, analisando o contexto.
O Processo de Merge
Quando você executa o comando git merge, o Git tenta combinar as alterações de dois branches. O processo de mesclagem pode resultar em três tipos de cenário:
O Git não consegue iniciar o merge: Caso haja mudanças no diretório de trabalho ou na área de staging do projeto atual, o merge não é iniciado.
O merge ocorre sem conflitos: O Git consegue combinar todas as mudanças automaticamente.
O merge é interrompido por presença de conflito(s): O Git não consegue resolver automaticamente uma ou mais diferenças entre os branches e precisa da sua intervenção para resolver o conflito.
A seguir, vamos detalhar cada um desses casos.
O Git não Consegue Iniciar o Merge
A inicialização do merge pode falhar se existirem mudanças no diretório de trabalho ou na área de staging do projeto atual.
O Git não pode iniciar o merge, pois essas mudanças pendentes podem ser gravadas pelos commits que estão passando pelo processo de merge. Quando esse tipo de erro acontece, é por causa de conflitos com mudanças locais pendentes, não conflitos com outros desenvolvedores. A falha da inicialização do merge vai fazer com que a mensagem de erro a seguir seja exibida:
Você precisará comitar ou descartar as suas mudanças locais para ter sucesso ao executar o merge novamente.
Merge sem Conflito
Este é o caso descrito na seção anterior. Quando não há conflito, o Git consegue realizar o merge automaticamente e já cria um commit para você. Esse commit de merge é criado automaticamente, sem a necessidade de intervenção manual. A mensagem exibida será algo assim:
Isso indica que o Git realizou um merge, onde as mudanças foram integradas sem conflitos. Ao inspecionar o log de commits, você conseguirá ver o novo commit realizado:
Ao verificar o histórico de commits, você verá o merge registrado.
Merge com Conflito
Quando um ou mais conflitos ocorrem durante o merge, o Git não pode decidir automaticamente qual versão do código deve ser mantida e marca o(s) conflito(s) para que você resolva manualmente.
O Git interrompe o processo de merge e solicita que você edite os arquivos conflitantes. Você verá uma mensagem como essa:
Essa mensagem indica que o merge automático falhou pois ocorreram conflitos nos arquivos arquivo1.txt
e arquivo2.txt
.
Diante deste cenário, você possui duas opção de como prosseguir:
Cancelamento do merge: Se você decidir que não deseja continuar o merge, é possível abortá-lo.
Resolução dos conflitos: explicar
Cancelamento do Merge
Se você deseja cancelar o merge completamente e voltar ao estado anterior, use o comando:
Esse comando desfaz todas as mudanças feitas durante o merge e retorna o repositório ao estado anterior à tentativa de mesclagem.
Resolução dos Conflitos
O outro cenário possível é quando você deseja seguir em frente com o merge e irá resolver os conflitos manualmente.
Ao executar git status você poderá consultar novamente quais os arquivos que possuem conflitos.
*colocar um exeplo de git status aqui
Após identificar os arquivos com conflitos, você deve abri-los no seu editor de texto. O Git terá adicionado marcadores especiais para apontar as partes conflitantes do código, desta forma:
O trecho entre
<<<<<<< HEAD
e=======
representa o código do seu branch atual.O trecho entre
=======
e>>>>>>> nome-do-branch
mostra o código do branch que você está tentando mesclar.
Você precisa editar cada arquivo manualmente para escolher qual parte do código manter ou, se necessário, combinar as duas versões.
Após editar o arquivo, remova os marcadores (<<<<<<<
, =======
, >>>>>>>
) e salve as mudanças.
Ao resolver o conflito, use o comando git add para informar ao Git que o conflito foi resolvido em cada um dos arquivos:
Ao resolver todos os conflitos, você pode finalizar a mesclagem realizando o commit de merge:
Este commit irá incluir todas as mudanças do merge—tanto as resolvidas manualmente quanto as mescladas automaticamente.
Esta é uma explicação simplificada para fins didáticos. Para explorar todas as possibilidades em como lidar com conflitos durante o comando git
merge
, consulte a documentação oficial.
Last updated
Was this helpful?