आप अलग-अलग गिट मर्ज की रणनीतियों का उपयोग कब करेंगे?


429

Git-merge के मैन पेज से, कई मर्ज की रणनीतियाँ हैं जिनका आप उपयोग कर सकते हैं।

  • हल - यह केवल 3-सिर मर्ज एल्गोरिथ्म का उपयोग करके दो सिर (वर्तमान शाखा और आपके द्वारा खींची गई एक अन्य शाखा) को हल कर सकता है। यह सावधानी से क्रॉस-क्रॉस मर्ज अस्पष्टता का पता लगाने की कोशिश करता है और इसे आमतौर पर सुरक्षित और तेज माना जाता है।

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

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

  • हमारा - यह किसी भी संख्या में प्रमुखों को हल करता है, लेकिन मर्ज का परिणाम हमेशा वर्तमान शाखा प्रमुख होता है। इसका उपयोग साइड ब्रांचों के पुराने विकास के इतिहास को बताने के लिए किया जाता है।

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

मुझे डिफ़ॉल्ट से कुछ अलग कब निर्दिष्ट करना चाहिए? प्रत्येक के लिए कौन से परिदृश्य सर्वश्रेष्ठ हैं?

जवाबों:


305

मैं संकल्प से परिचित नहीं हूँ, लेकिन मैंने दूसरों का उपयोग किया है:

पुनरावर्ती

गैर-तेज़-फ़ॉरवर्ड मर्ज के लिए पुनरावर्ती डिफ़ॉल्ट है। हम सभी उस एक से परिचित हैं।

ऑक्टोपस

मैंने ऑक्टोपस का उपयोग किया है जब मेरे पास कई पेड़ हैं जिन्हें विलय करने की आवश्यकता थी। आप इसे बड़ी परियोजनाओं में देखते हैं, जहां कई शाखाओं का स्वतंत्र विकास हुआ है और यह सभी एक ही सिर में एक साथ आने के लिए तैयार हैं।

एक ऑक्टोपस शाखा एक ही बार में कई हेड्स को एक मर्ज में तब तक मिला देती है जब तक कि वह इसे साफ-सुथरा कर सके।

चित्रण के लिए, कल्पना करें कि आपके पास एक प्रोजेक्ट है जिसमें एक मास्टर है, और फिर मर्ज करने के लिए तीन शाखाएं हैं (उन्हें कॉल करें ए, बी, और सी)।

पुनरावर्ती मर्जों की एक श्रृंखला इस तरह दिखाई देगी (ध्यान दें कि पहला मर्ज एक तेजी से आगे था, जैसा कि मैंने रिकर्स को बल नहीं दिया है):

पुनरावर्ती विलय की श्रृंखला

हालाँकि, एक एकल ऑक्टोपस मर्ज इस तरह दिखेगा:

commit ae632e99ba0ccd0e9e06d09e8647659220d043b9
Merge: f51262e... c9ce629... aa0f25d...

ऑक्टोपस विलय

हमारा

हमारा == मैं एक और सिर में खींचना चाहता हूं, लेकिन उन सभी परिवर्तनों को फेंक देता हूं जो सिर का परिचय देते हैं।

यह शाखा के इतिहास को शाखा के प्रभावों के बिना रखता है।

