एसवीएन मर्ज के बारे में इतना मुश्किल क्या है?


28

संभव डुप्लिकेट:
मैं एक तोड़फोड़ वाला गीक हूं, मुझे मर्क्यूरियल या गिट या किसी अन्य डीवीसीएस पर विचार क्यों करना चाहिए या नहीं करना चाहिए?

हर बार एक समय में, आप किसी को यह कहते हुए सुनते हैं कि वितरित संस्करण नियंत्रण (Git, HG) केंद्रीयकृत संस्करण नियंत्रण (SVN) की तुलना में स्वाभाविक रूप से बेहतर है, क्योंकि SVN में विलय कठिन और दर्दनाक है। बात यह है कि मैं SVN में मर्ज करने में कोई परेशानी नहीं हुई कभी नहीं किया है, और जब से तुम ही कभी उस दावे को सुनने के DVCS अधिवक्ताओं द्वारा, इसके बारे में मुझे याद दिलाने जाता है वास्तविक SVN उपयोगकर्ताओं द्वारा नहीं किया जा रहा है, और टीवी पर उन अप्रिय विज्ञापनों में , जहां वे आपको कुछ ऐसा बेचने की कोशिश करें जिसकी आपको ज़रूरत नहीं है, बम्बलिंग करने वाले अभिनेताओं को यह दिखावा करने की ज़रूरत है कि आपके पास पहले से मौजूद चीज़ और ठीक काम करने के लिए अविश्वसनीय रूप से उपयोग करना मुश्किल है।

और उपयोग का मामला जो हमेशा लाया जाता है, एक शाखा को फिर से विलय कर रहा है, जो फिर से मुझे उन स्ट्रोमैन उत्पाद विज्ञापनों की याद दिलाता है; यदि आप जानते हैं कि आप क्या कर रहे हैं, तो आपको पहली बार में एक शाखा को फिर से मर्ज नहीं करना चाहिए (और कभी नहीं करना चाहिए)। (निश्चित रूप से यह करना मुश्किल है जब आप कुछ मौलिक रूप से गलत और मूर्खतापूर्ण कर रहे हैं!)

तो, हास्यास्पद स्ट्रोमैन उपयोग के मामले में छूट देना, एसवीएन विलय में ऐसा क्या है जो डीवीसीएस प्रणाली में विलय की तुलना में स्वाभाविक रूप से अधिक कठिन है?


6
मैं अभी तक एक ऐसे वातावरण में काम नहीं कर रहा हूँ जहाँ उनकी महीनों लंबी शाखाएँ विलय हो रही हैं और वे वितरित संस्करण नियंत्रण का उपयोग करते हैं। मैंने जिन स्थानों पर काम किया है, केवल वही लंबे समय तक रहने वाली शाखाएँ हैं जिनका उपयोग टीएफएस / सबवर्सन में किया जाता है। मुझे उम्मीद है कि इस तरह की लंबी शाखाओं को डीवीसीएस के साथ भी विलय करना मुश्किल होगा।
ऊद

13
@MasonWheeler मैं हैरान हूँ। क्या आप के लिए एक VCS का उपयोग करते हैं? मैंने देखा है और पढ़ा है कि एक (कई में से) अनुशंसित प्रथाओं में सुविधा शाखाएं हैं। उस स्थिति में वापस ट्रंक में विलय अनिवार्य है। या मैंने कुछ गलत समझा? (हाँ, पेड़ का रूपक टूट जाता है, लेकिन यह IMO के साथ शुरू करने के लिए उपयोगी नहीं था)
एंड्रेस एफ।

9
@MasonWheeler: मुझे लगता है कि आप पेड़ की उपमा को थोड़ा बहुत शाब्दिक रूप से ले रहे हैं।
whatsisname


8
@MasonWheeler यदि आपके पास ट्रंक में वापस विलय के बारे में कभी नहीं सुना है, तो आप कितने अलग-अलग विकास वातावरण का अनुभव करते हैं? कुछ दुकानों में स्थिर ट्रंक और प्रयोगात्मक शाखाएं होती हैं, ऐसे में चेरी को सफल करतबों को वापस स्थिर करना एक नियमित घटना है।
इसका शानदार

