O que é o `git diff –patience` para?

Como o algoritmo de paciência difere do algoritmo padrão git diff , e quando eu desejaria usá-lo?

Você pode ler um post de Bram Cohen , o autor do algoritmo de comparação de paciência, mas achei este post no blog para resumir o algoritmo de comparação de paciência muito bem:

Em vez disso, o Patience Diff concentra sua energia nas linhas de alto conteúdo de baixa frequência que servem como marcadores ou assinaturas de conteúdo importante no texto. Ainda é um diff baseado em LCS em seu núcleo, mas com uma diferença importante, já que considera apenas a subseqüência mais longa comum das linhas de assinatura:

Encontre todas as linhas que ocorrem exatamente uma vez em ambos os lados, depois faça a maior subsequência comum nessas linhas, combinando-as.

Quando você deve usar a diferença de paciência? Segundo Bram, o diff da paciência é bom para esta situação:

Os casos realmente ruins são aqueles em que duas versões divergiram dramaticamente e o desenvolvedor não está tendo o cuidado de manter o tamanho das amostras sob controle. Sob essas circunstâncias, um algoritmo de diff pode ocasionalmente tornar-se “desalinhado” na medida em que combina longas seções de chaves, mas acaba correlacionando as chaves de funções em uma versão com as chaves da próxima function posterior na outra versão. Essa situação é muito feia e pode resultar em um arquivo de conflito totalmente inutilizável na situação em que você precisa apresentar essas coisas com mais coerência.

Você também pode usá-lo para mesclagens (funcionou muito bem aqui para alguns conflitos XML):

 git merge --strategy-option=patience ... 

O algoritmo de diff de paciência é um algoritmo de diff mais lento que mostra melhores resultados em alguns casos.

Suponha que você tenha o seguinte arquivo registrado no git:

 .foo1 { margin: 0; } .bar { margin: 0; } 

Agora, reorganizamos as seções e adicionamos uma nova linha:

 .bar { margin: 0; } .foo1 { margin: 0; color: green; } 

O algoritmo padrão de diferenças afirma que os títulos das seções foram alterados:

 $ git diff --diff-algorithm=myers diff --git a/example.css b/example.css index 7f1bd1e..6a64c6f 100755 --- a/example.css +++ b/example.css @@ -1,7 +1,8 @@ -.foo1 { +.bar { margin: 0; } -.bar { +.foo1 { margin: 0; + color: green; } 

Considerando que paciência diff mostra um resultado que é sem dúvida mais intuitivo:

 $ git diff --diff-algorithm=patience diff --git a/example.css b/example.css index 7f1bd1e..6a64c6f 100755 --- a/example.css +++ b/example.css @@ -1,7 +1,8 @@ -.foo1 { - margin: 0; -} - .bar { margin: 0; } + +.foo1 { + margin: 0; + color: green; +} 

Há uma boa discussão sobre a qualidade subjetiva do diff aqui , e o git 2.11 está explorando mais as heurísticas do diff .

Note que o algoritmo de diff de paciência ainda tem alguns casos patológicos conhecidos .