विलय: एचजी / गिट बनाम एसवीएन


144

मैं अक्सर पढ़ता हूं कि एसवीएन की तुलना में एचजी (और गिट और ...) विलय के लिए बेहतर हैं लेकिन मैंने कभी भी व्यावहारिक उदाहरण नहीं देखा है कि जहां एचजी / गिट कुछ विलय कर सकते हैं जहां एसवीएन विफल रहता है (या जहां एसवीएन को मैनुअल हस्तक्षेप की आवश्यकता होती है)। क्या आप शाखा / संशोधित / प्रतिबद्ध /..- संचालन की कुछ चरण-दर-चरण सूची पोस्ट कर सकते हैं जो दिखाते हैं कि SVN विफल होगा जबकि Hg / Git खुशी से आगे बढ़ता है? व्यावहारिक, अत्यधिक असाधारण मामलों कृपया नहीं ...

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

इसलिए मैं अभी भी SVN पर Hg / Git के फायदे खोजने की कोशिश कर रहा हूं। मुझे कुछ हाथों के अनुभव प्राप्त करने में खुशी होगी, लेकिन कोई भी बड़ी परियोजना नहीं है जिसे हम अभी तक एचजी / जीआईटी में स्थानांतरित कर सकते हैं, इसलिए मैं छोटे कृत्रिम प्रोजेक्ट्स के साथ खेल रहा हूं, जिसमें केवल कुछ ही फाइलें होती हैं। और मैं कुछ मामलों की तलाश कर रहा हूं जहां आप एचजी / गिट की प्रभावशाली शक्ति महसूस कर सकते हैं, क्योंकि अब तक मैंने अक्सर उनके बारे में पढ़ा है, लेकिन खुद को खोजने में असफल रहा।


2
मुझे लगता है कि आपको सटीक डुप्लिकेट पर ध्यान देना चाहिए: stackoverflow.com/questions/43995/… stackoverflow.com/questions/459891/…
P Shved

11
मैं पहले ही पढ़ चुका था, दूसरा नया था। लेकिन वे पहले से ही 1-2 साल के हैं और ज्यादातर पहले से ही svn-1.5 मुद्दों के बारे में प्रतीत होते हैं (जहां svn का अभी तक मर्ज ट्रैकिंग नहीं हुआ है)।
स्टैमेक्स

2
बस एक टिप्पणी है कि आप एक अन्य DVCS के रूप में git / hg के साथ बाज़ार में भी गांठ लगा सकते हैं जो नीचे की समस्याओं को सही ढंग से हैंडल करेगा। और जब से आपने फायदे खोजने की कोशिश का उल्लेख किया है: git / hg / bzr का एक सरल साजो फायदा यह है कि शाखाएँ वैश्विक नहीं हैं क्योंकि वे svn के साथ हैं। आपको 67 शाखाएँ देखने की ज़रूरत नहीं है, जब केवल एक जोड़ा आप पर लागू होता है। हर कोई "निजी" शाखाओं में अपना काम करता है और फिर उत्कृष्ट मर्ज क्षमता का उपयोग करके बिना पसीना बहाए वापस जाता है कि मर्ज 99% मामलों में काम करने वाला है या नहीं।
वड्सवर्ल्ड

5
@wade: क्या आप "निजी" शाखाओं को कॉर्पोरेट वातावरण में लाभ के रूप में देखते हैं? मैं बैकअप के बारे में चिंतित हूँ। मेरे पास अक्सर ऐसी शाखाएँ होती हैं जो
पुनर्निवेश

9
@stmax: एक वैध चिंता का विषय। हालांकि, जो आप बहुत सारे कॉर्पोरेट वातावरण में तोड़फोड़ के साथ पाते हैं, वह यह है कि लोग अपने कोड के सही होने तक चेकिंग पर रहते हैं, और आपका वही प्रदर्शन होता है।
वड्सवर्ल्ड

जवाबों:


91

