2010-10-28 9 views
185

In che modo l'algoritmo di pazienza differisce dall'algoritmo predefinito git diff e quando si desidera utilizzarlo?Per cosa è `git diff --patience`?

+0

Forse corrisponde a codice spostato e righe modificate che possono essere molto più lente – codymanix

+0

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

+28

Una domanda successiva. Quando non dovrei usare pazience diff? – balki

risposta

157

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.

+2

Nella mia esperienza con XML per ora, dà esattamente gli stessi risultati "cattivi" di un normale diff. – stivlo

+5

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

+14

Questo blog ha una grande spiegazione, tra cui una gif animata del processo: http://alfedenzo.livejournal.com/170301.html – Quantum7

41

si può anche usare per le unioni (lavorato molto bene qui per alcuni conflitti XML): algoritmo diff

git merge --strategy-option=patience ... 
+45

oppure tramite 'git config --global diff.algorithm patience' – Tobu

+6

Più breve sarebbe' git merge -X pazienza' . – PythonNut

21

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.