O que são conflitos de intercalação?

Concluído

Aqui, discutimos como a resolução de conflitos de mesclagem ajuda os desenvolvedores a produzir o melhor resultado a partir de duas fontes sobrepostas.

O Fluxo do GitHub

Além de fornecer uma plataforma para o desenvolvimento colaborativo de software, o GitHub também oferece um fluxo de trabalho prescrito concebido para otimizar a utilização das suas diversas funcionalidades. Embora esta unidade cubra especificamente conflitos de mesclagem, recomendamos que você primeiro revise Entendendo o fluxo do GitHub.

Intercalar ramos

Considere um cenário em que um programador cria um ramo chamado feature-branch com base em main e cria duas consolidações. À medida que isto acontece, alguém intercala um pedido Pull não relacionado em main. O que acontece quando o nosso programador tenta intercalar feature-branch em main?

A resposta é: depende.

Embora feature-branch tenha sido criado a partir do main, não foi baseado no ramo em si. Pelo contrário, baseou-se na consolidação HEAD de main na altura. Não tem conhecimento de todos os compromissos que foram aplicados desde main então. Os commits que ele rastreia atualmente não necessariamente serão dobrados para o estado atual da ramificação sem substituir as alterações recentes.

Se se verificar que os feature-branch commits não se sobrepõem aos commits paralelos feitos desde main que o ramo foi criado, então não há problemas. Podem ser adicionados novos ficheiros. Os ficheiros sem alterações podem ser eliminados. As linhas de código que foram alteradas em main podem ser alteradas em feature-branch desde que o trabalho paralelo não as tenha alterado desde que feature-branch foi criado.

Uma solicitação pull sem conflitos de mesclagem.

E se ambos os conjuntos de consolidações incluírem alterações nas mesmas linhas de código? Esta tentativa de intercalação falharia devido a um conflito de intercalação.

Um conflito de fusão.

O que são conflitos de intercalação?

Os conflitos de intercalação são gerados quando um programador tenta intercalar alterações que inadvertidamente iriam substituir alterações paralelas. Não importa como as outras alterações foram intercaladas no ramo base. O Git não substitui automaticamente um conjunto de alterações em favor de outro. Em vez disso, ele os aponta para a pessoa que está tentando mesclar para que eles possam resolvê-los em sua ramificação de comparação antes de tentar mesclar novamente.

Uma solicitação pull com conflitos de mesclagem.

Resolver conflitos de intercalação

Para ajudá-lo a resolver conflitos de mesclagem, o GitHub gera um arquivo híbrido temporário que inclui as diferenças de cada ramificação. A convenção é que o texto do ramo de comparação é apresentado acima do ramo base, separado por uma linha de sinais de igual (=======).

Resolução de um conflito de fusão.

Pode utilizar esta vista para editar diretamente o ficheiro se as alterações forem pequenas. Se você decidir mantê-lo, o resultado final é comprometido com o ramo de comparação. Como alternativa, se a mesclagem estiver mais envolvida, você pode preferir trabalhar nela usando outras ferramentas de desenvolvimento. De qualquer forma, não se esqueça de remover quaisquer marcadores de ramo do seu código antes de consolidar. Se você esquecer de remover esses marcadores quando confirmar a resolução de conflitos, eles permanecerão no arquivo e não serão comentados.

Nota

Esta unidade debate a resolução de conflitos de intercalação no contexto de um browser. Existem também muitas plataformas de desenvolvimento, como o Visual Studio, que oferecem experiências integradas de resolução de conflitos de intercalação.

Depois que todos os conflitos de mesclagem forem resolvidos em sua ramificação, você poderá tentar novamente a mesclagem.

Evitar conflitos de intercalação

Certos conflitos de intercalação são inevitáveis. Qualquer intercalação pode produzir conflitos de intercalação para outros pedidos Pull à espera de serem aprovados. No entanto, uma forma eficaz de reduzir a complexidade dos conflitos de intercalação é solicitar o seu ramo com frequência.

Solicitar com antecedência e frequência

O git pull comando puxa para baixo qualquer confirmação de ramificação base que ainda não tenha sido aplicada à sua ramificação atual. É conceitualmente semelhante ao comando Get Latest que muitos sistemas de controle de versão usam para permitir que você atualize seu código local para a versão mais recente. Quando você extrai atualizações para sua ramificação, está mesclando todas as alterações que ocorreram desde que a ramificação foi criada (ou puxada pela última vez).

Puxar atualizações para sua ramificação pode resultar em conflitos de mesclagem, mas tudo bem. Você os obteria mais tarde de qualquer maneira, e ao obtê-los mais cedo, eles geralmente são mais fáceis de abordar.

Além de mitigar o impacto dos conflitos de intercalação, solicitar atualizações também permite integrar alterações consolidadas no seu ramo à medida que trabalha. Desta forma pode evitar potenciais problemas mais cedo. Por exemplo, pode haver alterações de definição de classe em outros arquivos que fazem com que seu código não seja mais compilado. Essa alteração não causaria um conflito de mesclagem quando você mesclasse mais tarde, mas quebraria a compilação se você não a testasse primeiro. A melhor prática é solicitar atualizações muitas vezes para manter o ramo o mais próximo possível da base.

Organizar o histórico com o Git rebase

O comando git rebase (ou git pull --rebase) reescreve o histórico do ramo para utilizar a consolidação HEAD atual do ramo base como a sua base. Em outras palavras, sua ramificação é atualizada para se comportar como se fosse apenas ramificada a partir do estado atual da ramificação base. Essa rebase significa que todas as suas alterações são comparadas com o estado mais recente da ramificação base, e não com a confirmação original da qual você ramificou originalmente. A redefinição de base pode tornar o histórico mais fácil de rastrear após sua eventual mesclagem, porque suas confirmações seguirão as confirmações paralelas anteriores de forma linear. A melhor prática é modificar os dados do seu ramo imediatamente antes de efetuar a intercalação de origem.

Saiba mais sobre o Git rebase e resolver conflitos de intercalação após um Git rebase.