मैं स्वयं तोड़फोड़ का उपयोग नहीं करता हूं, लेकिन तोड़फोड़ 1.5: मर्ज ट्रैकिंग (मूलभूत) के लिए जारी किए गए नोटों से ऐसा लगता है कि गीट या मर्क्यूरियल जैसे पूर्ण- डीएजी संस्करण नियंत्रण प्रणालियों में मर्ज ट्रैकिंग कार्य कैसे होता है, से निम्न अंतर हैं ।

  • ट्रंक को शाखा में विलय करना शाखा को ट्रंक में विलय करने से अलग है: किसी कारण से ट्रंक को शाखा में विलय करने के लिए --reintegrateविकल्प की आवश्यकता होती है svn merge

    Git या Mercurial जैसी वितरित संस्करण नियंत्रण प्रणालियों में ट्रंक और शाखा के बीच कोई तकनीकी अंतर नहीं है : सभी शाखाएं समान बनाई जाती हैं ( हालांकि सामाजिक अंतर हो सकता है , हालांकि)। किसी भी दिशा में विलय उसी तरह किया जाता है।

  • आप नए उपलब्ध कराने की आवश्यकता -g( --use-merge-historyकरने के लिए) विकल्प svn logऔर svn blameखाते में मर्ज ट्रैकिंग लेने के लिए।

    Git और Mercurial मर्ज ट्रैकिंग इतिहास (लॉग) और दोष को प्रदर्शित करते समय स्वचालित रूप से ध्यान में रखा जाता है। Git में आप केवल पहले माता-पिता का अनुसरण करने का अनुरोध कर सकते हैं --first-parent(मुझे लगता है कि समान विकल्प Mercurial के लिए भी मौजूद है) में "मर्ज ट्रैकिंग" को त्याग दें git log

  • मैं svn:mergeinfoजिन चीज़ों को प्रति-पथ की जानकारी को संघर्षों के बारे में समझता हूं (सबवर्सन चेंज-आधारित है) से, जबकि Git और Mercurial में यह केवल ऐसी वस्तुएं हैं जो एक से अधिक माता-पिता हो सकती हैं।

  • तोड़फोड़ में मर्ज ट्रैकिंग के लिए "ज्ञात मुद्दे" उपधारा बताता है कि दोहराया / चक्रीय / चिंतनशील मर्ज ठीक से काम नहीं कर सकता है। इसका अर्थ है कि निम्नलिखित इतिहास के साथ दूसरा विलय सही काम नहीं कर सकता है ('ए' ट्रंक या शाखा हो सकता है, और 'बी' क्रमशः शाखा या ट्रंक हो सकता है):

    * --- * --- x --- * --- y --- * --- * * * --- M2 <- A
             \ _ /
              - * ---- M1 --- * --- * --- / <- B
    

    यदि उपरोक्त ASCII- कला टूट जाती है: शाखा 'B' को शाखा 'A' से संशोधन 'x' में बनाया जाता है, तो बाद में शाखा 'A' को संशोधन 'y' में शाखा 'B' में विलय कर दिया जाता है। मर्ज 'एम 1', और अंत में शाखा 'बी' को मर्ज 'एम' के रूप में शाखा 'ए' में मिला दिया जाता है।

    * --- * --- x --- * ----- M1 - * --- * --- M2 <- A
             \ / / 
              \ - * --- y --- * --- * --- / <- बी
    

    यदि उपरोक्त ASCII- कला टूट जाती है: शाखा 'ख' को शाखा 'ए' से संशोधन 'एक्स' में बनाया जाता है, इसे शाखा 'ए' में 'वाई' में 'एम 1' और बाद में विलय कर दिया जाता है। 'A' को 'M2' के रूप में फिर से विलय कर दिया गया।

  • तोड़फोड़ क्रिश-क्रॉस मर्ज के उन्नत मामले का समर्थन नहीं कर सकता है ।

    * --- ख ----- बी 1 - एम 1 - * --- एम 3
         \ / / /
          \ एक्स /
           \ / \ /
            \ - बी 2 - M2 - *
    

    Git इस स्थिति को "पुनरावर्ती" मर्ज रणनीति का उपयोग करके अभ्यास में ठीक करता है। मैं मर्क्यूरियल के बारे में निश्चित नहीं हूं।

  • में "ज्ञात समस्याएँ" वहाँ मर्ज ट्रैकिंग migh फ़ाइल का नाम बदलता है, जैसे के साथ काम नहीं चेतावनी जब एक तरफ (पुराने नाम के तहत) का नाम बदलने के बिना फ़ाइल (और शायद यह संशोधित), और दूसरा पक्ष संशोधित फ़ाइल का नाम बदलता है।

    Git और Mercurial दोनों ही इस तरह के मामले को व्यवहार में ठीक रखते हैं: GIT का नाम बदलकर , नाम का पता लगाने का उपयोग करके, Mercurial का नाम बदलकर ट्रैकिंग का उपयोग करें ।