(पढ़ें: यह उन शाखाओं के बीच के बदलावों को भी नहीं देखा गया है। शाखाएं केवल विलय की हैं और फाइलों में कुछ भी नहीं किया गया है। यदि आप दूसरी शाखा में विलय करना चाहते हैं और हर बार प्रश्न "हमारे फाइल संस्करण" या उनके संस्करण "आप उपयोग कर सकते हैं git merge -X ours)

सबट्री

जब आप किसी अन्य परियोजना में अपनी वर्तमान परियोजना के एक उपनिर्देशिका में विलय करना चाहते हैं तो सबट्री उपयोगी है। उपयोगी है जब आपके पास एक पुस्तकालय है जिसे आप एक सबमॉड्यूल के रूप में शामिल नहीं करना चाहते हैं।


1
तो Ocotopus का एकमात्र वास्तविक फायदा पेड़ में मर्ज के कम होने की संख्या है?
ओटो

60
आपको ऑक्टोपस मर्ज रणनीति को निर्दिष्ट करने की आवश्यकता नहीं है: यदि आप दो से अधिक शाखाओं ( git merge A B ...) में विलय करते हैं तो इसका उपयोग स्वचालित रूप से किया जाता है ।
जकूब नारबस्की

ऑफ-टॉपिक जाने के लिए क्षमा करें, लेकिन वह कौन सा टूल है जिससे आपने उन स्क्रीनशॉट को बनाया है? ऐसा लगता है कि शाखा इतिहास का वास्तव में महान / सुंदर दृश्य है ...
बर्नड हग

4
लिनक्स पर्यावरण पर उन लोगों के लिए gitg
आकाश अग्रवाल

2
यह संकेत -X oursभयानक है, बस मुझे काम के एक घंटे की बचत हुई।
माइकल

49

वास्तव में केवल दो रणनीतियों आप का चयन करना चाहते हैं कर रहे हैं हमारा अगर आप शाखा द्वारा लाया परिवर्तनों को रोकने के लिए, लेकिन इतिहास में शाखा रखना चाहते हैं, और सबट्री आप (superproject की उपनिर्देशिका में स्वतंत्र परियोजना विलय कर रहे हैं की तरह में 'Git-जीयूआई' ' git 'भंडार)।

ऑक्टोपस मर्ज स्वचालित रूप से दो शाखाओं से अधिक विलय होने पर उपयोग किया जाता है। संकल्प यहां मुख्य रूप से ऐतिहासिक कारणों से है, और जब आप पुनरावर्ती मर्ज रणनीति कोने के मामलों से प्रभावित होते हैं ।


मुझे दो-सिर विलय के लिए डिफ़ॉल्ट 'पुनरावर्ती' के बजाय 'समाधान' चुनना था जिसमें घातक गिट-राइट-ट्री त्रुटियां थीं। 'संकल्प ’की रणनीति साफ सुथरी हो गई। विलय होने वाली शाखा में इसे बहुत सारी फ़ाइलों को स्थानांतरित करने के साथ करना पड़ सकता है।
thaddeusmt

@ त्हद्देमुस्मः दिलचस्प। क्या आप संभव हो सकते हैं, यदि संभव हो तो, मेलिंग सूची को "पुनरावर्ती" विलय की रणनीति की विफलता के बारे में बग रिपोर्ट दें? अग्रिम में धन्यवाद।
जकुब नारबस्की

@ JakubNar Jakbski मुझे यकीन नहीं है कि मैं एक सार्थक बग रिपोर्ट दर्ज करने के लिए पर्याप्त जानकारी कैसे प्राप्त करूंगा, मैं गिट के साथ एक n00b हूं, क्षमा करें। जैसा कि मैंने अपने उत्तर में यहाँ उल्लेख किया है ( stackoverflow.com/a/10636464/164439 ) मेरा अनुमान है कि मेरे साथ दोनों शाखाओं में बदलावों का दोहराव था, और "संकल्प" डुप्लिकेट किए गए परिवर्तनों को छोड़ देने का बेहतर काम करता है।
thaddeusmt

@ JakubNarębski अब तक आप भी चुन सकते हैं उनकी , जो मैन्युअल "के विपरीत के अनुसार है हमाराउनका न तो आप के लिए स्वचालित रूप से चुना जाता है आप थोड़ा अपने anwser अद्यतन कर सकते हैं कर सकते हैं, जोड़ रहा है। उनकी विकल्प
SebNag

3
@SebTu: कोई theirsमर्ज रणनीति नहीं है (जो है --strategy=theirs), लेकिन theirsडिफ़ॉल्ट recursiveमर्ज रणनीति (यानी --strategy=recursive --strategy-option=theirs, या बस -Xtheirs) का विकल्प है।
जैकब नार

23

"समाधान" बनाम "पुनरावर्ती" मर्ज रणनीति

पुनरावर्ती वर्तमान डिफ़ॉल्ट दो-प्रधान रणनीति है, लेकिन कुछ खोज के बाद मुझे अंततः "समाधान" मर्ज रणनीति के बारे में कुछ जानकारी मिली।

Git ( Amazon ) के साथ O'Reilly पुस्तक संस्करण नियंत्रण से लिया गया (विरोधाभासी):

मूल रूप से, "समाधान" जीआईटी विलय के लिए डिफ़ॉल्ट रणनीति थी।

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

मैंने "रिज़ॉल्यूशन" का उपयोग करके पेड़ों को सफलतापूर्वक मर्ज कर दिया है जो डिफ़ॉल्ट पुनरावर्ती रणनीति के साथ विफल हो गया। मुझे fatal: git write-tree failed to write a treeत्रुटियां मिल रही थीं, और इस ब्लॉग पोस्ट ( दर्पण ) के लिए धन्यवाद मैंने "-s सॉल्यूशन" की कोशिश की, जिसने काम किया। मुझे अभी भी बिल्कुल यकीन नहीं है कि क्यों ... लेकिन मुझे लगता है कि ऐसा इसलिए था क्योंकि मैंने दोनों पेड़ों में डुप्लिकेट परिवर्तन किए थे, और उन्हें ठीक से "छोड़" दिया था।


मैं 3-तरफ़ा मर्ज (p4merge) का उपयोग कर रहा हूं और मेरे पास बार-बार लिखी गई सूचनाएँ थीं। पुनरावर्ती-मर्ज विफल होने पर फ़ाइल। समाधान-रणनीति में वापस आने से इस मामले में मदद मिली।
mrzl


-2

जैसा कि ऊपर दिए गए उत्तर सभी रणनीति विवरण नहीं दिखा रहे हैं। उदाहरण के लिए, कुछ जवाब आयात के बारे में विवरण याद आ रही है resolveविकल्प और recursiveजो कई उप विकल्प है के रूप में ours, theirs, patience, renormalize, आदि

इसलिए, मैं आधिकारिक gitदस्तावेज़ीकरण पर जाने की सलाह दूंगा, जो सभी संभावित विशेषताओं को बताता है:

https://git-scm.com/docs/merge-strategies

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