Resolver conflitos de intercalação

Serviços de DevOps do Azure | Azure DevOps Server 2022 - Azure DevOps Server 2019

Visual Studio 2019 | Visual Studio 2022

Quando você mescla ou rebaseia, está dizendo ao Git para integrar as alterações feitas em uma ramificação com as alterações feitas em outra. Muitas vezes, o Git conclui uma mesclagem ou rebase automaticamente sem a sua ajuda. No entanto, se o Git descobrir que uma alteração feita em uma ramificação está em conflito com uma alteração feita em outra, ele solicitará que você resolva o conflito. Um conflito de mesclagem pode ocorrer quando as ramificações mescladas editam a mesma linha de arquivo de forma diferente ou quando uma ramificação modifica um arquivo e outra ramificação o exclui. O processo de resolução de conflitos de mesclagem é aplicável tanto à mesclagem quanto à rebase do Git.

Você pode resolver conflitos de mesclagem no Visual Studio ou usando a linha de comando e qualquer editor de texto.

Para obter uma visão geral do fluxo de trabalho do Git, consulte o tutorial do Azure Repos Git.

Este artigo fornece procedimentos para as seguintes tarefas:

  • Compreender os conflitos de mesclagem
  • Resolver conflitos de intercalação

Compreender os conflitos de mesclagem

A mesclagem ou rebase do Git integra confirmações de uma ramificação de origem à sua ramificação local atual (ramificação de destino). A mesclagem do Git executa uma mesclagem de avanço rápido ou de avanço rápido. A mesclagem sem avanço rápido também é conhecida como mesclagem de três vias ou mesclagem verdadeira . Git rebase é outro tipo de fusão. Esses tipos de mesclagem são mostrados no diagrama a seguir.

Diagrama mostrando as confirmações antes e depois ao usar a mesclagem do Git e a rebase do Git.

Para mesclagem Git, se a ponta da ramificação de destino existir dentro da ramificação de origem, o tipo de mesclagem padrão será uma mesclagem de avanço rápido. Caso contrário, o tipo de mesclagem padrão será uma mesclagem sem avanço rápido.

Uma mesclagem de avanço rápido nunca pode ter um conflito de mesclagem porque o Git não aplicará uma mesclagem de avanço rápido se a ponta da ramificação de destino tiver divergido da ramificação de origem. Por padrão, o Git usa uma mesclagem de avanço rápido sempre que possível. Por exemplo, o Git aplicará uma mesclagem de avanço rápido em uma ramificação local que você só atualiza extraindo de sua ramificação homóloga remota.

Uma mesclagem sem avanço rápido gera uma nova "confirmação de mesclagem" de ramificação de destino que integra as alterações de ramificação de origem com as alterações de ramificação de destino. As alterações aplicáveis são aquelas feitas após a última confirmação que é comum a ambas as ramificações. No diagrama anterior, a confirmação C é a última confirmação comum em ambas as ramificações. Se qualquer alteração de ramificação de origem entrar em conflito com qualquer alteração de ramificação de destino, o Git solicitará que você resolva o conflito de mesclagem. A confirmação de mesclagem (L) contém as alterações integradas de ramificação de origem e ramificação de destino. As dicas de ramificação de origem e destino (K e E) são os pais da confirmação de mesclagem. No histórico de confirmação da ramificação, uma confirmação de mesclagem é um marcador útil para uma operação de mesclagem e mostra claramente quais ramificações foram mescladas.

A rebase do Git resequencia o histórico de confirmações da ramificação de destino para que ela contenha todas as confirmações de ramificação de origem, seguidas por todas as confirmações de ramificação de destino desde a última confirmação comum. No diagrama anterior, a confirmação C é a última confirmação comum em ambas as ramificações. Outra maneira de visualizá-lo é que uma rebase reproduz as alterações na ramificação de destino sobre o histórico da ramificação de origem. Se qualquer alteração de ramificação de origem entrar em conflito com qualquer alteração de ramificação de destino, o Git solicitará que você resolva o conflito de mesclagem. Assim como acontece com a mesclagem rápida, uma rebase não cria uma confirmação de mesclagem. Notavelmente, uma rebase altera a sequência das confirmações de ramificação de destino existentes, o que não é o caso das outras estratégias de mesclagem. No diagrama anterior, commit K' contém as mesmas alterações que K, mas tem um novo ID de commit porque ele se vincula de volta para commit E em vez de C.