HTH


किसी तरह (मार्कडाउन पार्सर में त्रुटि?) <pre>...</pre>ब्लॉक के बाद का हिस्सा इंडेंट नहीं है जैसा कि होना चाहिए ...
जैकब नारबस्की

1
कई विस्तृत उदाहरणों के लिए +1। मुझे अभी तक समझ में नहीं आया है कि प्रथम आस्की-कला में उदाहरण से समस्याएं क्यों हो सकती हैं। यह सुविधा शाखाओं के इलाज के मानक तरीके की तरह दिखता है: मान लें कि ट्रंक है, बी एक सुविधा शाखा है। आप A से B तक साप्ताहिक विलय करते हैं और जब आप इस सुविधा के साथ हो जाते हैं तो आप B से A में सब कुछ विलय कर देते हैं और फिर B को हटा देते हैं जो हमेशा मेरे लिए काम करता है। मैं आरेख गलत समझा है?
stmax

1
ध्यान दें कि मुझे नहीं पता है (मैंने जाँच नहीं की है) जो ऊपर दिए गए उदाहरण वास्तव में तोड़फोड़ की समस्या देते हैं । नाम और क्राइस-क्रॉस मर्ज SVN में वास्तविक समस्या है, मुझे लगता है।
जकुब नारबस्की 15

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

--reintegrateपदावनत किया गया है।
naught101

120

मैं भी एक ऐसे मामले की तलाश में हूं, जहां, कहते हैं कि तोड़फोड़ एक शाखा और मर्क्यूरियल (और गिट, बाजार, ...) को विलय करने में विफल रहती है।

SVN बुक बताता है कि कैसे नाम बदलकर फ़ाइलों को गलत तरीके से मर्ज किया गया है । यह तोड़फोड़ 1.5 , 1.6 , 1.7 और 1.8 पर लागू होता है ! मैंने नीचे की स्थिति को फिर से बनाने की कोशिश की है:

सीडी / टीएमपी
rm - rf svn - रेपो svn - चेकआउट
svnadmin svn - रेपो बनाते हैं
svn चेकआउट फ़ाइल : /// tmp / svn - रेपो svn - चेकआउट
सीडी svn - चेकआउट
mkdir ट्रंक शाखाएँ
गूंज 'अलविदा, दुनिया!' > ट्रंक / हैलो टेक्स्ट 
svn ट्रंक शाखाएं जोड़ें
svn कमिट - m 'इनिशियल इम्पोर्ट।' 
svn copy '^ / trunk' '^ / शाखाओं / नाम बदलें - m ' शाखा बनाएँ। ' 
svn स्विच '^ / ट्रंक' 
गूंज 'हैलो, दुनिया!' > नमस्ते टेक्स्ट    
svn प्रतिबद्ध - मी 'ट्रंक पर अपडेट करें।' 
svn स्विच '^ / शाखाएँ / नाम बदलें' 
svn नाम बदलें नमस्ते txt हैलो इं टेक्स्ट 
svn प्रतिबद्ध - मी 'शाखा पर नाम बदलें।' 
svn स्विच '^ / ट्रंक' 
svn मर्ज - पुनर्व्याख्या '^ / शाखाएँ / नाम बदलें' 

पुस्तक के अनुसार, मर्ज को स्पष्ट रूप से समाप्त किया जाना चाहिए, लेकिन नाम बदले गए फ़ाइल में गलत डेटा के साथ चूंकि अपडेट trunkको भुला दिया गया है। इसके बजाय मुझे एक पेड़ संघर्ष मिलता है (यह सबवर्सन 1.6.17 के साथ है, लेखन के समय डेबियन में नवीनतम संस्करण):

--- रिपॉजिटरी यूआरएल के बीच अंतर को '' में जोड़ना:
एक hello.en.txt
   C हैलो
संघर्षों का सारांश:
  पेड़ संघर्ष: 1

कोई भी संघर्ष नहीं होना चाहिए - अद्यतन को फ़ाइल के नए नाम में मर्ज किया जाना चाहिए। जब तोड़फोड़ विफल हो जाती है, तो Mercurial इसे सही ढंग से संभालता है:

