`Git diff --patience` ne işe yarıyor?


219

Sabır algoritması varsayılan git diffalgoritmadan nasıl farklıdır ve ne zaman kullanmak isterim?


1
Belki de taşınan kod ve çok daha yavaş olabilen değiştirilmiş satırlarla eşleşir
codymanix

Bazaar'dan Patience Diff için bağımsız bir senaryo çıkardım, başka bir SO iş parçacığında bulabilirsiniz .
11'te

38
Takip eden bir soru. Ne zaman sabır farkı kullanmamalıyım?
balki

4
--histogram"... sabır algoritmasını" düşük tekrarlanan ortak öğeleri destekleyecek şekilde "genişleten bir parametre de vardır gitscsc.com/docs/git-diff.html
Robert

Yanıtlar:


183

Sabır farkı algoritmasının yazarı Bram Cohen'den bir yazı okuyabilirsiniz , ancak bu blog yayınını sabır farkı algoritmasını çok iyi özetlemek için buldum :

Bunun yerine Patience Diff, enerjisini metindeki önemli içeriğin işaretleri veya imzaları olarak işlev gören düşük frekanslı yüksek içerikli hatlara odaklar. Özünde hala LCS tabanlı bir farktır, ancak sadece imza çizgilerinin en uzun ortak sırasını dikkate aldığı için önemli bir fark vardır:

Her iki tarafta tam olarak bir kez meydana gelen tüm çizgileri bulun, ardından bu çizgiler üzerinde eşleşen en uzun ortak diziyi yapın.

Ne zaman sabır farkı kullanmalısınız ? Bram'a göre, sabır farkı bu durum için iyidir:

Gerçekten kötü durumlar, iki sürümün dramatik bir şekilde ayrıştığı ve geliştiricinin yama boyutlarını kontrol altında tutmaya özen göstermediği durumlar. Bu koşullar altında, bir fark algoritması bazen kıvırcık parantezlerin uzun bölümleriyle eşleşmesi nedeniyle 'yanlış hizalanabilir', ancak bir versiyondaki fonksiyonların kıvırcık parantezlerini diğer versiyondaki sonraki sonraki fonksiyonun kıvırcık parantezleri ile ilişkilendirir. Bu durum çok çirkindir ve bu tür şeylerin en tutarlı şekilde sunulması gereken durumda tamamen kullanılamaz bir çatışma dosyasına neden olabilir.


3
Şimdilik XML ile yaşadığım deneyimde, normal bir farkla aynı "kötü" sonuçları veriyor.
stivlo

5
XML ile sabır farkı çok daha iyi şanslar yaşadım; kesinlikle şu anda baktığım fark tam olarak normal fark algoritması ile açıklanan yanlış hizalama sorunu var, ama kesinlikle fark fark ile büyük görünüyor.
me_and 14:12

22
Bu blog, sürecin hareketli bir gif dahil olmak üzere harika bir açıklamaya sahip: alfedenzo.livejournal.com/170301.html
Quantum7

3
Bu blogu çok ilginç buldum ve algoritma detaylarına daha fazla bağlantı ile iyi bir açıklama sağladım : fabiensanglard.net/git_code_review/diff.php Umarım birisi için yararlı olacaktır
SathOkh


52

Birleştirme için de kullanabilirsiniz (bazı XML çakışmaları için gerçekten iyi çalıştı):

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

51
Veya viagit config --global diff.algorithm patience
Tobu

11
Daha kısa olurdu git merge -X patience.
PythonNut

42

Sabır farkı algoritması, bazı durumlarda daha iyi sonuçlar veren daha yavaş bir fark algoritmasıdır.

Git için şu dosyanın teslim edildiğini varsayalım:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

Şimdi bölümleri yeniden sıralıyoruz ve yeni bir satır ekliyoruz:

.bar {
    margin: 0;
}

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

Varsayılan fark algoritması bölüm başlıklarının değiştiğini iddia eder:

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

Sabır farkı, tartışmasız daha sezgisel bir sonuç gösterirken:

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

Burada öznel farklılık kalitesiyle ilgili iyi bir tartışma var ve git 2.11 fark sezgisel yöntemlerini daha fazla araştırıyor .

Not o sabır fark algoritması hala bazı bilinen patolojik durumları vardır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.