जवाबों:


25

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

मैं svn का बहुत बारीकी से पालन नहीं करता हूं, लेकिन मेरी समझ उन विशेष तकनीकी मुद्दों को हाल के संस्करणों में तय की गई है। हालाँकि, यह मिथक को दूर करने के लिए पर्याप्त रूप से तय नहीं किया गया था, और विलय के लिए DVCS की कोशिश करने वाले लोग अन्य कारणों से इसके साथ फंस गए हैं।


47

यदि आप जानते हैं कि आप क्या कर रहे हैं, तो आपको पहली बार में एक शाखा को फिर से मर्ज नहीं करना चाहिए (और कभी नहीं करना चाहिए)। (निश्चित रूप से यह करना मुश्किल है जब आप कुछ मौलिक रूप से गलत और मूर्खतापूर्ण कर रहे हैं!)

और इसमें आपकी भ्रम की स्थिति और सामान्य रूप से पूरी समस्या निहित है।

आप कहते हैं कि शाखाओं का विलय "मौलिक रूप से गलत और मूर्खतापूर्ण है"। ठीक है, यह बिल्कुल समस्या है: आप शाखाओं के बारे में सोच रहे हैं जो कि विलय नहीं होना चाहिए । क्यूं कर? क्योंकि आप एक SVN उपयोगकर्ता हैं जो यह जानते हैं कि शाखाओं का विलय कठिन है । इसलिए, आप इसे कभी नहीं करते हैं, और आप दूसरों को ऐसा न करने के लिए प्रोत्साहित करते हैं। आपको विलय से बचने के लिए प्रशिक्षित किया गया है ; आपने ऐसी तकनीकें विकसित की हैं जिनका उपयोग आप विलय से बचने के लिए करते हैं ।

मैं एक Mercurial उपयोगकर्ता हूं। यहां तक ​​कि अपनी परियोजनाओं पर, जहां मैं एकमात्र डेवलपर हूं, मैं हर समय शाखाओं का विलय करता हूं । मेरी एक रिलीज़ ब्रांच है, जिसे मैंने ठीक कर दिया है। खैर, मैं इसे वापस मेन-लाइन में मर्ज कर देता हूं ताकि फिक्स वहां चला जाए।

यदि मैं एसवीएन का उपयोग कर रहा था, तो मैं कोडबेस की पूरी तरह से अलग संरचना को अपनाऊंगा। क्यूं कर? क्योंकि SVN मर्ज को कठिन बनाता है, और इसलिए आप जटिल मर्ज करने से बचने के लिए मुहावरों और तकनीकों का विकास करते हैं ।

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

सरल तथ्य यह है: आपको एसवीएन की तुलना में एक अलग तरीके से एक डीवीसीएस से संपर्क करना चाहिए। आपको इन विभिन्न प्रकार के संस्करण नियंत्रण प्रणालियों के लिए उचित मुहावरों का उपयोग करना चाहिए। SVN में, आप उन मुहावरों को अपनाते हैं जिनमें विलय शामिल नहीं होता क्योंकि विलय कठिन होते हैं। डीवीसीएस में, आप मुहावरों को अपनाते हैं जो अक्सर विलय का उपयोग करते हैं क्योंकि वे कोई बड़ी बात नहीं हैं।

सही काम के लिए सही उपकरण।

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

वास्तव में, जोएल मुझे समझाता है कि यह बहुत बेहतर है । आपको उसके बारे में अच्छा पढ़ना चाहिए।


15
@ मेसन: यह कैसे प्रशिक्षण नहीं है? आपको SVN शैली में SVN का उपयोग करने के लिए प्रशिक्षित किया गया था। और एसवीएन शैली विलय का उपयोग नहीं करने के लिए है। इस प्रकार, आपको चीजों का उपयोग नहीं करने या विलय करने पर विचार करने के लिए प्रशिक्षित किया गया था । इसलिए यह आपके साथ कभी नहीं हुआ; क्योंकि आपने एक ऐसी प्रणाली का उपयोग किया है जो इसे कठिन बनाता है।
निकोल बोलस

