Untuk apa `git diff --patience`?

219

Bagaimana perbedaan algoritma kesabaran dari git diffalgoritma default , dan kapan saya ingin menggunakannya?

Gabe Moothart
sumber
1
Mungkin cocok dengan kode yang dipindahkan dan baris yang dimodifikasi yang bisa jauh lebih lambat
codymanix
Saya telah mengekstrak skrip mandiri untuk Patience Diff dari Bazaar, Anda dapat menemukannya di utas SO lainnya .
TryPyPy
38
Pertanyaan lanjutan. Kapan saya sebaiknya tidak menggunakan kesabaran berbeda?
balki
4
Ada juga --histogramparameter yang "... memperluas algoritme kesabaran untuk" mendukung elemen umum yang tidak banyak terjadi " git-scm.com/docs/git-diff.html
Robert

Jawaban:

183

Anda dapat membaca posting dari Bram Cohen , penulis algoritma kesabaran berbeda, tetapi saya menemukan posting blog ini untuk merangkum algoritme kesabaran berbeda dengan sangat baik:

Patience Diff, sebaliknya, memfokuskan energinya pada jalur konten tinggi frekuensi rendah yang berfungsi sebagai penanda atau tanda tangan konten penting dalam teks. Ini masih merupakan diff berbasis LCS pada intinya, tetapi dengan perbedaan penting, karena hanya mempertimbangkan urutan umum terpanjang dari garis tanda tangan:

Temukan semua garis yang muncul tepat sekali di kedua sisi, lalu lakukan urutan terpanjang bersama pada garis-garis tersebut, sesuaikan.

Kapan sebaiknya Anda menggunakan kesabaran berbeda? Menurut Bram, kesabaran berbeda baik untuk situasi ini:

Kasus yang benar-benar buruk adalah kasus di mana dua versi telah menyimpang secara dramatis dan pengembang tidak berhati-hati untuk menjaga ukuran tambalan tetap terkendali. Dalam keadaan itu, sebuah algoritma diff kadang-kadang bisa menjadi 'tidak selaras' karena cocok dengan bagian kurung keriting yang panjang bersama-sama, tetapi akhirnya mengkorelasikan kurung keriting fungsi dalam satu versi dengan kurung keriting dari fungsi selanjutnya berikutnya di versi lain. Situasi ini sangat jelek , dan dapat menghasilkan file konflik yang sama sekali tidak dapat digunakan dalam situasi di mana Anda paling membutuhkan hal-hal seperti itu untuk disajikan secara koheren.

Mark Rushakoff
sumber
3
Dalam pengalaman saya dengan XML untuk saat ini, ia memberikan hasil "buruk" yang sama persis dengan perbedaan normal.
stivlo
5
Saya sudah lebih beruntung dengan kesabaran berbeda dengan XML; tentu saja diff yang saya lihat saat ini memiliki masalah misalignment yang dijelaskan dengan algoritma diff biasa, tetapi terlihat benar-benar hebat dengan kesabaran diff.
me_and
22
Blog ini memiliki penjelasan yang bagus, termasuk gif animasi dari proses: alfedenzo.livejournal.com/170301.html
Quantum7
3
Saya menemukan blog ini sangat menarik dan memberikan penjelasan yang baik dengan tautan lebih lanjut ke detail algoritme: fabiensanglard.net/git_code_review/diff.php Semoga bermanfaat bagi seseorang
SathOkh
The frobnitz / fib / fact diff dapat dilihat di gist.github.com/roryokane/6f9061d3a60c1ba41237
George V. Reilly
52

Anda juga dapat menggunakannya untuk penggabungan (berfungsi sangat baik di sini untuk beberapa konflik XML):

git merge --strategy-option=patience ...
robinst
sumber
51
Atau viagit config --global diff.algorithm patience
Tobu
11
Lebih pendek git merge -X patience.
PythonNut
42

Algoritma beda kesabaran adalah algoritma beda lebih lambat yang menunjukkan hasil yang lebih baik dalam beberapa kasus.

Misalkan Anda memiliki file berikut check in ke git:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

Sekarang kami menyusun ulang bagian dan menambahkan baris baru:

.bar {
    margin: 0;
}

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

Algoritma diff default mengklaim bahwa judul bagian telah berubah:

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

Sedangkan beda kesabaran menunjukkan hasil yang bisa dibilang lebih intuitif:

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

Ada diskusi yang bagus tentang kualitas perbedaan subjektif di sini , dan git 2.11 sedang mengeksplorasi heuristik lebih jauh .

Perhatikan bahwa algoritme kesabaran berbeda masih memiliki beberapa kasus patologis yang diketahui .

Wilfred Hughes
sumber