web-dev-qa-db-fra.com

Qu'est-ce que c'est `git diff --patience`

En quoi l'algorithme de patience diffère-t-il de la valeur par défaut git diff algorithme, et quand voudrais-je l'utiliser?

208
Gabe Moothart

Vous pouvez lire n article de Bram Cohen , l'auteur de l'algorithme de patience, mais j'ai trouvé cet article de blog pour résumer très bien l'algorithme de patience:

Patience Diff, au contraire, concentre son énergie sur les lignes à haute teneur en basses fréquences qui servent de marqueurs ou de signatures de contenu important dans le texte. C'est toujours un diff basé sur LCS, mais avec une différence importante, car il ne considère que la sous-séquence commune la plus longue des lignes de signature:

Recherchez toutes les lignes qui apparaissent exactement une fois des deux côtés, puis effectuez la sous-séquence la plus longue commune sur ces lignes, en les faisant correspondre.

Quand devriez-vous utiliser diff de patience? Selon Bram, la difficulté de la patience est bonne pour cette situation:

Les cas vraiment graves sont ceux dans lesquels deux versions ont considérablement divergé et le développeur ne veille pas à garder la taille des correctifs sous contrôle. Dans ces circonstances, un algorithme diff peut parfois devenir "mal aligné" en ce sens qu'il associe de longues sections d'accolades, mais il finit par mettre en corrélation les accolades de fonctions d'une version avec les accolades de la fonction suivante dans l'autre version. Cette situation est très laide et peut générer un fichier de conflit totalement inutilisable si vous avez besoin que ces éléments soient présentés de manière plus cohérente.

173
Mark Rushakoff

Vous pouvez également l'utiliser pour les fusions (très bien travaillé ici pour certains conflits XML):

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

L'algorithme de patience patience est un algorithme de différenciation plus lent qui donne de meilleurs résultats dans certains cas.

Supposons que le fichier suivant soit enregistré dans git:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

Maintenant, nous réorganisons les sections et ajoutons une nouvelle ligne:

.bar {
    margin: 0;
}

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

L'algorithme diff par défaut prétend que les en-têtes de section ont été modifiés:

$ 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 patience diff montre un résultat sans doute plus intuitif:

$ 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 ne bonne discussion sur la qualité subjective des diff ici , et git 2.11 explore plus en détail les heuristiques des diff .

Notez que le l'algorithme de patience a encore quelques cas pathologiques connus .

34
Wilfred Hughes