2015-01-20 5 views
23

अतीत में कई बार, हमें एक समस्या है जहां डेवलपर्स (या तो स्पष्ट रूप से या प्रभावी रूप से) git merge -s ours करते हैं, जब उनके पास नहीं होना चाहिए, खो गया है और सफाई के बाद हमें यह पता चला है अधिक जटिल और समय लेने वाला। टेस्ट विफल नहीं हुए क्योंकि परीक्षणों को जोड़ने वाले बहुत ही कामों को चुपचाप उनके द्वारा परीक्षण किए जा रहे कोड के साथ वापस कर दिया गया था।ग़लत 'गिट मर्ज-एस ​​हमारा' पता लगाने के लिए मैं विलय को सारांशित कैसे कर सकता हूं?

क्या मैं, लगता है या एक उपकरण है जो किसी मर्ज को सारांशित बनाने है करना चाहते हैं एक सामान्य मर्ज के साथ निम्नलिखित की तरह एक निर्गम कुछ का निर्माण: जहां एक मर्ज को गलत तरीके से किया गया था

Lines    Left(2b3c4d) Right(3c4d5e) 
Common with base 970   930 
Unique wrt base 20   50 
Unique wrt other 15   45 
Unique wrt merge 15   45 
Common with merge 995   985 

लेकिन मामले में , कई बदलाव बाहर पूर्ववत करने, या जहां एक git merge -s ours प्रदर्शन किया गया था, ऐसा लगता है एक रिपोर्ट कुछ में परिणाम हो सकता है:

Lines    Left(2b3c4d) Right(3c4d5e) 
Common with base 970   930 
Unique wrt base 20   50 
Unique wrt other 15   45 
Unique wrt merge 15    0 !! 
Common with merge 990   935 
Warning: 100% of changes from 3c4d5e are missing from merge commit! 

यदि यह रिपोर्ट उन सभी के लिए प्रतिबद्ध के लिए चलाए गए, हम झंडा ऊपर (एक जेनकींस काम के माध्यम से) कर सकता है जब भी एक विलय थोड़ा सा था पर smelly पक्ष पर।

अब तक मैं git diff --stat, git diff --name-status और git diff --summary के साथ खेल रहा हूं लेकिन अब तक मुझे कोई भी चीज़ नहीं है जो मैं चाहता हूं।

सबसे अच्छा मैं अब तक क्या कर सकते हैं एक सामान्य मर्ज के लिए निम्नलिखित की तरह कुछ में परिणाम होगा:

   base..left base..right left..merge right..merge 
       f67c4..a9eb4 f67c4..5b592 a9eb4..cb209 5b592..cb209 
a |     1 +   1 +   
b |  1 +         1 + 
base |  1 +   1 +   1 +   1 + 
changed  2   2   2   2 
insertions(+) 2   2   2   2 
deletions(-) 0   0   0   0 

और एक ours मर्ज के लिए:

   base..left base..right left..merge right..merge 
       f67c4..a9eb4 f67c4..5b592 a9eb4..95637 5b592..95637 
a |     1 +      1 - 
b |  1 +         1 + 
base |  1 +   1 +      2 +- 
changed  2   2   0   3 
insertions(+) 2   2   0   2 
deletions(-) 0   0   0   2 

ध्यान दें कि मैं न केवल कर -s ours विलय का पता लगाना चाहते हैं, मैं भी स्थिति को पकड़ना चाहता हूं जहां कुछ लेकिन परिणामस्वरूप विलय में सभी बदलाव नहीं हैं। यह खोने परिवर्तनों के एक विशिष्ट कारण की जांच करने के बजाय गलत विलय का पता लगाने का एक और सामान्य मामला है।

इसके अलावा, ऐसा लगता है कि विलय में संघर्ष होने पर ऐसा ही होता है, इसलिए किसी भी विधि को विलय को स्वचालित रूप से चलाने की आवश्यकता होती है, उसे स्वचालित रूप से उन संघर्षों को भी हल करने की आवश्यकता होगी।

आखिरकार, मैं अपने सारांशों को पहले बिना छेड़छाड़ किए बिना, इस सारांश उपयोग को गंदे रेपो पर चलाने में सक्षम होना चाहता हूं, इसलिए git diff के साथ मेरे वर्तमान प्रयोग।

इस तरह की जानकारी के बारे में कोई सुझाव है कि मैं इस तरह की जानकारी पर सीधे पार्सिंग और रीफॉर्मेटिंग के साथ एक स्क्रिप्ट से अधिक कैसे प्राप्त कर सकता हूं।

मुझे सबसे नज़दीकी मौजूदा प्रश्न मिल सकते हैं: Detect a merge made by '-s ours' (लेकिन एकमात्र उत्तर वहां मदद नहीं करता है) और “git merge -s ours” and how to show difference (लेकिन वहां कोई जवाब नहीं है)।

+2

'हमारा हमारा विलय' का पता लगाने का एक आसान तरीका विलय प्रतिबद्धता के दोनों माता-पिता के खिलाफ एक अंतर चलाना है। यदि एक अंतर ** खाली ** है, और माता-पिता अन्यथा अलग हैं, तो यह एक निश्चित संकेत है कि 'हमारा हमारा' (या समकक्ष) किया गया था। उदाहरण के लिए, आप '$ (गिट शो --pretty =% पी $ प्रतिबद्ध) पर लूप कर सकते हैं और चेतावनी दे सकते हैं 'अगर! गिट diff -s --exit-code $ parent .. $ commit'। – user4815162342

+0

मर्ज आईएमओ में क्या हुआ यह देखने का सबसे अच्छा तरीका है कि विलय को फिर से करें, फिर वास्तविक विलय के साथ परिणाम को अलग करें। तो 'गिट चेकआउट ; गिट मर्ज ; गिट diff ' –

+0

धन्यवाद @ user4815162342, यह काफी है जो मैं ऊपर कर रहा हूं, 'आधार .. बाएं',' बेस..राइट ',' बाएं..मर्ज 'और '' git diff --stat'' का उपयोग करके right..merge'। इसके अलावा, मैं एक '-s ours' विलय बीटीडब्ल्यू नहीं मानना ​​चाहता, मैं भी स्थिति को पकड़ना चाहता हूं जहां कुछ लेकिन परिणामस्वरूप विलय में सभी बदलाव नहीं हैं। मैंने दोनों प्रश्नों को और स्पष्ट करने के लिए अपना प्रश्न अपडेट कर लिया है। –

उत्तर

1

मुझे यह सही समस्या थी, और इन प्रकार के विलयों का पता लगाने के लिए एक उपकरण लिखना समाप्त हो गया। जबकि मैं वास्तविक कोड साझा नहीं कर सकता (यह तकनीकी रूप से मेरे नियोक्ता द्वारा स्वामित्व में है), एल्गोरिदम बहुत सरल है: एस 1 को उन सभी फ़ाइलों का सेट होना चाहिए जिनमें विलय और विलय के दूसरे माता-पिता के बीच परिवर्तन हो। एस 2 को उन सभी फ़ाइलों का सेट होना चाहिए जिनमें मर्ज और मर्ज बेस के बीच परिवर्तन हैं। S1 से S2 घटाएं, और आपको उन फ़ाइलों के सेट के साथ छोड़ा गया है जो विलय के कारण संभवतः परिवर्तन खो चुके हैं।

यह न केवल -s ours के साथ बनाया का आपस में विलय की पहचान करेगा, यह भी असफल पहचान करेगा विलीन हो जाती है जहां कुछ, लेकिन सभी नहीं, के दूसरे माता-पिता में परिवर्तन मर्ज में अपना स्थान बनाया।

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