¿Cómo difiere el algoritmo de paciencia del algoritmo predeterminado git diff
, y cuándo me gustaría usarlo?
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.
También puede usarlo para fusiones (funcionó muy bien aquí para algunos conflictos XML):
git merge --strategy-option=patience ...
git config --global diff.algorithm patience
git merge -X patience
.
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 .
--histogram
parámetro que "... extiende el algoritmo de paciencia para" admitir elementos comunes de baja ocurrencia " git-scm.com/docs/git-diff.html