5
"प्रशिक्षित नहीं" और "प्रशिक्षित न होने" के बीच एक बड़ा अंतर है।
मेसन व्हीलर

8
@MasonWheeler: नहीं, वहाँ नहीं है। अगर आपको सही तरीके से कुछ करने का तरीका नहीं सिखाया जाता है, तो आपको ऐसा न करने के लिए प्रशिक्षित किया जाता है। यह मुहावरों के आपके प्रदर्शनों की सूची में नहीं है जिसे आप किसी समस्या को हल करने के लिए नियोजित कर सकते हैं। इसलिए, आप इसका उपयोग समस्याओं को हल करने के लिए नहीं कर सकते । प्रभाव विलय नहीं होने के कारण से अलग नहीं है, क्योंकि यदि आप चाहते थे, तो भी आप यह नहीं जानते कि कैसे। जिस तरह से आप "एक ही थके हुए पुराने मैदान" के रूप में एक अच्छे तर्क को खारिज करते हैं, वह इस बात का सबूत है। आप एक उपकरण के रूप में विलय के बारे में नहीं सोचते हैं; आप इसे अपवाद या कुछ असामान्य के रूप में सोचते हैं। उपयोग की बजाय कुछ पूछताछ की जाए ।
निकोल बोलस

9
@MasonWheeler: "आप इसे गलत कर रहे हैं " यह तय करने वाले आप कौन हैं ? आप DVCS का उपयोग नहीं करते हैं, इसलिए आपको DVCS वर्कफ़्लो के साथ कोई अनुभव नहीं है। आपको पता नहीं है कि यह प्रोग्रामर के लिए सहायक है या नहीं, क्योंकि आपके पास इसका कोई अनुभव नहीं है। तो आपको क्या अधिकार है कि यह कहना कि यह "गलत" है क्योंकि एसवीएन इसकी अनुमति नहीं देता है? यह कहना पसंद है कि वर्ग, आभासी फ़ंक्शन और टेम्पलेट गलत हैं, क्योंकि C उनके पास नहीं है।
निकोल बोलस

3
@MasonWheeler: इस तरह? : पी । एसवीएन ब्रांचिंग और विलय एक ही काम करता है - रूपक पहले से ही टूट गया है। मैं वास्तव में यह नहीं देखता कि ऐसा कुछ कैसे समझ में आता है, खासकर अगर इसमें कुछ समझदार कमेंट शामिल हों ..
naught101

21

एसवीएन विलय के बारे में बहुत मुश्किल कुछ भी नहीं है ... अब ... यदि आप सही दर्शन का पालन करते हैं

मैं ज्यादातर अन्य उत्तरों में जो दिखता है, वह उन लोगों से आता है जिन्होंने कुछ समय में एसवीएन का इस्तेमाल नहीं किया है। जैसा कि किसी ने सटीक उल्लेख किया है: "यह मिथक को दूर करने के लिए पर्याप्त रूप से जल्दी तय नहीं किया गया था"।

हाल ही में विरासत में मिली विरासत परियोजना पर एसवीएन 1.6 से 1.8 का उपयोग करने के अपने वर्तमान अनुभव से, एसवीएन विलय करने की दिशा में बहुत आसान रास्ता तय कर चुका है। हालांकि, यह मूर्खतापूर्ण नहीं है, और मुझे लगता है कि यह आसानी से उपयोगकर्ताओं को इच्छित उपयोग से विचलित नहीं करता है।

जबकि मैं एसवीएन को अच्छी तरह से जानता था और इस बीच व्यक्तिगत परियोजनाओं के लिए मर्क्यूरियल की भी कोशिश कर चुका था, मैंने इस परियोजना से पहले एसवीएन में बहुत अधिक शाखाएँ कभी नहीं की थीं। काफी परीक्षण और त्रुटि हुई और जब मैंने शुरू किया तो मुझे बहुत सारे अप्रत्याशित मर्ज का सामना करना पड़ा ।

