In che modo l'algoritmo di pazienza differisce dall'algoritmo predefinito git diff
e quando si desidera utilizzarlo?Per cosa è `git diff --patience`?
risposta
Potete leggere a post from Bram Cohen, l'autore dell'algoritmo di pazienza diff, ma ho trovato this blog post di riassumere l'algoritmo diff pazienza molto bene:
Pazienza Diff, invece, concentra la sua energia sulla bassa frequenza alta - linee di contenuto che fungono da indicatori o firme di contenuti importanti nel testo. E 'ancora un diff LCS basata al suo interno, ma con una differenza importante, in quanto considera solo la più lunga sottosequenza comune delle linee di firma:
trovare tutte le righe che si verificano esattamente una volta su entrambi i lati, quindi fare più lunga sottosequenza comune su quelle linee, abbinandole.
Quando si dovrebbe utilizzare pazienza diff? Secondo Bram, la pazienza diff è buono per questa situazione:
I casi davvero male sono quelli in cui due versioni divergono drammaticamente e lo sviluppatore non è facendo attenzione a tenere la dimensione delle patch sotto controllo. In tali circostanze un algoritmo diff può a volte diventare "disallineato" in quanto combacia insieme a lunghe sezioni di parentesi graffe , ma termina correlando le parentesi graffe delle funzioni in una versione con le parentesi graffe della funzione successiva successiva nel altra versione. Questa situazione è molto brutta e può risultare in un file di conflitto inutilizzabile nella situazione in cui è necessario che tali elementi siano presentati in modo coerente in modo coerente.
Nella mia esperienza con XML per ora, dà esattamente gli stessi risultati "cattivi" di un normale diff. – stivlo
Ho avuto molta più fortuna con pazienza rispetto a XML, sicuramente il differenziale che sto guardando attualmente ha esattamente il problema di disallineamento descritto con normale algoritmo diff, ma sembra assolutamente grande con pazienza diff. –
Questo blog ha una grande spiegazione, tra cui una gif animata del processo: http://alfedenzo.livejournal.com/170301.html – Quantum7
La pazienza è un algoritmo diff più lento che mostra risultati migliori in alcuni casi.
Supponiamo di avere il seguente file controllato in git:
.foo1 {
margin: 0;
}
.bar {
margin: 0;
}
Ora abbiamo riordinare le sezioni e aggiungere una nuova linea:
.bar {
margin: 0;
}
.foo1 {
margin: 0;
color: green;
}
L'algoritmo di default diff sostiene che i titoli delle sezioni hanno modificato:
$ 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;
}
Mentre la pazienza diff mostra un risultato che è discutibilmente più 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;
+}
C'è a good discussion of subjective diff quality here e git 2.11 is exploring diff heuristics further.
Si noti che il patience diff algorithm still has some known pathological cases.
Forse corrisponde a codice spostato e righe modificate che possono essere molto più lente – codymanix
Ho estratto uno script standalone per Patience Diff da Bazaar, lo puoi trovare in [altro thread SO] (http://stackoverflow.com/questions/4599456/testualmente-diffing-jSON/4599500 # 4599500). – TryPyPy
Una domanda successiva. Quando non dovrei usare pazience diff? – balki