A mesclagem e a rebase do Git modificam apenas a ramificação de destino — a ramificação de origem permanece inalterada. Quando você encontrar um ou mais conflitos de mesclagem, deverá resolvê-los para concluir a mesclagem ou a rebaseação. Ou, você pode cancelar a operação de mesclagem/rebase e retornar a ramificação de destino ao seu estado anterior.

Para obter mais informações sobre opções e estratégias de mesclagem, consulte o manual de referência do Git e as estratégias de mesclagem do Git.

Quando resolver conflitos de mesclagem

A mesclagem do Git e a rebase do Git são amplamente usadas no fluxo de trabalho do Git. Ao trabalhar em um recurso local ou ramificação de correção de bugs, é prática comum:

  1. Mantenha sua filial local main atualizada com sua contraparte remota, puxando periodicamente para buscar e mesclar confirmações remotas.
  2. Integre atualizações de ramificação local main em sua ramificação de recurso local usando uma rebase ou mesclagem.
  3. Faça backup de seu trabalho na ramificação de recurso local enviando-a para a ramificação remota correspondente.
  4. Após a conclusão do recurso, crie uma solicitação pull para mesclar sua ramificação de recurso remoto na ramificação remota main .

Ao integrar frequentemente alterações remotas em seu repositório local, você pode ficar ciente do trabalho recente de outras pessoas e resolver prontamente quaisquer conflitos de mesclagem que surjam.

Resolver conflitos de intercalação

O processo de resolução de conflitos de mesclagem é aplicável tanto à mesclagem do Git quanto à rebase do Git. Embora as etapas a seguir descrevam como resolver conflitos de mesclagem durante uma mesclagem, você também pode resolver conflitos de mesclagem durante uma rebase.

Gorjeta

Se a ramificação de origem for uma ramificação de rastreamento remoto, certifique-se de que a ramificação esteja atualizada executando uma busca Git antes de uma mesclagem. Ou execute o comando pull do Git, que combina uma busca do Git com uma mesclagem do Git.

O Visual Studio 2022 fornece uma experiência de controle de versão do Git usando o menu Git, Alterações do Git e por meio de menus de contexto no Gerenciador de Soluções. O Visual Studio 2019 versão 16.8 também oferece a interface de usuário do Team Explorer Git. Para obter mais informações, consulte a guia Visual Studio 2019 - Team Explorer .

  1. No painel Ramificações da janela Repositório Git, faça checkout da ramificação de destino. Em seguida, clique com o botão direito do mouse na ramificação de origem e escolha Mesclar <ramificação> de origem na <ramificação> de destino.

    Captura de tela da opção Mesclar no menu de contexto da ramificação na janela Repositório Git do Visual Studio.

  2. O Visual Studio irá notificá-lo se o Git interrompeu a mesclagem devido a conflitos. Nesse caso, você pode resolver os conflitos ou cancelar a mesclagem e retornar ao estado de pré-mesclagem. A seção Alterações não mescladas da janela Alterações do Git lista os arquivos com conflitos de mesclagem. Para um arquivo com conflitos de mesclagem em seu conteúdo, clique duas vezes no arquivo para abri-lo no editor de mesclagem.

    Captura de tela dos arquivos com conflitos de mesclagem na janela Alterações do Git do Visual Studio.

  3. No editor de mesclagem, o painel Entrada mostra a versão do arquivo de ramificação de origem, o painel Atual mostra a versão do arquivo de ramificação de destino e o painel Resultado mostra o arquivo de mesclagem resultante. Para aplicar alterações específicas na ramificação de origem ou de destino, marque a caixa de seleção ao lado da(s) linha(s) conflitante(s) que você deseja manter. Você também pode editar diretamente o arquivo de mesclagem no painel Resultado . Escolha Aceitar mesclagem depois de resolver todos os conflitos de mesclagem no arquivo atual. Repita esta etapa para cada arquivo com conflitos de conteúdo.

    Captura de tela do editor de mesclagem no Visual Studio.

  4. Para um arquivo que foi editado em uma ramificação e excluído na outra, clique com o botão direito do mouse no arquivo e selecione qual ação de ramificação você deseja.

    Captura de tela do menu de contexto de um arquivo conflitante na janela Alterações do Git do Visual Studio.

  5. Na janela Alterações do Git, insira uma mensagem de confirmação e escolha Confirmar em estágios para concluir a mesclagem, depois de resolver todos os conflitos de mesclagem de todos os arquivos.

    Captura de tela da mensagem de confirmação e do botão Confirmar em estágios na janela Alterações do Git do Visual Studio.

Próximos passos