¿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?


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.


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 ...

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 .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.