A cosa serve `git diff --patience`?


219

In che modo l'algoritmo di pazienza differisce dall'algoritmo predefinito git diffe quando dovrei usarlo?


1
Forse corrisponde al codice spostato e alle righe modificate che possono essere molto più lente
codymanix,

Ho estratto uno script autonomo per Patience Diff da Bazaar, puoi trovarlo in un altro thread SO .
ProvaPyPy il

38
Una domanda di follow-up. Quando non dovrei usare la pazienza diff?
balki,

4
C'è anche il --histogramparametro che "... estende l'algoritmo di pazienza per" supportare elementi comuni a bassa occorrenza " git-scm.com/docs/git-diff.html
Robert,

Risposte:


183

Puoi leggere un post di Bram Cohen , l'autore dell'algoritmo diff pazienza, ma ho trovato questo post sul blog per riassumere molto bene l'algoritmo diff pazienza:

Patience Diff, invece, concentra la sua energia sulle linee ad alto contenuto a bassa frequenza che fungono da marcatori o firme di contenuti importanti nel testo. È ancora un diff basato su LCS al suo interno, ma con una differenza importante, poiché considera solo la sottosequenza comune più lunga delle linee di firma:

Trova tutte le linee che si verificano esattamente una volta su entrambi i lati, quindi esegui la sottosequenza comune più lunga su quelle linee, abbinandole.

Quando dovresti usare la pazienza diff? Secondo Bram, la pazienza diff è buona per questa situazione:

I casi veramente brutti sono quelli in cui due versioni sono divergenti in modo drammatico e lo sviluppatore non sta facendo attenzione a tenere sotto controllo le dimensioni delle patch. In tali circostanze un algoritmo diff può occasionalmente diventare "disallineato" in quanto combina insieme lunghe sezioni di parentesi graffe, ma finisce per correlare le parentesi graffe delle funzioni in una versione con le parentesi graffe della successiva funzione successiva nell'altra versione. Questa situazione è molto brutta e può risultare in un file di conflitto totalmente inutilizzabile nella situazione in cui è necessario che tali elementi siano presentati in modo più coerente.


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

5
Ho avuto molta più fortuna con la pazienza diff con XML; certamente il diff che sto guardando attualmente ha esattamente il problema di disallineamento descritto con il normale algoritmo diff, ma sembra assolutamente grandioso con la pazienza diff.
me_e

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

3
Ho trovato questo blog molto interessante e fornendo una buona spiegazione con ulteriori collegamenti ai dettagli degli algoritmi: fabiensanglard.net/git_code_review/diff.php Spero che possa essere utile a qualcuno
SathOkh,

Il frobnitz / fib / fact diff può essere visto su gist.github.com/roryokane/6f9061d3a60c1ba41237
George V. Reilly il

52

Puoi anche usarlo per le fusioni (ha funzionato davvero bene qui per alcuni conflitti XML):

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

51
O viagit config --global diff.algorithm patience
Tobu l'

11
Più breve sarebbe git merge -X patience.
PythonNut,

42

L'algoritmo diff di pazienza è un algoritmo diff più lento che mostra risultati migliori in alcuni casi.

Supponiamo di avere il seguente file registrato in git:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

Ora riordiniamo le sezioni e aggiungiamo una nuova riga:

.bar {
    margin: 0;
}

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

L'algoritmo diff predefinito afferma che le intestazioni di sezione sono cambiate:

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

Considerando che diff di pazienza mostra un risultato che è probabilmente 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'è una buona discussione sulla qualità diff soggettiva qui , e git 2.11 sta esplorando ulteriormente l'euristica diff .

Si noti che l' algoritmo diff di pazienza presenta ancora alcuni casi patologici noti .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.