अंततः, हालांकि, मुझे एहसास हुआ कि हर बार मुझे एक (या कुछ अन्य मुद्दा) मिला, यह इसलिए था क्योंकि मैंने चीजों को ठीक से नहीं किया था (उर्फ "एसवीएन तरीका" - यकीनन, उचित संस्करण नियंत्रण तरीका)। मेरा मानना ​​है कि यह वह जगह है जहाँ कठिनाई निहित है: आप जो कुछ भी असंगठित तरीके से चाहते हैं वह नहीं कर सकते हैं और एसवीएन से पूरी तरह से काम करने की अपेक्षा करते हैं, खासकर विलय के बाद। मर्जों को अपनी वास्तविक शक्ति दिखाने से पहले उपयोगकर्ता (ओं) से कठोर अनुशासन की आवश्यकता होती है।

यहाँ चीजें हैं जो मैंने देखा है मजबूत सिफारिशें हैं, यदि आवश्यकता नहीं है, तो मर्ज के स्वच्छ उपयोग के लिए:

  • SVN के हाल के संस्करण का उपयोग करें (1.6 और मेरी राय में)। अधिक से अधिक स्वचालन और जांच आपके लिए की जाती है।
  • डिफ़ॉल्ट "ट्रंक, शाखाओं, टैग" संरचना का उपयोग करें और इसके दर्शन को लागू करें (टैग के लिए प्रतिबद्ध नहीं)। SVN आपके लिए कुछ भी जाँच नहीं करेगा। यदि आप एक शाखा के रूप में एक टैग का उपयोग करते हैं (यह वह स्थिति है जिसे मैंने उस परियोजना भंडार में पाया है), यह अभी भी काम कर सकता है, लेकिन आपको लगातार बने रहने की आवश्यकता है।
  • जानिए कौन सी शाखाएं हैं और इन्हें कब बनाना है। टैग के साथ भी।
  • साइड शाखाओं को उनके स्रोत शाखा (आमतौर पर ट्रंक, लेकिन आप किसी भी शाखा से तकनीकी रूप से बाहर शाखा कर सकते हैं) के साथ अद्यतित रखें। यह अनिवार्य है यदि आप चाहते हैं कि एसवीएन ऑटो-मर्ज करें। एसवीएन 1.8 वास्तव में आपको ऑटो-मर्जिंग से बचाता है अगर चीजें अप-टू-डेट नहीं हैं, और यह भी कि यदि आपके पास अपनी कार्य प्रतिलिपि में लंबित संशोधन हैं (यह व्यवहार 1.8.5 में फिर से गायब हो गया लगता है)।
  • "उचित" करें। उन्हें केवल बहुत विशिष्ट अवधारणा पर ही संशोधन करना चाहिए। जितना संभव हो सके, उनमें थोड़ी मात्रा में परिवर्तन होना चाहिए। आप उदाहरण के लिए दो स्वतंत्र बगों के बारे में एक भी प्रतिबद्ध होना नहीं चाहते हैं। आप पहले से ही दोनों तय कर दी है और वे एक ही फाइल में हैं, तो आप एक बग के परिवर्तन दूर संगृहीत करेगा इसलिए आपको प्रतिबद्ध कर सकते हैं चाहिए सिर्फ दूसरे के परिवर्तन पहले, तो परिवर्तन के दूसरे सेट करते हैं। ध्यान दें कि TortoiseSVN इसे "कमिट के बाद पुनर्स्थापित करें" के माध्यम से आसानी से अनुमति देता है।
    • ऐसा करने से परिवर्तनों के एक विशिष्ट स्वतंत्र सेट को वापस करना संभव हो जाता है और यह केवल इस तरह के सेट को किसी अन्य शाखा में विलय करना संभव बनाता है। हां, एसवीएन आपको चेरी-चुने हुए संशोधनों को मर्ज करने की अनुमति देता है।
  • यदि आप कभी उप-शाखाओं का उपयोग करते हैं (ट्रंक को बंद करना, तो उस नई शाखा को शाखा देना), पदानुक्रम का सम्मान करें। यदि आप ट्रंक या इसके विपरीत के साथ उप-शाखा को अपडेट करते हैं, तो आप कुछ दर्द में हैं। मर्ज को पदानुक्रम के नीचे या ऊपर कैस्केड किया जाना चाहिए।
    • कुछ महीनों के प्रयोग के बाद, मैं यह प्रतिज्ञा कर सकता हूं कि यह सबसे महत्वपूर्ण हिस्सा हो सकता है। एक ही ट्रंक से दो उप-शाखाएँ बनाने की कोशिश की और फिर उप-शाखाओं के बीच या कभी-कभी दोनों तरफ से उप-शाखाओं के बीच बिट्स का विलय किया। यह SVN (या उपयोगकर्ता) पर जा सकता है। यदि आप विशिष्ट संशोधन मर्ज कर रहे हैं तो यह ठीक काम कर सकता है। ऑटो-मर्ज से परेशानी हो सकती है।
    • ट्रंक के साथ उप-शाखा ए को सिंक्रनाइज़ करते समय मुझे विशेष रूप से परेशानी हुई है, और फिर उप-शाखा ए से उप-शाखा बी में कुछ विलय करने की कोशिश कर रहा है। एसवीएन को लगता है कि "ट्रंक से सिंक्रनाइज़ करें" संशोधन को वैध रूप से उप-शाखा में विलय किया जाना चाहिए। B और इससे टकराव की स्थिति पैदा होती है।
  • जितना संभव हो, शाखा की जड़ से विलय करें। अन्यथा, SVN केवल मर्ज के उप-फ़ोल्डर के लिए किया पर नज़र रखेंगे और जब आप कर जड़ से ऑटो-मर्ज करने के लिए कोशिश, आप मर्ज ना किए गए संशोधन के लापता के बारे में चेतावनी मिल सकता है। इसे केवल जड़ से मर्ज करके इसे ठीक किया जा सकता है, लेकिन भ्रम से सबसे अच्छा बचें।
  • सावधान रहें कि आप किस शाखा के लिए प्रतिबद्ध हैं। यदि आप समय के माध्यम से विभिन्न शाखाओं के लिए अपने काम की प्रतिलिपि बिंदु के लिए स्विच का उपयोग करते हैं, तो सुनिश्चित करें कि आप कहाँ कर रहे हैं।
    • यह विशेष रूप से बुरा है यदि आप वास्तव में उस शाखा में बदलाव नहीं चाहते हैं । मैं अभी भी उस पर स्पष्ट नहीं हूं, लेकिन इस पर निर्भर करता है कि आप इसे कैसे हटाते हैं / इसे सही शाखा में स्थानांतरित करते हैं (पुन: विलय, विलय), आप कुछ गड़बड़ कर सकते हैं। यह ठीक करने योग्य है, लेकिन संभावित संघर्षों से बचने या तुरंत हल करने के लिए आपको संशोधन द्वारा संशोधन को या तो विलय करना होगा, या ऑटो-मर्ज के बाद आपको संभवतः अधिक जटिल संघर्ष को ठीक करना होगा।
  • शाखाओं को बहुत लंबे समय तक अछूता न रखें। वास्तव में, यह समय की बात नहीं है, लेकिन शाखा और ट्रंक के लिए कितने संशोधन किए गए और इनमें कितना बदलाव आया। दो शाखाओं के बीच विलय, 3-तरफा विलय, हमेशा शाखाओं के बीच सबसे हालिया आम संशोधन की तुलना में मिलता है। बीच में जितने अधिक परिवर्तन होंगे, स्वचालित परिवर्तन उतना ही अधिक विफल हो जाएगा। यह, निश्चित रूप से, बहुत बुरा है यदि आपने इस बीच अपने कोड की संरचना को बदल दिया है (स्थानांतरित या नामांकित फ़ाइलें)।

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