rm -rf /tmp/hg-repo
hg init /tmp/hg-repo
cd /tmp/hg-repo
echo 'Goodbye, World!' > hello.txt
hg add hello.txt
hg commit -m 'Initial import.'
echo 'Hello, World!' > hello.txt
hg commit -m 'Update.'
hg update 0
hg rename hello.txt hello.en.txt
hg commit -m 'Rename.'
hg merge

मर्ज से पहले, रिपॉजिटरी इस तरह दिखता है (से hg glog):

@ बदलाव: 2: 6502899164cc
| टैग: टिप
| जनक: 0: d08bcebadd9e
| उपयोगकर्ता: मार्टिन गिस्लर
| दिनांक: थू अप्रैल ०१:२२:१ ९ २०१० +०२००
| सारांश: नाम बदलें।
|
| o बदलाव: 1: 9d06fa155634
| / उपयोगकर्ता: मार्टिन गिस्लर 
| दिनांक: थू अप्रैल ०१:२२:१ 2010 २०१० +०२००
| सारांश: अद्यतन।
|
ओ बदलाव: 0: d08bcebadd9e
   उपयोगकर्ता: मार्टिन गिस्लर 
   दिनांक: थू अप्रैल ०१:२२:१ 2010 २०१० +०२००
   सारांश: प्रारंभिक आयात।

मर्ज का आउटपुट है:

hello.en.txt और hello.txt को hello.en.txt में मर्ज करना
0 फाइलें अपडेट की गईं, 1 फाइलें मर्ज हुईं, 0 फाइलें निकाली गईं, 0 फाइलें अनसुलझे हैं
(शाखा मर्ज, कमिट करना न भूलें)

दूसरे शब्दों में: मर्क्यूरियल ने संशोधन 1 से परिवर्तन लिया और इसे संशोधन 2 ( hello.en.txt) से नए फ़ाइल नाम में विलय कर दिया । इस मामले को संभालना निश्चित रूप से आवश्यक है ताकि रीफैक्टरिंग और रीफैक्टरिंग का समर्थन किया जा सके, ठीक उसी तरह की बात है जिसे आप एक शाखा में करना चाहेंगे।


विस्तृत उदाहरण के लिए +1 कीबोर्ड में टैप कर सकता है और स्वयं देख सकता है कि क्या होता है। एक Mercurial noob के रूप में, मुझे आश्चर्य है कि क्या इस उदाहरण का hg संस्करण एक स्पष्ट तरीके से अनुसरण करता है, लाइन द्वारा लाइन?
डैरेन डब्ल्यू

4
@DarenW: मैंने संबंधित मर्क्यूरियल कमांड जोड़े हैं, मुझे आशा है कि यह चीजें स्पष्ट करती हैं!
मार्टिन गेइस्लर

17

सामान्य लाभों के बारे में बोलने के बिना (ऑफ़लाइन कमिट, प्रकाशन प्रक्रिया , ...) एक "मर्ज" उदाहरण है जो मुझे पसंद है:

मुख्य परिदृश्य जो मैं देख रहा हूं वह एक शाखा है जिस पर ... दो असंबंधित कार्य वास्तव में विकसित होते हैं
(यह एक विशेषता से शुरू हुआ, लेकिन यह इस अन्य सुविधा के विकास की ओर ले जाता है।
या यह एक पैच से शुरू हुआ, लेकिन यह आगे बढ़ता है। एक और विशेषता का विकास)।

आप मुख्य शाखा पर दो में से केवल एक सुविधा को कैसे मर्ज करेंगे?
या आप अपनी शाखाओं में दो विशेषताओं को कैसे अलग करते हैं?

आप कुछ प्रकार के पैच उत्पन्न करने का प्रयास कर सकते हैं, इसके साथ समस्या यह है कि आप निश्चित रूप से कार्यात्मक निर्भरता के बारे में सुनिश्चित नहीं हैं जो मौजूद हो सकते हैं:

  • आपके पैच में उपयोग किए गए कमिट (या SVN के लिए संशोधन)
  • अन्य पैच का हिस्सा नहीं है

Git (और मर्क्यूरियल भी मुझे लगता है) एक शाखा के हिस्से को रिबेस (शाखा की जड़ को रीसेट करने) के लिए रिबास - सोंटा विकल्प का प्रस्ताव करता है:

