O que são conflitos de mesclagem?
Aqui, discutimos como a resolução de conflitos de mesclagem ajuda os desenvolvedores a produzirem o melhor resultado partindo de duas fontes sobrepostas.
O fluxo do GitHub
Além de fornecer uma plataforma para o desenvolvimento de software colaborativo, o GitHub também oferece um fluxo de trabalho prescrito projetado para otimizar o uso de diversos recursos. Embora esta unidade trate especificamente dos conflitos de mesclagem, é recomendável que primeiro você examine as Noções básicas sobre o fluxo do GitHub.
Mesclando branches
Considere um cenário em que um desenvolvedor cria um branch chamado feature-branch
com base em main
e cria duas confirmações. Enquanto esse trabalho está acontecendo, outra pessoa mescla uma solicitação de pull não relacionada em main
. O que acontece quando nosso desenvolvedor tenta mesclar feature-branch
de volta em main
?
A resposta: depende.
Embora feature-branch
tenha sido criado com base em main
, ele não era baseado no próprio branch. Em vez disso, ele era baseado na confirmação HEAD de main
no momento. Ele não está ciente de todos os commits aplicados a main
desde então. Os commits que ele está acompanhando no momento não se dobrarão necessariamente no estado atual do branch sem substituir as alterações recentes.
Se os commits feature-branch
não se sobrepuserem aos commits paralelos feitas em main
desde que o branch foi criado, não haverá problemas. Novos arquivos podem ser adicionados. Arquivos inalterados podem ser excluídos. 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.
Mas e se os dois conjuntos de confirmações incluírem alterações nas mesmas linhas de código? Essa tentativa de mesclagem falharia devido a um conflito de mesclagem.
O que são conflitos de mesclagem?
Conflitos de mesclagem surgem quando um desenvolvedor tenta mesclar alterações que substituem acidentalmente alterações paralelas. Não importa como essas outras alterações foram mescladas no branch base. O Git não substitui um conjunto de alterações automaticamente em favor de outro. Em vez disso, ele o aponta para a pessoa que está tentando mesclá-lo para que ela possa resolvê-lo em Comparar branches antes de tentar mesclá-lo novamente.
Como resolver conflitos de mesclagem
Para ajudar você a resolver conflitos de mesclagem, o GitHub gera um arquivo híbrido temporário que inclui as diferenças de cada branch. A convenção é que o texto do branch de comparação é mostrado acima do branch base, separado por uma linha de sinais de igual (=======
).
Quando as alterações são pequenas, você pode usar essa exibição para editar o arquivo diretamente. Se você decidir manter o resultado final, ele será confirmado em Comparar branches. Como alternativa, se a mesclagem é mais complexa, talvez você prefira trabalhar nela usando outras ferramentas de desenvolvimento. De qualquer forma, não se esqueça de remover os marcadores de branch do código antes da confirmação. Se você se esquecer de remover esses marcadores quando fizer o commit da resolução de conflitos, eles permanecerão no arquivo e não serão comentados.
Observação
Esta unidade aborda a resolução de conflitos de mesclagem no contexto de um navegador. Também há muitas plataformas de desenvolvimento, como o Visual Studio, que oferecem experiências integradas de resolução de conflitos de mesclagem.
Após todos os conflitos de mesclagem terem sido resolvidos no branch, você poderá tentar fazer a mesclagem novamente.
Evitando conflitos de mesclagem
Determinados conflitos de mesclagem são inevitáveis. Qualquer mesclagem tem o potencial de produzir conflitos de mesclagem para outras solicitações de pull que aguardam aprovação. No entanto, uma forma eficaz de reduzir a complexidade dos conflitos de mesclagem é efetuar pull do branch com frequência.
Efetuar pull no início e com frequência
O comando git pull
efetua pull de todos os commits do branch base que ainda não foram aplicados ao branch atual. Conceitualmente, ele é semelhante ao comando Get Latest que muitos sistemas de controle de versão usam para permitir que você atualize o código local para a versão mais recente. Ao efetuar pull das atualizações para o branch, você está mesclando todas as alterações feitas desde que ele foi criado (ou do último pull).
Efetuar pull das atualizações no branch pode resultar em conflitos de mesclagem, mas não há nada de errado nisso. Você os receberá mais tarde de qualquer forma e, ao recebê-los antes, poderá lidar com eles de maneira mais fácil.
Além de reduzir o impacto dos conflitos de mesclagem, efetuar pull das atualizações também permite que você integre as alterações confirmadas ao branch enquanto trabalha. Fazer isso permite que você evite possíveis problemas antecipadamente. Por exemplo, pode haver alterações de definição de classe em outros arquivos que fazem com que o código não seja mais compilado. Essa alteração não causará um conflito de mesclagem mais adiante, mas interromperá o build se você não a testar primeiro. É uma melhor prática efetuar pull das atualizações com frequência para manter o branch o mais próximo possível de sua base.
Organizar o histórico com git rebase
O comando git rebase
(ou git pull --rebase
) regenera o histórico do branch de maneira a usar a confirmação HEAD atual do branch base como sua base. Em outras palavras, o branch é atualizado para se comportar como se tivesse sido ramificado do estado atual do branch base. Essa troca de base significa que todas as alterações são comparadas com o estado mais recente do branch base, não com o commit original com base no qual você criou o branch originalmente. A troca de base pode facilitar o controle do histórico após a mesclagem final, pois os commits seguirão os commits paralelos anteriores de maneira linear. É uma boa prática trocar a base do branch imediatamente antes de mesclar upstream.
Saiba mais sobre Git rebase e como resolver conflitos de mesclagem após um comando Git rebase.