ओह, विलय के बारे में एक और बात, जहाँ मैंने पढ़ा है और आजमाया है, एसवीएन वास्तव में बेकार है: हटाए गए / स्थानांतरित / नामांकित फ़ाइलें / फ़ोल्डर। जाहिरा तौर पर , SVN अभी भी एक फ़ाइल का नाम बदलने, हटाने या एक शाखा में स्थानांतरित करने और इसके मूल संस्करण को किसी अन्य शाखा में संशोधित करने ... और फिर इन्हें एक साथ मर्ज करने से नहीं निपट सकता है। यह सिर्फ पता नहीं चलेगा कि फ़ाइल एक तरह से कहाँ चली गई, और दूसरे तरीके से परिवर्तनों को "भूल" जाएगी। एक परिवर्तन स्पष्ट रूप से अस्वीकार्य है (आप या तो फ़ाइल को हटा दें या बदल दें, दोनों नहीं कर सकते हैं), लेकिन स्थानांतरित / नामांकित फ़ाइलों में परिवर्तन लागू करना चाहिए और काम नहीं करना चाहिए । उम्मीद है कि यह जल्द ही ठीक हो जाएगा।

तो, सभी में, एसवीएन विलय आसान है? मुझे नहीं लगता। निश्चित रूप से लापरवाह तरीके से नहीं। क्या यह बुरा है ? मुझे ऐसा नहीं लगता। यह केवल आपके चेहरे पर वापस थूकता है जब आप इसे गलत तरीके से उपयोग करते हैं और आप जो कर रहे हैं उसके बारे में पर्याप्त नहीं सोचते हैं।

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