से Jefromi पद

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (v2-only) - x - x - x (wss)

आप इस स्थिति को अनसुना कर सकते हैं जहां आपके पास v2 के लिए पैच हैं और साथ ही साथ एक नया wss फीचर भी है:

- x - x - x (v2) - x - x - x (v2.1)
          |\
          |  x - x - x (v2-only)
           \
             x - x - x (wss)

आपको इसकी अनुमति देता है:

  • सब कुछ संकलित / काम करने के लिए जाँच करने के लिए अलगाव में प्रत्येक शाखा का परीक्षण करें
  • मर्ज वही करें जो आप मुख्य करना चाहते हैं।

दूसरी विशेषता जो मुझे पसंद है (जो मर्ज को प्रभावित करती है) वह स्क्वैश करने की क्षमता है (एक शाखा में अभी तक किसी अन्य रेपो को नहीं धकेला गया है) प्रस्तुत करने के लिए:

  • एक क्लीनर इतिहास
  • जो अधिक सुसंगत हैं (फ़ंक्शन 1 के लिए प्रतिबद्ध 1 के बजाय, फ़ंक्शन 2 के लिए प्रतिबद्ध 2, फ़ंक्शन 1 के लिए फिर से प्रतिबद्ध 3 ...)

यह सुनिश्चित करता है कि मर्ज जो कम संघर्षों के साथ बहुत आसान हैं।


svn में ऑफ़लाइन आवागमन नहीं है? rofl? अगर कोई ऐसा है, तो कोई भी इसका उपयोग करने पर कैसे विचार कर सकता है?
ओ ० '।

@ लोरिस जब एसवीएन बाहर आया, तो व्यापक रूप से उपयोग किए जाने वाले ओपन-सोर्स डीवीसीएस नहीं थे; इस बिंदु पर, मुझे लगता है कि यह ज्यादातर जड़ता है जो लोग अभी भी इसका उपयोग करते हैं।
मैक्स नानसी

@MaxNanasy एक बहुत ही बुरी तरह की जड़ता है ... फिर भी, अब इसे चुनना केवल बेवकूफी होगी।
ओ ० '।

@ लोरिस ऑनलाइन (अधिक सटीक, केंद्रीकृत) कमिट इतनी छोटी टीम में इतनी बड़ी बात नहीं है जहां रिपॉजिटरी केवल एक साझा स्थानीय सर्वर पर हो सकती है। डीवीसीएस का आविष्कार ज्यादातर बड़े, भौगोलिक रूप से वितरित टीमों (दोनों गिट और मर्क्यूरियल को लिनक्स कर्नेल कोड को प्रबंधित करने के लिए किया गया था) और ओपन सोर्स प्रोजेक्ट्स (इसलिए GitHub की लोकप्रियता) के लिए किया गया था। जड़ता को एक टूल सेंट्रल को टीम के वर्कफ़्लो में बदलने के जोखिम बनाम लाभों के मूल्यांकन के रूप में भी देखा जा सकता है।
IMSoP

1
@Lhoris मुझे लगता है कि आप DB, फ़ायरवॉल, आदि के बारे में मेरी बात को गलत समझ रहे हैं: अगर मुझे वास्तव में उस कोड को पहले नहीं चलाया जा सकता है तो मेरे होम मशीन पर कमिटमेंट करने में सक्षम होने की कोई बात नहीं है। मैं अंधा काम कर सकता था , लेकिन तथ्य यह है कि मैं चीजों को नहीं कर सकता कहीं भी मुख्य चीज मुझे बंद नहीं करेगी।
21

8

हमने हाल ही में एसवीएन से जीआईटी में प्रवास किया, और इसी अनिश्चितता का सामना किया। कई महत्वपूर्ण सबूत थे कि जीआईटी बेहतर था, लेकिन किसी भी उदाहरण में आना मुश्किल था।

मैं आपको बता सकता हूँ, कि GIT SVN की तुलना में विलय करने के लिए एक बहुत बेहतर है । यह स्पष्ट रूप से वास्तविक है, लेकिन पालन करने के लिए एक तालिका है।

