2010-10-28 13 views
185

धैर्य एल्गोरिदम डिफ़ॉल्ट git diff एल्गोरिदम से भिन्न कैसे होता है, और मैं इसका उपयोग कब करना चाहूंगा?'गिट diff --patience` के लिए क्या है?

+0

शायद यह कोड और संशोधित लाइनों से मेल खाता है जो बहुत धीमा हो सकता है – codymanix

+0

मैंने बाजार से धैर्य के लिए एक स्टैंडअलोन स्क्रिप्ट निकाली है, आप इसे [अन्य SO थ्रेड] में ढूंढ सकते हैं (http://stackoverflow.com/questions/4599456/टेक्स्ट रूप-diffing-json/4599500 # 4599500)। – TryPyPy

+28

एक फॉलोअप प्रश्न। मुझे धैर्य का उपयोग क्यों नहीं करना चाहिए? – balki

उत्तर

157

आप a post from Bram Cohen, धैर्य diff एल्गोरिथ्म के लेखक पढ़ सकते हैं, लेकिन मैं this blog post पाया बहुत अच्छी तरह से धैर्य diff एल्गोरिथ्म संक्षेप में प्रस्तुत करने:

धैर्य Diff, बजाय, अपनी ऊर्जा कम आवृत्ति उच्च पर केंद्रित -केंट लाइन जो टेक्स्ट में महत्वपूर्ण सामग्री के मार्कर या हस्ताक्षर के रूप में कार्य करती हैं। यह अभी भी अपने मूल में एक LCS आधारित diff है, लेकिन एक महत्वपूर्ण अंतर के साथ, के रूप में यह केवल हस्ताक्षर लाइनों के सबसे लंबे समय तक आम subsequence मानता है:

सभी लाइनों जो दोनों पक्षों पर ठीक एक बार होते हैं, तो पता लगाएं उन पंक्तियों पर सबसे लंबा आम अनुवर्ती, उन्हें मिलान।

आप धैर्य diff जब का उपयोग चाहिए? ब्रैम के अनुसार, धैर्य diff इस स्थिति के लिए अच्छा है:

वास्तव में बुरा मामलों हैं जहां दो संस्करणों नाटकीय रूप से भिन्न हो गए हैं कर रहे हैं और डेवलपर नियंत्रण में पैच आकार रखने के लिए सावधान नहीं किया जा रहा है। उन परिस्थितियों में एक diff एल्गोरिदम कभी-कभी 'misaligned' बन सकता है जिसमें यह घुंघराले ब्रैकेट के लंबे खंडों से मेल खाता है, लेकिन यह में फ़ंक्शंस के घुंघराले ब्रैकेट को सहसंबंधित करता है जिसमें अगले बाद के फ़ंक्शन के घुंघराले ब्रैकेट्स के साथ एक संस्करण होता है। अन्य संस्करण। यह स्थिति बहुत बदसूरत है, और परिणामस्वरूप ऐसी स्थिति में अनुपयोगी संघर्ष फ़ाइल हो सकती है जहां आपको ऐसी चीजों की आवश्यकता होती है को सबसे अधिक प्रस्तुत किया गया है।

+2

मेरे अनुभव में एक्सएमएल के साथ, यह सामान्य रूप से वही "खराब" परिणाम देता है जो सामान्य अंतर के रूप में देता है। – stivlo

+5

एक्सएमएल के साथ धैर्य के साथ मुझे बहुत अच्छी किस्मत मिली है, निश्चित रूप से जिस अंतर को मैं देख रहा हूं वह वास्तव में गलत तरीके से गलत समस्या है नियमित diff एल्गोरिदम, लेकिन धैर्य diff के साथ बिल्कुल भव्य दिखता है। –

+14

इस ब्लॉग की प्रक्रिया के एनिमेटेड gif सहित एक महान व्याख्या है: http://alfedenzo.livejournal.com/170301.html – Quantum7

41

आप भी इसे आपस में विलय के लिए (वास्तव में अच्छी तरह यहाँ कुछ एक्सएमएल संघर्ष के लिए काम किया) का उपयोग कर सकते हैं:

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

पर या 'git config --global diff.algorithm धैर्य के माध्यम से देखा जा सकता है – Tobu

+6

छोटा 'गिट विलय -X धैर्य' होगा । – PythonNut

21

धैर्य diff एल्गोरिथ्म एक धीमी diff एल्गोरिथ्म कि कुछ मामलों में बेहतर परिणाम से पता चलता है।

मान लीजिए आप निम्न फ़ाइल Git करने के लिए जाँच की है:

.foo1 { 
    margin: 0; 
} 

.bar { 
    margin: 0; 
} 

अब हम अनुभागों का क्रम बदलने और एक नया पंक्ति जोड़ें:

.bar { 
    margin: 0; 
} 

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

डिफ़ॉल्ट diff एल्गोरिथ्म का दावा है कि अनुभाग शीर्षकों है बदला गया:

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

जबकि धैर्य भिन्नता एक परिणाम दिखाती है जो तर्कसंगत रूप से अधिक है सहज ज्ञान युक्त:

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

वहाँ a good discussion of subjective diff quality here, और git 2.11 is exploring diff heuristics further है।

ध्यान दें कि patience diff algorithm still has some known pathological cases

संबंधित मुद्दे