पेड़ संघर्ष - हाँ, एसवीएन को इनसे कठिनाई होती है, हालांकि टीबीएच ऐसा हर दूसरे एससीएम करता है। Git के पास कुछ प्रयास करने और यह पता लगाने की कोशिश है कि जिन फ़ाइलों का नाम बदला गया है या स्थानांतरित किया गया है, वही हैं, लेकिन यह हमेशा नहीं मिलता है (नहीं!)। मुझे लगता है कि एसवीएन को इन संघर्षों को समझने में आसान बनाने के लिए कुछ प्रयास करने चाहिए।
gbjbaanb

@gbjbaanb: यह "रिपेयर मूव" की पेशकश करता है जैसा कि मर्क्यूरियल करता है, हालांकि यह हेयुरिस्टिक्स की पेशकश नहीं करता है। आपको यह बताने की आवश्यकता है कि कौन सी हटाए गए और जोड़े गए फ़ाइलें हैं, वास्तव में, वही। निश्चित तौर पर सुधार की गुंजाइश है।
leokhorn

यह सब बहुत अच्छा लगता है जब आप प्रोजेक्ट पर काम करने वाले एकमात्र व्यक्ति होते हैं ... लेकिन अगर आपके पास एक अच्छे आकार की टीम है और वे सभी इसे "एसवीएन तरीके" का उपयोग कर रहे हैं (जो कि वास्तव में कोई भी इस बात से सहमत नहीं है कि क्या है) विलय अभी भी एक PITA हैं। तथ्य यह है कि svn वास्तव में अच्छी तरह से ब्रंचिंग वर्कफ़्लो का समर्थन नहीं करता है। "एसवीएन तरीका" यह भी होगा कि शाखाएं न बनाएं और एक झरना एसडीएलसी का उपयोग करें। यह सब कहा जा रहा है, मेरे पास बड़ी परियोजनाओं पर अतीत में कई लोगों के साथ काम करने वाले लोगों के साथ Git विलय के मुद्दे हैं। लेकिन, वे अभी भी बहुत कम दर्दनाक लग रहे थे।
ryoung

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

5

आंतरिक डेटा मॉडल मौलिक रूप से भिन्न होते हैं।

एसवीएन में मौलिक रूप से, जब आप किसी शाखा के इतिहास को देखते हैं, तो आप केवल यह देखते हैं कि उस शाखा में क्या हुआ है। इसलिए जब आप शाखा से शाखा में विलीन हो जाते हैं , तो Bशाखा Aके इतिहास Aमें एक बड़ी प्रतिबद्धता होगी जिसमें स्पष्ट रूप से किए गए सभी परिवर्तनों को शामिल किया जाएगा B

एसवीएन के पहले संस्करणों में, यदि आपको शाखा Bको Aएक बार फिर शाखा में विलय करना था, तो आपको मैन्युअल रूप से निर्दिष्ट करना होगा कि किस शाखा की पुनरीक्षण सीमा Bआप दो बार एक ही संशोधन को मर्ज करने से बचने के लिए विलय करना चाहते थे। चतुर डेवलपर निश्चित रूप से 'बी में मर्ज: 1234' जैसे एक प्रतिबद्ध संदेश का उपयोग करेगा।