यहां कुछ चीजें दी गई हैं:

  • एसवीएन उन स्थितियों में बहुत सारे पेड़ों के टकराव का इस्तेमाल करता था जहां ऐसा लगता था कि ऐसा नहीं होना चाहिए। हम कभी भी इसकी तह तक नहीं पहुंचे, लेकिन जीआईटी में ऐसा नहीं हुआ।
  • बेहतर है, जीआईटी काफी जटिल है। प्रशिक्षण पर कुछ समय बिताएं।
  • हमें एसवीएन को कछुआ करने के लिए इस्तेमाल किया गया था, जो हमें पसंद आया। कछुआ GIT उतना अच्छा नहीं है और इससे आपको नुकसान हो सकता है। हालाँकि मैं अब GIT कमांड लाइन का उपयोग करता हूं जिसे मैं एसवीएन या किसी भी जीआईआई GUI के कछुए को पसंद करता हूं।

जब हम जीआईटी का मूल्यांकन कर रहे थे तो हमने निम्नलिखित परीक्षण किए। ये जीआईटी को विजेता के रूप में दिखाते हैं जब विलय की बात आती है, लेकिन उतना नहीं। व्यवहार में अंतर बहुत बड़ा है, लेकिन मुझे लगता है कि हम उन स्थितियों को दोहराने में कामयाब नहीं हुए हैं जिन्हें एसवीएन बुरी तरह से संभालता है।

GIT बनाम SVN विलय मूल्यांकन


5

अन्य लोगों ने इसके अधिक सैद्धांतिक पहलुओं को कवर किया है। शायद मैं और अधिक व्यावहारिक दृष्टिकोण उधार दे सकता हूं।

मैं वर्तमान में एक ऐसी कंपनी के लिए काम कर रहा हूं, जो "फीचर ब्रांच" डेवलपमेंट मॉडल में SVN का उपयोग करती है। अर्थात्:

  • ट्रंक पर कोई काम नहीं किया जा सकता है
  • प्रत्येक डेवलपर अपनी शाखाएं बना सकता है
  • शाखाएँ कार्य की अवधि के लिए होनी चाहिए
  • प्रत्येक कार्य की अपनी शाखा होनी चाहिए
  • ट्रंक में वापस विलय को अधिकृत करने की आवश्यकता है (सामान्य रूप से बगज़िला के माध्यम से)
  • कई बार जब उच्च स्तर के नियंत्रण की आवश्यकता होती है, तो विलय एक गेटकीपर द्वारा किया जा सकता है

सामान्य तौर पर, यह काम करता है। एसवीएन का उपयोग इस तरह के प्रवाह के लिए किया जा सकता है, लेकिन यह सही नहीं है। एसवीएन के कुछ पहलू हैं जो मानव व्यवहार के तरीके और आकार में मिलते हैं। यह इसे कुछ नकारात्मक पहलू देता है।

  • हम काफी कम समस्याओं के साथ अंक से शाखाओं में बंटी लोगों के साथ किया है ^/trunk। यह लिटर पूरे पेड़ में सूचना रिकॉर्ड को मर्ज करता है, और अंततः मर्ज ट्रैकिंग को तोड़ देता है। झूठे विरोध प्रकट होने लगते हैं, और भ्रम कायम हो जाता है।
  • ट्रंक से एक शाखा में परिवर्तन उठाना अपेक्षाकृत आगे की ओर है। svn mergeआप जो चाहते हैं। मर्ज --reintegrateकमांड पर आपके परिवर्तनों को वापस मर्ज करना (हमें बताया गया है) । मैंने इस स्विच को कभी नहीं समझा है, लेकिन इसका मतलब है कि शाखा को फिर से ट्रंक में विलय नहीं किया जा सकता है। इसका मतलब है कि यह एक मृत शाखा है और आपको काम जारी रखने के लिए एक नया बनाना होगा। (नोट देखें)
  • शाखाओं को बनाने और हटाने के दौरान URL के माध्यम से सर्वर पर संचालन करने का पूरा व्यवसाय वास्तव में भ्रमित करता है और लोगों को डराता है। इसलिए वे इससे बचते हैं।
  • शाखाओं के बीच स्विच करना गलत होना आसान है, शाखा A को देखने वाले पेड़ के हिस्से को छोड़ना, जबकि शाखा B को देखने वाले दूसरे भाग को छोड़ना है। इसलिए लोग अपना सारा काम एक शाखा में करना पसंद करते हैं।

