2010-10-28 16 views
185

En quoi l'algorithme de patience diffère-t-il de l'algorithme par défaut git diff et quand voudrais-je l'utiliser?Qu'est-ce que `git diff --patience`?

+0

Peut-être correspond-il au code déplacé et aux lignes modifiées qui peuvent être beaucoup plus lentes – codymanix

+0

J'ai extrait un script autonome pour Patience Diff de Bazaar, vous pouvez le trouver dans [un autre thread SO] (http://stackoverflow.com/questions/4599456/textually-diffing-json/4599500 # 4599500). – TryPyPy

+28

Une question de suivi. Quand dois-je ne pas utiliser la patience diff? – balki

Répondre

157

Vous pouvez lire a post from Bram Cohen, l'auteur de la patience algorithme de diff, mais je l'ai trouvé this blog post de résumer la patience algorithme de diff très bien:

Patience Diff, au contraire, se concentre son énergie sur la haute basse fréquence lignes -contentes qui servent de marqueurs ou de signatures de contenu important dans le texte. Il est encore une diff base LCS à sa base, mais avec une différence importante, car elle considère que la plus longue séquence commune des lignes de signature:

Trouver toutes les lignes qui se produisent exactement une fois sur les deux côtés, puis faire la plus longue sous-séquence commune sur ces lignes, correspondant à eux.

Quand devriez-vous utiliser patience diff? Selon Bram, la patience diff est bon pour cette situation:

Les cas vraiment mauvais sont ceux où deux versions ont divergé de façon spectaculaire et le développeur n'est pas prudent de garder la taille des patchs sous contrôle. Dans ces circonstances, un algorithme diff peut occasionnellement devenir 'désaligné' en ce sens qu'il correspond à de longues sections de crochets ensemble, mais il finit par corréler les accolades de fonctions en une version avec les accolades de la fonction suivante dans le autre version. Cette situation est très moche, et peut entraîner un fichier de conflit totalement inutilisable dans la situation où vous avez besoin de telles choses présenté le plus cohérent.

+2

Selon mon expérience avec XML pour le moment, ça donne exactement les mêmes "mauvais" résultats qu'un diff normal – stivlo

+5

J'ai eu beaucoup plus de chance avec diff de patience avec XML, certainement le diff que je regarde actuellement a exactement le problème de désalignement décrit avec le algorithme de diff régulier, mais regarde absolument grand avec diff de patience –

+14

Ce blog a une excellente explication, y compris un gif animé du processus: http://alfedenzo.livejournal.com/170301.html – Quantum7

41

Vous pouvez également l'utiliser pour se confond (a vraiment bien ici pour certains conflits XML):

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

Ou via 'git config - diff.algorithmglobal patience' – Tobu

+6

Plus court serait' git merge -X patience' . – PythonNut

21

La patience algorithme de diff est un algorithme de diff plus lent qui montre de meilleurs résultats dans certains cas.

Supposons que vous avez le fichier suivant vérifié pour git:

.foo1 { 
    margin: 0; 
} 

.bar { 
    margin: 0; 
} 

Maintenant, nous réordonner les sections et ajouter une nouvelle ligne:

.bar { 
    margin: 0; 
} 

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

L'algorithme par défaut diff prétend que les titres de section ont changé:

$ 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; 
} 

Alors que la diff de patience montre un résultat qui est sans doute plus intuitive:

$ 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; 
+} 

Il y a a good discussion of subjective diff quality here et git 2.11 is exploring diff heuristics further.

Notez que le patience diff algorithm still has some known pathological cases.