मेरी समझ से एसवीएन 'शाखा में आसान है। मर्ज करना मुश्किल ’। ऐसा क्यों है? वहाँ एक अंतर है कि वे कैसे विलय करते हैं?
मेरी समझ से एसवीएन 'शाखा में आसान है। मर्ज करना मुश्किल ’। ऐसा क्यों है? वहाँ एक अंतर है कि वे कैसे विलय करते हैं?
जवाबों:
कृपया एक बहुत ही ठोस स्थिति के लिए मेरा स्टैक ओवरफ्लो उत्तर देखें जहां मर्क्यूरियल (और गिट) बिना समस्याओं के विलीन हो जाता है और जहां तोड़फोड़ आपको एक संगीन संघर्ष के साथ प्रस्तुत करता है। स्थिति उस शाखा पर की गई एक सरल रीफैक्टरिंग है जहां आप कुछ फ़ाइलों का नाम बदलते हैं।
Tdammers जवाब देने के संबंध में, फिर वहाँ गलतफहमी की संख्या है:
सबवर्सन, मर्क्यूरियल, और Git प्रोजेक्ट के सभी रिपॉजिटरी-वाइड स्नैपशॉट ट्रैक करता है। उन्हें संस्करण , संशोधन , या परिवर्तन कॉल करने से कोई फर्क नहीं पड़ता। वे सभी तार्किक रूप से एक फाइल के सेट के परमाणु स्नैपशॉट हैं।
जब विलय की बात आती है तो आपके कमिट्स के आकार पर कोई फर्क नहीं पड़ता है । सभी तीन प्रणालियाँ मानक थ्री-वे मर्ज एल्गोरिथम के साथ विलय करती हैं और उस एल्गोरिथ्म के इनपुट हैं
इससे कोई फर्क नहीं पड़ता कि दो शाखा संस्करण कैसे बनाए गए थे। आपने पूर्वज संस्करण के बाद से 1000 छोटे कमिट्स का उपयोग किया है, या आपने 1 कमिट का उपयोग किया है। वह सब मामला फाइलों का अंतिम संस्करण है। (हां, यह आश्चर्य की बात है! हां, बहुत सारे डीवीसीएस गाइडों को यह बुरी तरह से गलत लगता है।)
वह मतभेदों के बारे में कुछ अच्छे बिंदु भी उठाता है:
तोड़फोड़ में कुछ "वूडू" हैं जहां से आप मर्ज कर सकते हैं /trunk
, कह सकते हैं /branches/foo
। मर्क्यूरियल और गिट इस मॉडल का उपयोग नहीं करते हैं - शाखाओं को इतिहास में सीधे मॉडल किया जाता है। इसलिए इतिहास रेखीय होने के बजाय एक निर्देशित चक्रीय ग्राफ बन जाता है । यह सबवर्सन द्वारा उपयोग किए जाने वाले मॉडल की तुलना में बहुत सरल मॉडल है और यह कई कोने के मामलों को काट देता है।
आप आसानी से एक मर्ज में देरी कर सकते हैं या किसी और को इसे संभालने दे सकते हैं। यदि hg merge
आप एक टन संघर्ष करते हैं, तो आप अपने सहकर्मी से आपसे पूछ सकते हैं hg pull
और फिर उसके पास वही स्थिति है। तो वह कर सकता है hg merge
और शायद वह संघर्षों को सुलझाने में आपसे बेहतर है।
यह तोड़फोड़ के साथ बहुत मुश्किल है, जहां आपको अपडेट करने से पहले आवश्यक है । आप सर्वर पर होने वाले परिवर्तनों को अनदेखा नहीं कर सकते हैं और अपनी अनाम शाखा पर प्रतिबद्ध रह सकते हैं। सामान्य तौर पर, तोड़फोड़ आपको जब आप एक गंदा काम की नकल के साथ खेलने के लिए मजबूर करता है svn update
। यह उस तरह का जोखिम भरा है जब से आपने अपने परिवर्तनों को कहीं भी सुरक्षित नहीं रखा है। Git और Mercurial आपको पहले प्रतिबद्ध करने देता है, और फिर आवश्यक रूप से अपडेट और मर्ज करता है।
वास्तविक कारण Git और Mercurial विलय से बेहतर है जो कि तोड़फोड़ कार्यान्वयन का विषय है। नाम बदलने के विवाद हैं कि तोड़फोड़ बस यह भी नहीं सोच सकती कि यह स्पष्ट है कि सही उत्तर क्या है। मर्क्यूरियल और गिट आसानी से संभालते हैं। लेकिन वहाँ कोई कारण नहीं है कि तोड़फोड़ के रूप में अच्छी तरह से उन लोगों को संभाल नहीं सकता - केंद्रीकृत किया जा रहा है निश्चित रूप से कारण नहीं है।
trunk
एसवीएन में काम कर रहे हों । डीवीसीएस के साथ आप साझा किए बिना कर सकते हैं, लेकिन एसवीएन में आपके svn commit
सीधे उसी शाखा पर काम करने वाले अन्य लोगों को प्रभावित करेगा। यहां तक कि अगर हम दोनों एसवीएन में एक शाखा पर काम करते हैं, तो मैं आपके काम को तुरंत आपके काम के साथ विलय किए बिना अपना काम नहीं कर सकता। यह कुछ हद तक डरावना बनाता है - जो एक संस्करण नियंत्रण प्रणाली के लिए एक डरावनी संपत्ति है! :-)
मुख्य समस्या यह है कि ये सिस्टम किस प्रकार एक संस्करणित निर्देशिका संरचना का प्रतिनिधित्व करते हैं।
तोड़फोड़ की मूल अवधारणा जिसके चारों ओर पूरी प्रणाली घूमती है, वह एक संस्करण (या, svn लिंगो, "संशोधन") में है: एक निश्चित बिंदु पर एक फ़ाइल का एक स्नैपशॉट। जब तक इतिहास पूरी तरह से रैखिक है, तब तक सब ठीक है, लेकिन अगर आपको विकास की दो स्वतंत्र रेखाओं से परिवर्तनों को मर्ज करने की आवश्यकता है, तो svn को दोनों के वर्तमान संस्करणों की तुलना करना होगा, और फिर अंतिम साझा किए गए संस्करण के बीच तीन-तरफ़ा तुलना करना होगा और दो सिर संस्करण। लाइनों में से एक में परिवर्तन दिखाई देता है, लेकिन दूसरे को नहीं, आसानी से हल किया जा सकता है; ऐसी रेखाएँ जो दोनों सिर में ठीक उसी तरह विचलन करती हैं, जैसे कठिन हैं, लेकिन आमतौर पर संभव है; अलग-अलग तरीकों से विचलित करने वाली पंक्तियां हैं जो svn कहती हैं "मैं इसका पता नहीं लगा सकता, मानव, कृपया मेरे लिए इसे हल करें।"
इसके विपरीत, संस्करणों के बजाय गिट और मर्क्यूरियल ट्रैक परिवर्तन । संपूर्ण रिपॉजिटरी एक परिवर्तनशील पेड़ है, हर एक माता-पिता पर निर्भर करता है, जहां एक माता-पिता के बदलाव में किसी भी संख्या में बच्चे हो सकते हैं और पेड़ की जड़ एक खाली निर्देशिका का प्रतिनिधित्व करती है। दूसरे शब्दों में, गिट / एचजी कहते हैं "पहले मेरे पास कुछ भी नहीं था, फिर इस पैच को लागू किया गया था, फिर उस पैच, आदि"। जब आपको विकास की दो लाइनों को मर्ज करने की आवश्यकता होती है, तो git / hg न केवल यह जानता है कि प्रत्येक सिर वर्तमान में कैसा दिखता है, और अंतिम आम संस्करण कैसा दिखता था, यह भी जानता है कि संक्रमण कैसे हुआ, जो कि अधिक चालाक विलय की अनुमति देता है।
एक अन्य चीज जो DVCS में विलय को आसान बनाती है, वह प्रतिबद्ध और धक्का की अवधारणाओं को अलग करने का एक अप्रत्यक्ष परिणाम है, और किसी भी समय एक ही भंडार के दो क्लोनों के बीच सभी प्रकार के क्रॉस-मर्ज की अनुमति देता है। Svn के साथ, लोग अक्सर असंबंधित परिवर्तनों के साथ बड़े बदलाव करने की प्रवृत्ति रखते हैं, क्योंकि एक प्रतिबद्ध केंद्रीय रिपॉजिटरी पर एक अद्यतन भी है जो अन्य सभी टीम के सदस्यों को प्रभावित करता है; यदि आप एक टूटा हुआ संस्करण बनाते हैं, तो हर कोई आपसे नाराज होने वाला है। चूँकि अधिकांश सेटअप में संजालित svn सर्वर शामिल होता है, इसलिए कमिटिंग में नेटवर्क पर डेटा को पम्प करना भी शामिल होता है, जिसका अर्थ है कि वर्कफ़्लो में काफी देरी का परिचय देता है (विशेषकर जब आपकी वर्किंग कॉपी पुरानी हो और आपको पहले खींचना पड़े)। गिट और मर्क्यूरियल के साथ, कमिट स्थानीय रूप से होता है, और क्योंकि दोनों स्थानीय फाइल सिस्टम को संभालने में बहुत कुशल होते हैं, यह आमतौर पर तुरंत खत्म हो जाता है। परिणामस्वरूप, लोग (एक बार जब वे इसके अभ्यस्त हो जाते हैं) छोटे बड़े परिवर्तन करते हैं, और तब जब यह काम करता है, एक बार में एक दर्जन या तो धक्का। फिर जब विलय का समय आता है, तो SCM के पास जाने के लिए और अधिक विस्तृत जानकारी होती है, और सुरक्षित और स्वचालित रूप से संघर्षों को हल करने के लिए एक बेहतर काम कर सकता है।
और फिर अच्छा विवरण है जो चीजों को और भी आसान बनाते हैं:
hg mv
या hg addremove --similarity...
) है, जबकि गिट हेयुरिस्टिक का उपयोग करता है, लेकिन दोनों ही नाम बदल देते हैं । मर्ज किए गए फ़ाइलों में 1 स्ट्रिंग अंतर के साथ भी मुझे पेड़ का संघर्ष मिल सकता है ! आपको कुछ तोड़फोड़ पहलुओं को फिर से सीखना होगा, क्षमा करें।
rename a b
रूप में ट्रैक copy a b; remove a
और दोनों एक परमाणु प्रतिबद्ध में करते हैं। मर्ज व्यवहार में अंतर कोने के मामलों की अलग-अलग हैंडलिंग से और उपविभाजन से मर्क्यूरियल और गिट की तुलना में अधिक मर्ज की अनुमति देता है। अंत में, Git मर्ज और लॉग टाइम में नाम का पता लगाता है - हम इसे Mercurial में भी जोड़ने की सोच रहे हैं।