एसवीएन 1.5 "यह" तय किया गया। लेकिन यह नहीं बदला कि मूल रूप से विलय कैसे लागू होते हैं। इसने केवल शाखा में कुछ अतिरिक्त मेटाडेटा जोड़ा A, जिससे SVN को पता चला कि 1234 में संशोधन किया गया था, जिससे SVN स्वचालित रूप से सही संशोधन सीमा का चयन कर सकता है।

लेकिन यह समाधान मूल रूप से एक डेटा मॉडल के लिए एक समाधान है जो मौलिक रूप से ट्रैक का समर्थन नहीं करता है जिसे विलय कर दिया गया है।

दो शाखाओं को मिलाना एक अपेक्षाकृत सरल उदाहरण है। लेकिन इस अधिक जटिल परिदृश्य की इमेजिंग

  1. Aसे शाखा बनाएँ trunk, और यहाँ कुछ कमिट करें
  2. यहां Bसे ब्रांच बनाएं Aऔर कुछ कमिट करें
  3. में कुछ करता बनाने trunkऔरA
  4. मर्ज Bमेंtrunk
  5. मर्ज AमेंB
  6. मर्ज Aमेंtrunk
  7. मर्ज Bमें trunk(यह वास्तव में कुछ भी ऐसा नहीं करना चाहिए)

मेटाडेटा मॉडल का उपयोग करके इसे सही ढंग से संभालना अत्यंत जटिल हो जाता है (मुझे नहीं पता कि क्या SVN वास्तव में इस परिदृश्य को सही ढंग से संभालता है, और मुझे इसका परीक्षण करने में कोई दिक्कत नहीं है)।

इस परिदृश्य को git में संभालना बेहद सरल है।

गिट में, हर बार जब आप प्रतिबद्ध होते हैं, तो उस प्रतिबद्ध का प्रतिनिधित्व करने वाली आंतरिक वस्तु में पिछले सिर का संदर्भ होता है। जब आप किसी शाखा में विलीन होते हैं, तो इस समिति में सभी शाखाओं के पिछले प्रमुख को मिला दिया जाता है (आप एक बार में एक से अधिक शाखा को मर्ज कर सकते हैं)

इसलिए, जब आप git में किसी एकल कमिटमेंट के इतिहास की जांच करते हैं, तो आप सभी इतिहास देख सकते हैं, आप देख सकते हैं कि यह कब ब्रांच किया गया था, कब इसे मर्ज किया गया था, और आप ब्रांचिंग और मर्जिंग के बीच दोनों शाखाओं का इतिहास देख सकते हैं।

इस प्रकार जब किसी शाखा में विलय हो रहा है जो आंशिक रूप से विलय हो गया है, तो यह निर्धारित करना बेहद सरल है कि क्या पहले से ही विलय हो गया है, और क्या नहीं।

मुझे मर्क्यूरियल के साथ कोई अनुभव नहीं है, लेकिन मुझे संदेह है कि इसके आंतरिक कामकाज गिट के समान हैं।

इसलिए मूल रूप से, SVN के लिए, ब्रांचिंग को सस्ता बनाने के लिए यह एक डिज़ाइन लक्ष्य था। लेकिन गिट में, विलय को सस्ता बनाना एक डिजाइन लक्ष्य था।

पिछली बार, पिछली बार जब मैंने एसवीएन का उपयोग किया था, तो यह मर्ज को संभालने में सक्षम नहीं था, जहां एक शाखा में एक फ़ाइल का नाम बदला गया था, और दूसरे में संशोधित किया गया था।


1

