Git में "ब्रांचिंग फ़्री" का क्या अर्थ है?


27

Git में "ब्रांचिंग फ़्री" का क्या अर्थ है?

मैं इसे बहुत सुनता हूं जब भी अन्य संस्करण नियंत्रण प्रणालियों की तुलना में गिट का उल्लेख किया जाता है।

मुझे दूसरों ( एसवीएन , आदि) से निपटने का अवसर (?) नहीं मिला है , इसलिए दूसरों में "महंगा" कैसे हो रहा है?

जवाबों:


28

दावा है कि "शाखा में स्वतंत्र है" तथ्यों का एक सरलीकरण है क्योंकि यह प्रति 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बजाय व्यापारिक शब्दावली में होते हैं।


वाह। "महंगी" स्पष्टीकरण के लिए बहुत धन्यवाद।
लैगिंगफ्लेक्स

2
अपने स्वयं के स्रोत से: This command causes a near-instantaneous commit in the repository, creating a new directory in revision 341. The new directory is a copy of /calc/trunk.- शाखा बनाना एसवीएन में तुच्छ है, जब तक कि आप स्पष्ट रूप से हर फ़ाइल की प्रतिलिपि नहीं बना रहे हैं।
बोबसन

@Bobson मैं शाखाओं पर बिट्स को फिर से लिखने के बारे में सोच रहा था, क्योंकि मैं उस बारे में बहुत सारे हाथ से काम कर रहा हूं, लेकिन मेरा कहना अभी भी है कि एक शाखा बनाने के लिए एक कमिट की आवश्यकता होती है जबकि Git में यह नहीं है। अपने विनम्र अनुभव में मुझे अभी भी लगता है कि एसवीएन में स्विचिंग शाखाएं गीट की तुलना में धीमी हैं, लेकिन मैं किसी भी विशिष्ट कारण की ओर इशारा नहीं कर सकता।
स्पोकाइक

2
@ साइकाइक - स्विचिंग, निश्चित रूप से। और एक प्रतिबद्ध निश्चित रूप से आवश्यक है। मैंने उस बिट को स्पष्ट करने के लिए एक संपादन किया जिसमें मुझे एक समस्या थी। यदि आप चाहें तो इसे वापस करने के लिए स्वतंत्र महसूस करें।
बोबसन

20

एक शाखा की वास्तविक लागत इसे विलय कर रही है। Git कुछ अन्य स्रोत नियंत्रण प्रणालियों की तुलना में इसे आसान बनाता है। स्टैक ओवरफ्लो प्रश्न देखें एसवीएन की तुलना में गिट में विलय कैसे और / या बेहतर क्यों है?


5
सख्ती से, Git केवल कुछ अन्य SCM की तुलना में आसान बनाता है ।
डोनल फेलो

10

गिट में, एक शाखा स्थानीय रेपो के लिए एक कमिट के लिए संदर्भ है। इसे बनाना बहुत सस्ता है, कोई नेटवर्क नहीं है। बहुत मुक्त नहीं है (आपको एक कमांड टाइप करना है), लेकिन पास में लानत है।

एसवीएन में ब्रांचिंग विशेष रूप से महंगा नहीं है - यह सिर्फ एक प्रति है, जो बहुत सस्ती है। एसवीएन में एक केंद्रीय भंडार मॉडल है, इसलिए यह एक नेटवर्क एक्सेस है, लेकिन एक भयानक नहीं है।

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


4
गिट के साथ, यह एक कमिट से भी कम है - एक शाखा सिर्फ एक लेबल है। और एसवीएन सीवीएस जितना महंगा लगता है, क्योंकि वे दोनों सभी फाइलों की नकल करते हैं।
इज़्काता

8
@Izkata: यदि हम उपयोगकर्ता के दृष्टिकोण से देखते हैं - हाँ, सभी फ़ाइलों की प्रतिलिपि बनाई गई है, कार्यान्वयन (और प्रदर्शन) के दृष्टिकोण से - नहीं, बस कॉपी के बारे में एक रिकॉर्ड जोड़ा जाता है।
अधिकतम ११

@ इज़कट टिप्पणी करने के लिए बहुत अधिक - मेरा उत्तर देखें।
gbjbaanb

6
@Izkata SVN संकेत और संदर्भ बनाता है, यह सब कुछ कॉपी नहीं करता है।
हारून मैकइवर

2
Git शाखा एक कमिट नहीं है, यह केवल एक कमिट का संदर्भ है जिसे स्वतंत्र रूप से अन्य कमिट में स्थानांतरित किया जा सकता है। एक Git रेपो के बारे में सोचें जैसे कि केवल एक पेड़ होता है, और चिपचिपे नोटों के रूप में शाखाएं जो उस पेड़ पर स्वतंत्र रूप से अलग-अलग आवागमन के लिए स्थानांतरित हो सकती हैं।
40XUserNotFound

5

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

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


5

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

git की शाखाएं अनिवार्य रूप से एक ओर इशारा करते हुए लेबल हैं और इस प्रकार उपरोक्त मुद्दों से बचती हैं।


1

"मुक्त / सस्ते / महंगे" का एक अन्य पहलू यह है कि ब्रंचिंग के नकारात्मक परिणामों से निपटने के लिए डेवलपर संसाधनों के संदर्भ में लागत कितनी है; यानी शाखाओं से विलय की प्रक्रिया।

और यहाँ, GCS और Mercurial जैसे DVCS सिस्टम में शाखाओं का विलय करना पुरानी प्रणालियों की तुलना में आसान है ... क्योंकि DVCS सिस्टम ग्राफ़ में संस्करणों के इतिहास को ट्रैक करने का एक बेहतर काम करते हैं; यानी जहां पिछले ब्रांचिंग एक मर्जिंग हो गई है। यह विलय को अधिक सटीक बनाता है, अनावश्यक संघर्षों को कम करता है और ... इसमें शामिल डेवलपर्स के लिए विषयवस्तु को "आसान" या "कम डरावना" बनाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.