¿Para qué sirve `git diff --patience`?

219

¿Cómo difiere el algoritmo de paciencia del algoritmo predeterminado git diff, y cuándo me gustaría usarlo?

Gabe Moothart
fuente
1
Tal vez coincide con el código movidos y líneas modificadas que pueden ser mucho más lento
codymanix
Extraje un guión independiente para Patience Diff de Bazaar, puedes encontrarlo en otro hilo SO .
TryPyPy
38
Una pregunta de seguimiento. ¿Cuándo no debo usar la paciencia diff?
balki
44
También está el --histogramparámetro que "... extiende el algoritmo de paciencia para" admitir elementos comunes de baja ocurrencia " git-scm.com/docs/git-diff.html
Robert

Respuestas:

183

Puede leer una publicación de Bram Cohen , el autor del algoritmo de diferencia de paciencia, pero encontré esta publicación de blog para resumir muy bien el algoritmo de diferencia de paciencia:

Patience Diff, en cambio, enfoca su energía en las líneas de baja frecuencia y alto contenido que sirven como marcadores o firmas de contenido importante en el texto. Todavía es una diferencia basada en LCS en su núcleo, pero con una diferencia importante, ya que solo considera la subsecuencia común más larga de las líneas de firma:

Encuentre todas las líneas que ocurren exactamente una vez en ambos lados, luego haga la subsecuencia común más larga en esas líneas, uniéndolas.

¿Cuándo deberías usar la paciencia diff? Según Bram, la diferencia de paciencia es buena para esta situación:

Los casos realmente malos son aquellos en los que dos versiones han divergido dramáticamente y el desarrollador no tiene cuidado de mantener los tamaños de parches bajo control. En esas circunstancias, un algoritmo de diferencias puede ocasionalmente 'desalinearse' ya que coincide con secciones largas de llaves, pero termina correlacionando las llaves de funciones en una versión con las llaves de la siguiente función posterior en la otra versión. Esta situación es muy fea y puede dar como resultado un archivo de conflicto totalmente inutilizable en la situación en la que necesita que esas cosas se presenten de manera coherente.

Mark Rushakoff
fuente
3
En mi experiencia con XML por ahora, da exactamente los mismos resultados "malos" que un diferencial normal.
stivlo
55
He tenido mucha mejor suerte con la paciencia con XML; ciertamente, la diferencia que estoy viendo actualmente tiene exactamente el problema de desalineación descrito con el algoritmo de diferencia regular, pero se ve absolutamente grandioso con la diferencia de paciencia.
yo_y
22
Este blog tiene una gran explicación, que incluye un gif animado del proceso: alfedenzo.livejournal.com/170301.html
Quantum7
3
Este blog me ha parecido muy interesante y proporciona una buena explicación con más enlaces a detalles de algoritmos: fabiensanglard.net/git_code_review/diff.php Espero que sea útil para alguien
SathOkh
El frobnitz / fib / fact diff se puede ver en gist.github.com/roryokane/6f9061d3a60c1ba41237
George V. Reilly
52

También puede usarlo para fusiones (funcionó muy bien aquí para algunos conflictos XML):

git merge --strategy-option=patience ...
robinst
fuente
51
O víagit config --global diff.algorithm patience
Tobu
11
Más corto sería git merge -X patience.
PythonNut
42

El algoritmo diff de paciencia es un algoritmo diff más lento que muestra mejores resultados en algunos casos.

Supongamos que tiene el siguiente archivo registrado en git:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

Ahora reordenamos las secciones y agregamos una nueva línea:

.bar {
    margin: 0;
}

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

El algoritmo de diferencias predeterminado afirma que los encabezados de sección han cambiado:

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

Mientras que la diferencia de paciencia muestra un resultado que podría decirse que es más 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;
+}

Aquí hay una buena discusión sobre la calidad subjetiva de diferencias , y git 2.11 está explorando aún más la heurística de diferencias .

Tenga en cuenta que el algoritmo de diferencia de paciencia todavía tiene algunos casos patológicos conocidos .

Wilfred Hughes
fuente