क्या होने वाला है, एक इंजीनियर 1 दिन में एक शाखा बनाता है। वह अपना काम शुरू करता है और इसके बारे में भूल जाता है। कुछ समय बाद एक बॉस साथ आता है और पूछता है कि क्या वह ट्रंक को अपना काम जारी कर सकता है। अभियंता इस दिन का प्रसार कर रहे हैं क्योंकि पुन: व्यवस्थित करने का मतलब है:

  • अपनी लंबी जीवित शाखा को वापस ट्रंक में विलय करना और सभी संघर्षों को हल करना, और असंबंधित कोड जारी करना जो एक अलग शाखा में होना चाहिए था, लेकिन नहीं।
  • उसकी शाखा हटाना
  • एक नई शाखा बनाना
  • उसकी कार्यशील प्रति को नई शाखा में बदलना

... और क्योंकि इंजीनियर ऐसा करता है जितना वे कम कर सकते हैं, वे प्रत्येक चरण को करने के लिए "जादू भस्म" को याद नहीं कर सकते हैं। गलत स्विच और URL होते हैं, और अचानक वे गड़बड़ हो जाते हैं और उन्हें "विशेषज्ञ" मिलता है।

आखिरकार यह सब शांत हो जाता है, और लोग कमियों से निपटना सीख जाते हैं, लेकिन प्रत्येक नया स्टार्टर समान समस्याओं से गुजरता है। अंतिम वास्तविकता (जैसा कि मैंने जो शुरू किया था, उसके विपरीत है):

  • ट्रंक पर कोई काम नहीं किया जाता है
  • प्रत्येक डेवलपर की एक प्रमुख शाखा होती है
  • शाखाएँ तब तक चलती हैं जब तक काम जारी करने की आवश्यकता नहीं होती
  • टिकट वाली बग फिक्स की अपनी शाखा पाने के लिए करते हैं
  • अधिकृत होने पर वापस ट्रंक में विलय कर दिया जाता है

...परंतु...

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

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


के अनुसार इस वहाँ अब एक है --record-onlyस्विच है कि हल करने के लिए इस्तेमाल किया जा सकता --reintegrateसमस्या है, और जाहिरा तौर पर v1.8 चुनता है एक के एकीकरण स्वचालित रूप से करने के लिए, और यह कारण नहीं है शाखा बाद में मृत होने का


जैसा कि मैं इसे समझता हूं, --reintegrate विकल्प svn को बताता है कि आपने सुविधा शाखा में विलय करते समय पहले से ही परस्पर विरोधी परिवर्तनों को हल कर लिया है। प्रभावी रूप से, इसे एक पैच के रूप में मानने के बजाय, यह पूरी तरह से शाखा संस्करण के साथ फाइल को अधिलेखित कर देता है, जो पहले से ही मर्ज इतिहास में जांच कर चुका है कि सभी ट्रंक संशोधन शाखा में विलय हो गए हैं।
IMSoP

@IMSoP: संभवतः, यह कुछ समझ में आता है। यह मुझे समझाता नहीं है कि यह क्यों आवश्यक था या क्यों इसने उस शाखा से आगे विलय कर दिया हालांकि असंभव था। मदद नहीं की थी कि विकल्प मोटे तौर पर या तो अनिर्दिष्ट था।
पॉल एस

मैंने केवल इसे TortoiseSVN के माध्यम से उपयोग किया है, जहां इसे हमेशा मर्ज UI में प्रमुखता से समझाया गया था। मेरा मानना ​​है कि SVN 1.8 स्वचालित रूप से सही रणनीति का चयन करता है, और इसके लिए एक अलग विकल्प की आवश्यकता नहीं होती है, लेकिन मुझे नहीं पता कि क्या उन्होंने इस तरह से रीसेट की गई शाखा से सही तरीके से निपटने के लिए सामान्य मर्ज एल्गोरिथ्म तय किया है।
IMSoP

3

तोड़फोड़ करने से पहले 1.5 (अगर मैं गलत नहीं हूं), तोड़फोड़ में एक महत्वपूर्ण नुकसान था कि यह मर्ज इतिहास को याद नहीं करेगा।

आइए VonC द्वारा उल्लिखित मामले को देखें:

- x - x - x (v2) - x - x - x (v2.1)
          |\
          |  x - A - x (v2-only)
           \
             x - B - x (wss)

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

