`Git diff --patience` क्या है?


219

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


1
हो सकता है कि यह स्थानांतरित कोड और संशोधित लाइनों से मेल खाता हो, जो बहुत धीमा हो सकता है
कोडेक्सानिक्स

मैंने बाज़ार से धैर्य डिफ ​​के लिए एक स्टैंडअलोन स्क्रिप्ट निकाली है, आप इसे अन्य एसओ धागे में पा सकते हैं ।
TryPyPy

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

4
वहाँ भी --histogramपैरामीटर है जो "..." कम- घटाव वाले
रॉबर्ट

जवाबों:


183

ब्रैम कोहेन के धैर्य के एल्गोरिथ्म के एक पोस्ट को आप पढ़ सकते हैं , लेकिन मुझे यह ब्लॉग पोस्ट बहुत अच्छी तरह से धैर्य के अलग एल्गोरिथ्म को संक्षेप में प्रस्तुत करने के लिए मिली :

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

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

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

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


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

5
मैंने एक्सएमएल के साथ धैर्य के साथ बहुत बेहतर भाग्य प्राप्त किया है; निश्चित रूप से वर्तमान में मैं जिस अंतर को देख रहा हूं, वह नियमित रूप से अलग एल्गोरिथ्म के साथ वर्णित मिसलिग्न्मेंट समस्या है, लेकिन धैर्य के अंतर के साथ बिल्कुल भव्य दिखता है।
14_12 पर me_and

22
इस ब्लॉग में एक महान व्याख्या है
क्वांटम 7

3
मैंने इस ब्लॉग को बहुत दिलचस्प पाया है और एल्गोरिदम के विवरणों के लिए आगे के लिंक के साथ अच्छी व्याख्या प्रदान की है: fabiensanglard.net/git_code_review/diff.php आशा है कि यह किसी के लिए उपयोगी होगा
SathOkh


52

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

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

51
या के माध्यम सेgit config --global diff.algorithm patience
टोबू

11
कम होगा git merge -X patience
पाइथननॉट

42

धैर्य अलग एल्गोरिथ्म एक धीमी अंतर एल्गोरिथ्म है जो कुछ मामलों में बेहतर परिणाम दिखाता है।

मान लीजिए कि आपके पास git में निम्नलिखित फ़ाइल है:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

अब हम अनुभागों को फिर से व्यवस्थित करते हैं और एक नई पंक्ति जोड़ते हैं:

.bar {
    margin: 0;
}

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

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

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

यहाँ व्यक्तिपरक अंतर गुणवत्ता की एक अच्छी चर्चा है , और git 2.11 आगे की उत्तराधिकारियों की खोज कर रहा है

ध्यान दें कि धैर्य अलग एल्गोरिथ्म में अभी भी कुछ ज्ञात रोग संबंधी मामले हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.