दावा है कि "शाखा में स्वतंत्र है" तथ्यों का एक सरलीकरण है क्योंकि यह प्रति se "मुक्त" नहीं है। हुड के नीचे देख रहे हैं एक और अधिक सही दावा कहना है कि है शाखाओं में होगा redonkulously सस्ते बजाय, क्योंकि शाखाओं मूल रूप से प्रतिबद्ध के लिए संदर्भ । मैं "सस्तेपन" को यहाँ परिभाषित करता हूँ क्योंकि कम ओवरहेड सस्ता है।
आओ हम जानते हैं कि Git इतना सस्ता क्यों होता है
Git में शाखाएँ कैसे लागू की जाती हैं?
गिट रिपॉजिटरी, .git
ज्यादातर फाइलों के साथ निर्देशिकाओं के होते हैं जिनमें मेटाडेटा होता है जो गिट उपयोग करता है। जब भी आप git में एक शाखा बनाते हैं, उदाहरण के लिए git branch {name_of_branch}
, कुछ चीजें होती हैं:
- स्थानीय शाखा में एक संदर्भ बनाया जाता है:
.git/refs/heads/{name_of_branch}
- स्थानीय शाखा के लिए एक इतिहास लॉग बनाया गया है:
.git/logs/refs/heads/{name_of_branch}
मूल रूप से यह है, पाठ फ़ाइलों का एक जोड़ा बनाया जाता है। यदि आप संदर्भ को एक टेक्स्टफाइल के रूप में खोलते हैं, तो सामग्री उस शाखा की आईडी-शे होगी जो इंगित कर रही है। ध्यान दें कि ब्रांचिंग के लिए आपको किसी भी तरह का कमिटमेंट करने की आवश्यकता नहीं है क्योंकि वे एक अन्य प्रकार की वस्तु हैं। दोनों शाखाएँ और कमिट "git में प्रथम श्रेणी के नागरिक" हैं और एक तरीका यह है कि एक रचना के बजाय एक एकत्रीकरण के रूप में शाखा-से-प्रतिबद्ध संबंध के बारे में सोचना है। यदि आप एक शाखा निकालते हैं, तो कमिट्स "लटकने" के रूप में मौजूद रहेंगे। यदि आपने गलती से एक शाखा को हटा दिया है तो आप हमेशा कमिटमेंट ढूंढने की कोशिश कर सकते हैं git-lost-found
या git-fsck --lost-found
शा-आईडी पर एक शाखा बना सकते हैं जिसे आप लटकते हुए पाते हैं (और जब तक गिट ने कोई कचरा संग्रह नहीं किया है)।
तो आप किस शाखा में काम कर रहे हैं, इसका ट्रैक कैसे रखें? उत्तर .git/HEAD
फ़ाइल के साथ है , यदि आप master
शाखा पर हैं तो यह इस तरह दिखता है ।
ref: refs/heads/master
स्विचिंग शाखाएं बस .git/HEAD
फ़ाइल में संदर्भ को बदल देती हैं, और फिर कमिट में परिभाषित लोगों के साथ आपके कार्यक्षेत्र की सामग्री को बदलने के लिए आगे बढ़ती हैं।
अन्य संस्करण नियंत्रण प्रणालियों में इसकी तुलना कैसे की जाती है?
में सबवर्सन , शाखाओं भंडार में वर्चुअल निर्देशिका हैं । तो शाखा के लिए सबसे आसान तरीका यह है कि इसे दूर से एक-लाइनर के साथ किया जाए svn copy {trunk-url} {branch-url} -m "Branched it!"
। एसवीएन क्या करेगा निम्नलिखित है:
- स्रोत निर्देशिका की प्रतिलिपि बनाएँ, जैसे
trunk
, लक्ष्य निर्देशिका में,
- कॉपी एक्शन को अंतिम रूप देने के लिए बदलाव करें।
आप इस कार्रवाई को सर्वर पर दूरस्थ रूप से करना चाहेंगे, क्योंकि स्थानीय रूप से उस प्रतिलिपि को बनाना एक रैखिक-समय का संचालन है, जिसमें फ़ाइलों की प्रतिलिपि बनाई जा सकती है और उन्हें सम्मिलित किया जाता है। यह बहुत धीमा ऑपरेशन है, जबकि सर्वर पर इसे करना एक निरंतर समय ऑपरेशन है। ध्यान दें कि जब शाखा को अलग-अलग किया जाता है, तब भी तोड़फोड़ के लिए एक वचनबद्धता की आवश्यकता होती है , जबकि गिट नहीं होती है, जो एक महत्वपूर्ण अंतर है। यह एक प्रकार का ओवरहेड है जो एसवीएन को गिट की तुलना में मामूली कम खर्चीला बनाता है।
के लिए आदेश SVN में शाखाओं स्विचिंग , यानी svn switch
, वास्तव में है svn update
भेस में। वर्चुअल डायरेक्टरी कॉन्सेप्ट की बदौलत svn में git की तुलना में कमांड थोड़ी ज्यादा लचीली है। आपके कार्यक्षेत्र में उप निर्देशिकाओं को दूसरे रिपॉजिटरी यूआरएल को मिरर करने के लिए स्विच किया जा सकता है। निकटतम चीज का उपयोग करना होगा, git-submodule
लेकिन इसका उपयोग करना शब्दार्थ से अलग है। दुर्भाग्य से यह भी एक डिजाइन निर्णय है जो एसवीएन में जीआईटी की तुलना में थोड़ा धीमा स्विच करता है क्योंकि इसमें हर कार्यक्षेत्र निर्देशिका की जांच करनी होती है जो रिमोट-यूआरएल मिररिंग है। मेरे अनुभव में, Git SVN की तुलना में शाखाओं को स्विच करने के लिए तेज है।
SVN की ब्रांचिंग एक लागत के साथ आती है क्योंकि यह फाइलों को कॉपी करती है और हमेशा सार्वजनिक रूप से उपलब्ध कराने की आवश्यकता होती है। जैसा कि ऊपर बताया गया है, गिट में, शाखाएं "सिर्फ संदर्भ" हैं और इसे आपके स्थानीय भंडार में रखा जा सकता है और आपके विवेक पर प्रकाशित किया जा सकता है। मेरे अनुभव में हालांकि SVN अभी भी काफी सस्ता है और उदाहरण के लिए ClearCase की तुलना में अधिक प्रभावशाली है।
यह केवल एक बुमेर है कि एसवीएन विकेंद्रीकृत नहीं है। आपके पास कई रिपॉजिटरी हो सकते हैं, जैसा कि कुछ स्रोत रेपो में दिखाया गया है, लेकिन कई एसवीएन-रिपॉजिटरी में अलग-अलग बदलाव को सिंक करना संभव नहीं है क्योंकि एसवीएन के पास कमिट के लिए विशिष्ट पहचानकर्ता नहीं है (जीआईटी ने हैडेड पहचानकर्ता हैं जो कमिट की सामग्री पर आधारित हैं)। कारण है कि मैंने व्यक्तिगत रूप से एसवीएन पर गिट का उपयोग करना शुरू कर दिया है, क्योंकि यह है कि एक रिपॉजिटरी शुरू करना गिट में काफी आसान और सस्ता है । सॉफ्टवेयर कॉन्फ़िगरेशन प्रबंधन के संदर्भ में, एक परियोजना (क्लोन, कांटा, कार्यक्षेत्र या जो कुछ भी है) की प्रत्येक भिन्न प्रति एक "शाखा" है, और इस शब्दावली को एसवीएन में एक नई प्रतिलिपि बनाने के लिए दिया जाता है, जो गीट के रूप में सस्ता नहीं है, जहां बाद है। शाखाएं "अंतर्निहित"।
एक अन्य उदाहरण के रूप में, मर्क्यूरियल में , DVCS के रूप में ब्रांचिंग थोड़ा अलग शुरू हुआ और नामांकित शाखाओं को बनाने / नष्ट करने की आवश्यकता होती है। Mercurial Developers ने बाद में विकास के बुकमार्क में git के उसी ब्रांचिंग मॉडल की नकल करने के लिए कार्यान्वित किया, heads
जिसे कहा जाता है tips
और branches
इसके bookmarks
बजाय व्यापारिक शब्दावली में होते हैं।