यह मेरे स्वयं के अनुभव का एक उदाहरण है, जहां कोड की मात्रा के कारण बी से ए में विलय में कई घंटे लगते हैं: जो कि फिर से गुजरने के लिए एक वास्तविक दर्द होता, जो कि पूर्व-1.5 के तोड़फोड़ के साथ मामला होता।

हगनीट से विलय व्यवहार में एक और, संभवतः अधिक प्रासंगिक अंतर : तोड़फोड़ पुन: शिक्षा :

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

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

इसके विपरीत, जब हम मर्क्यूरियल में अलग से काम कर रहे थे, मर्क्यूरियल कई बदलावों की श्रृंखला में व्यस्त था। और इसलिए, जब हम अपने कोड को एक साथ मर्ज करना चाहते हैं, तो Mercurial के पास वास्तव में पूरी बहुत अधिक जानकारी है: यह जानता है कि हम में से प्रत्येक ने क्या परिवर्तन किया और उन परिवर्तनों को फिर से लागू कर सकता है, बजाय इसके कि केवल अंतिम उत्पाद को देखें और यह अनुमान लगाने की कोशिश करें कि इसे कैसे रखा जाए। साथ में।

संक्षेप में, मतभेदों के विश्लेषण का मर्कुरियल तरीका है (था?) तोड़फोड़ से बेहतर।


5
मैंने hginit पढ़ा है। बहुत बुरा यह अधिक व्यावहारिक उदाहरण नहीं दिखाता है जहां hg svn से बेहतर कर रहा है .. मूल रूप से यह आपको "joel" पर विश्वास करने के लिए कहता है कि hg सिर्फ बेहतर है। उनके द्वारा दिखाए गए सरल उदाहरण शायद svn के साथ भी किए जा सकते हैं .. वास्तव में इसीलिए मैंने यह प्रश्न खोला है।
स्टमैक्स

1
यह कैसे कहा जाता है, इसके आधार पर, भोली सवाल मन में आता है: क्या होगा यदि मर्क्यूरियल के मर्ज एल्गोरिथ्म को तोड़फोड़ में डाल दिया जाए? Svn तो hg के रूप में अच्छा होगा? नहीं, क्योंकि hg का लाभ उच्च स्तर के संगठन में है, न कि फाइलों से विलय की गई लाइनों के निम्न-स्तरीय पाठ-गणित में। यह उपन्यास विचार है कि हम svn उपयोगकर्ताओं को टटोलने की जरूरत है।
डैरेन डब्ल्यू

@stmax: मैं देख सकता हूं कि आपका क्या मतलब है। हालांकि, जोएल या किसी और की राय वास्तव में मायने नहीं रखती है: एक तकनीक या तो दूसरे की तुलना में बेहतर है (उपयोग मामलों के एक सेट के लिए) या नहीं। @DarenW और @stmax: अपने स्वयं के व्यक्तिगत अनुभव से, Hg हाथों को जीतता है क्योंकि यह वितरित वितरण (मैं हर समय जुड़ा नहीं रहा), प्रदर्शन (स्थानीय संचालन के बहुत सारे), एक श्रेष्ठ विलय एल्गोरिथ्म द्वारा बेहद सहज ज्ञान युक्त शाखाएं हैं। hg रोलबैक, टेम्प्लेटेड लॉग आउटपुट, hg glog, सिंगल .hg फोल्डर ... मैं बस चल सकता था, और आगे भी ... शायद git और bazaar के अलावा कुछ भी एक स्ट्रेटजैक की तरह लगता है।
टोमिस्लाव नैक-अल्फेयरविक

"बदलाव" के बारे में उद्धृत hg टिप्पणी मुझे गलत लगती है। एसवीएन अच्छी तरह से जानता है कि यह क्या विलय कर रहा है (एक बदलाव मूल रूप से दो स्नैपशॉट के बीच का अंतर है, और यह ठीक है;), और यदि ऐसा है तो उनमें से प्रत्येक को बदले में लागू कर सकते हैं; निश्चित रूप से कुछ भी "अनुमान" नहीं है। यदि यह "एक बड़ी अपवित्र गंदगी" बनाता है, तो यह कार्यान्वयन की समस्या है, डिजाइन के लिए मौलिक कुछ भी नहीं। वर्तमान वास्तुकला डिजाइन के शीर्ष पर हल करने के लिए मुश्किल है कि मुख्य समस्या फ़ाइल चाल / कॉपी / नाम है।
IMSoP
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.