2009-10-31 11 views
11

में विभिन्न ब्रांचिंग मॉडल के पेशेवरों और विपक्ष वितरित संस्करण नियंत्रण (गिट, बाज़ार, और मर्कुरियल) का बिग थ्री प्रत्येक अलग-अलग शाखाओं का इलाज करता है। बाजार में, उदाहरण के लिए, शाखाएं अलग-अलग प्रतिनिधि हैं (वास्तव में, माता-पिता रेपो की अलग-अलग प्रतियां); आपकी फाइल सिस्टम पर, विभिन्न शाखाएं विभिन्न निर्देशिकाओं में रहते हैं। दूसरी तरफ, गिट में, आप एक ही रेपो में मौजूद कई शाखाएं (और इसलिए आपकी फ़ाइल सिस्टम पर एक ही निर्देशिका में) हो सकती हैं। Mercurial both behaviors का समर्थन करता है, उत्तरार्द्ध named branches के साथ।डीवीसीएस

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

+4

नामित शाखाएं गिट शाखाओं से काफी अलग हैं, विवरण के लिए यहां देखें: http://stevelosh.com/blog/entry/2009/8/30/a-guide-to-branching-in-mercurial/ – tonfa

+0

यह भी देखें "गिट एंड मर्कुरियल - तुलना और कंट्रास्ट" में मेरा जवाब, जिसमें शाखाएं भी शामिल हैं: http://stackoverflow.com/questions/1598759/git-and-mercurial-compare-and-contrast/1599930#1599930 –

+0

मैन, टोनफा हमेशा मेरे ब्लॉग एंट्री पोस्ट करने से पहले प्रबंधन करता है! :) –

उत्तर

9

बाज़ार आपको जिस तरीके से वर्णन करने के लिए काम करने की आवश्यकता नहीं है। मैंने वास्तव में दो दिन पहले इसके बारे में a blog post लिखा है। आप केवल एक ही काम करने वाले पेड़ के साथ बहुत काम कर सकते हैं, विभिन्न शाखाओं के बीच स्विच कर सकते हैं और काम कर रहे पेड़ को छोड़े बिना नई शाखाएं बना सकते हैं। इसके लिए उपयोगी आदेश हैं: checkout, switch, branch --switch। बाजार के लिए workflow दस्तावेज़ीकरण देखें, आप देखेंगे कि आप इसे किसी भी तरह से कॉन्फ़िगर कर सकते हैं।

+0

यह जानना अच्छा है कि बाज़ार मैंने सोचा जितना अधिक लचीला है। मैं वास्तव में सोच रहा था कि क्या आपके रेपो के अंदर "शाखाएं" निर्देशिका बनाना मेरे प्रश्न में उल्लिखित समस्या का समाधान कर सकता है। अंतर्दृष्टि के लिए धन्यवाद। – ThisSuitIsBlackNot

6

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


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

Git glossaryविकास की सक्रिय रेखा के रूप में "शाखा" को परिभाषित करता है। यह विचार गिट में शाखाओं के कार्यान्वयन के पीछे है।

शाखा पर सबसे हालिया प्रतिबद्धता को उस शाखा के टिप के रूप में जाना जाता है। शाखा की नोक को शाखा प्रमुख द्वारा संदर्भित किया गया है, जो इस प्रतिबद्धता के लिए केवल एक प्रतीकात्मक नाम है। अपने "ढीले" रूप में इस तरह के शाखा प्रमुख (उदाहरण के लिए 'मास्टर' नाम की शाखा के लिए) refs/heads/ निर्देशिका में गिट रिपोजिटरी (.git डीआईआर के अंदर) में कहीं भी एक फ़ाइल है, जिसमें शाखा की वर्तमान युक्ति का संदर्भ शामिल है: इसका SHA-1 प्रतिबद्धता के पहचानकर्ता (हेक्साडेसिमल स्ट्रिंग के रूप में)।

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

एक सिंगल गिट रिपोजिटरी शाखाओं की मनमानी संख्या को ट्रैक कर सकती है, लेकिन आपके काम करने वाले पेड़ (यदि आपके पास कोई है) उनमें से केवल एक ("वर्तमान" या "चेक आउट" शाखा) से जुड़ा हुआ है। वर्तमान शाखा हेड पॉइंटर द्वारा दी जाती है। हेड (आमतौर पर) सूचकांक वर्तमान में शाखा (शाखा के नाम पर) की जांच करने के लिए सूचक है, जैसे शाखा प्रमुख शाखाओं की युक्तियों के लिए पॉइंटर्स हैं।

उदाहरण के लिए यदि अभी चेक आउट शाखा 'गुरु' है, तो .git/HEAD फ़ाइल (का प्रतिनिधित्व प्रमुख) है एक वामो होते हैं .git/refs/heads/master ('मास्टर' शाखा के प्रमुख) ref: refs/heads/master (refs/heads/master के लिए एक प्रतीकात्मक संदर्भ), और साथ लाइन समाप्त होगा उदाहरण के लिए एलएफ समाप्त लाइन 0b127cb8ab975e43398a2b449563ccb78c437255 है, whihc 'मास्टर' शाखा की नोक के लिए SHA-1 पहचानकर्ता है (यानी यदि वर्तमान शाखा "पैक नहीं" है: तो आपको .git/packed-refs पर एक नज़र रखना होगा)।

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

"git log branch" कमांड शाखा टिप से पहुंचने योग्य सभी प्रतिबद्धताओं को दिखाता है, जिसका अर्थ शाखा के टिप, उसके माता-पिता, माता-पिता (या माता-पिता) के माता-पिता की प्रतिबद्धता आदि का मतलब है। यह एक डीएजी का हिस्सा दिखाता है।

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


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

शॉर्ट रीफ्लॉग में अतिरिक्त सुरक्षा और गिट कमांड को आसान वसूली देता है।

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