Por que uma mesclagem de 3 vias é vantajosa em relação a uma mesclagem de 2 vias?

165

Wikipedia diz que uma fusão de três vias é menos suscetível a erros do que uma de duas vias e, muitas vezes, não precisa de intervenção do usuário. Por que esse é o caso?

Um exemplo em que uma mesclagem de 3 vias é bem-sucedida e uma mesclagem de 2 vias falha seria útil.

Johannes Bittner
fonte

Respostas:

259

Digamos que você e seu amigo fizeram check-out de um arquivo e fizeram algumas alterações. Você removeu uma linha no início e seu amigo adicionou uma linha no final. Em seguida, ele confirmou o arquivo e você precisa mesclar as alterações dele na sua cópia.

Se você estivesse fazendo uma mesclagem bidirecional (em outras palavras, um diff), a ferramenta poderia comparar os dois arquivos e verificar se a primeira e a última linhas são diferentes. Mas como saberia o que fazer com as diferenças? A versão mesclada deve incluir a primeira linha? Deve incluir a última linha?

Com uma mescla de três vias, ele pode comparar os dois arquivos, mas também pode comparar cada um deles com a cópia original (antes de qualquer um de vocês ter alterado). Então, você pode ver que você removeu a primeira linha e que seu amigo adicionou a última linha. E pode usar essas informações para produzir a versão mesclada.

JW.
fonte
"Mas como saberia o que fazer com as diferenças?" Não entendi. Se ele já pode ver as diferenças entre os dois arquivos (sem referência ao original), por que não pode aplicar as duas alterações em série em ordem crescente dos registros de data e hora dos arquivos? Ou seja: Começa com a cópia confirmada do meu amigo, considerando-a o (novo) original (com a adição de linha na parte superior) e, em cima dela, aplica minhas alterações locais (exclusão da linha no botão).
Harry
7
@ Harry Diga que o original tinha três linhas (ABC). Começa com a cópia do meu amigo (ABCD) e a compara à minha (BC). Sem ver o original, pode pensar que removi A e D e que o resultado final deve ser BC.
JW.
80

Este slide de uma apresentação forçada é interessante:

imagem de slide

A lógica essencial de uma ferramenta de mesclagem de três vias é simples:

  • Compare arquivos de base, de origem e de destino
  • Identifique os "pedaços" no arquivo de origem e destino:
    • Pedaços que não correspondem à base
    • Pedaços que correspondem à base
  • Em seguida, monte um resultado mesclado que consiste em:
    • Os pedaços que se combinam nos 3 arquivos
    • Os pedaços que não correspondem à base na origem ou no destino, mas não nos dois
    • Os pedaços que não correspondem à base, mas que correspondem um ao outro (ou seja, foram alterados da mesma maneira na origem e no destino)
    • Espaços reservados para os pedaços em conflito, a serem resolvidos pelo usuário.

Observe que os "pedaços" nesta ilustração são puramente simbólicos. Cada um pode representar linhas em um arquivo, ou nós em uma hierarquia, ou mesmo arquivos em um diretório. Tudo depende do que uma ferramenta de mesclagem específica é capaz.

Você pode estar se perguntando que vantagem uma mesclagem de três vias oferece sobre uma mescla de duas vias. Na verdade, não existe uma mesclagem bidirecional, apenas ferramentas que diferenciam dois arquivos e permitem a "mesclagem" escolhendo trechos de um arquivo ou de outro.
Somente uma mesclagem de três vias permite saber se um pedaço é ou não uma alteração da origem e se o conflito é ou não alterado.

VonC
fonte
"se muda ou não o conflito." - Não tem de 2 vias de mesclagem (dif) mostra um conflito bem (embora a informação é perdida a partir da fonte do conflito) /
Vlad
1
No entanto, é comum no Git ter uma mesclagem de quatro direções onde a base não é a mesma. Ainda uma fusão de três vias é melhor e de duas vias.
Wernight 13/10
@Ernight, existe uma mesclagem de 5 vias?
Pacerier 29/03
@ Pacerier Não que eu saiba, mas é o que realmente está acontecendo durante uma paleta de cores ou rebase.
Wernight 31/03
Muito detalhada e explicação útil
Kaneg
20

Eu escrevi um post muito detalhado sobre isso . Basicamente, você não pode rastrear exclusões / acréscimos com duas vias, muito, muito improdutivas.

Pablo
fonte
@ Pablo, Se eu adicionar uma função antes do X e você adicionar outra função após o X e fizermos uma fusão de três maneiras, a ferramenta aplicará automaticamente as duas alterações. Mas o que acontece quando minha alteração realmente entra em conflito com a sua alteração (por exemplo, cada um de nós cria uma nova função com o mesmo nome de função)? Como a fusão automática deve saber que algumas de nossas mesquinhas "chatas e fáceis" podem realmente causar um conflito ?
Pacerier 25/03
1
Basta ler o seu tutorial, e é realmente útil para mim. Eu me sinto da mesma maneira que os desenvolvedores que você descreveu. Eu sempre temi a fusão de três vias.
racl101
3
Eu sugiro que você copie e cole partes do seu artigo. Acho que isso ajudará você a ganhar votos positivos e estará mais alinhado com a filosofia do stackoverflow.
Samuel
Bom artigo. Eu costumava gostar de usar patches para rebase à medida que você vê mais contexto e pode usar seu editor e ambiente para verificar as coisas; no entanto, há muitas coisas manuais que facilitam o processo. É uma vergonha que não há uma maneira agradável que combina as partes boas de ambos
JonnyRaa
20

Uma mesclagem de três maneiras em que dois conjuntos de alterações em um arquivo base são mesclados à medida que são aplicados, em vez de aplicar um e mesclar o resultado com o outro.

Por exemplo, ter duas alterações em que uma linha é adicionada no mesmo local pode ser interpretada como duas adições, não uma alteração de uma linha.

Por exemplo

O arquivo a foi modificado por duas pessoas, uma adicionando alces e outra adicionando um mouse.

#File a
    dog
    cat

#diff b, a
    dog
+++ mouse
    cat

#diff c, a
    dog
+++ moose
    cat

Agora, se mesclarmos os conjuntos de alterações à medida que os aplicamos, obteremos (mesclagem bidirecional)

#diff b and c, a
    dog
+++ mouse
+++ moose
    cat

Mas se aplicarmos b, observe a mudança de b para c, parecerá que estamos apenas alterando a 'u' para a 'o' (mesclagem bidirecional)

    #diff b, c
    dog
--- mouse
+++ moose
    cat
Theo Belaire
fonte