मैंने लंबे समय से चल रहे विकास और रिलीज शाखाओं सहित - SVN विलय का एक अच्छा सा काम किया है। तब तक और मैं बच गया। मर्ज करना हमेशा मुश्किल होता है, लेकिन DCVS के साथ नकारात्मक रूप से बुरा नहीं है - सब कुछ स्थानीय है इसलिए एक ज्ञात अच्छे संशोधन के लिए अपडेट करें और चलते रहें। जबकि सर्वर की तरफ SVN अलॉट हुआ था, इसलिए रिकवरी बदसूरत थी - आमतौर पर इसमें स्थानीय कॉपी को मिटा देना और फिर इसे आज़माने के लिए एक नई साफ शाखा की जाँच करना शामिल था। मेरे मामले में बुरा नहीं था - एसवीएन बॉक्स में एक गीगाबिट कनेक्शन मदद करता है। लेकिन हमारे कुछ ठेकेदार थे जिन्हें इससे बहुत परेशानी थी क्योंकि वे धीमे कनेक्शन पर थे इसलिए कुछ भी हमेशा के लिए ले लिया, जिसमें मर्ज भी शामिल था।


धीमे कनेक्शन की चीज पर एक्सट्रपलेशन करना, ऑफसाइट रिमोट सर्वर से काम करना बड़े अपडेट्स करते समय घटिया कनेक्शन कनेक्शन त्रुटियों के लिए भी बनाता है> <बिल्कुल भी मज़ेदार नहीं।
jxramos 22

-1

हां, मैं भी ऐसा करता हूं। वर्तमान में मेरे पास उस परियोजना के विभिन्न संस्करणों (शाखाओं) के लिए 12 वीएम हैं जो मैं काम का हिस्सा हूं। जब मुझे पुराने संस्करण में बग को ठीक करना होता है, तो मैं बग को ठीक करता हूं, फिर मर्ज करें जो नए संस्करणों के लिए शाखाओं में प्रतिबद्ध हैं। लेकिन अब वह एक पूरी शाखा का पुन: विलय कर रहा है, जो कि मैं यहां बता रहा हूं।

यहाँ एक बहुत अच्छी बात है। यह DVCS के बारे में विरासत में नहीं है, यह सिर्फ कुछ git excels है। आप किसी भी शाखा से विशिष्ट संशोधन को दूसरी शाखा में विलय कर सकते हैं । यह मूल रूप से केवल अंतर लेता है और इसे दूसरी शाखा पर लागू करता है, लेकिन ट्रैकिंग करता है और बहुत अधिक स्वचालित है।

इसलिए, यदि आपके पास शाखा 2.0 और शाखा 3.0 हैं और 2.0 में एक बग की खोज करते हैं, तो आप इसे 2.0 में ठीक कर सकते हैं और संशोधन का सेट ले सकते हैं जो इसे हल करते हैं और केवल उन संशोधनों को 3.0 शाखा में विलय कर देते हैं। मेरा मानना ​​है कि एसवीएन के पास मैन्युअल रूप से प्रत्येक संशोधन के लिए अलग-अलग लेने और उन्हें लागू करने के अलावा कोई अन्य तरीका नहीं है

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


इसके अलावा, मुझे लगता है कि मर्क्यूरियल की कार्यक्षमता समान है
अर्लज़

2
वास्तव में, आप एसवीएन में ठीक वही काम कर सकते हैं। मुझे हर व़क्त यह करना है। एसवीएन मर्ज कमांड एक अलग शाखा से एक संशोधन (या संशोधन की सीमा) खींच सकता है और इसे आपकी कार्यशील प्रति पर लागू कर सकता है, और फिर आप इसे कर सकते हैं।
मैसन व्हीलर

2
@MasonWheeler ध्यान रखें कि 1.5 से पहले के संस्करणों के लिए बहुत अधिक एंटी-एसवीएन भावना को निर्देशित किया गया था (जब svn को मर्ज ट्रैकिंग मिला था)। और निश्चित रूप से इसके बारे में बहुत कुछ केवल व्यर्थ कट्टरता है ...
यानिकी

3
@MasonWheeler भी stackoverflow.com/a/4215199/69742 देखें कि DVCS के बाद का फोड़ा परिवर्तन-सेट नहीं संस्करणों का ट्रैक रखता है । परिवर्तन-सेट स्वाभाविक रूप से लेना और विलय करना आसान है ... संस्करण इसलिए नहीं हैं क्योंकि उन्हें संदर्भ की आवश्यकता होती है
अर्लज़

@MasonWheeler ओह और यह एक: stackoverflow.com/questions/2471606/…
अर्लज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.