Git - मूल अवधारणा

संस्करण नियंत्रण प्रणाली

Version Control System (VCS) एक सॉफ्टवेयर है जो सॉफ्टवेयर डेवलपर्स को एक साथ काम करने और उनके काम का पूरा इतिहास बनाए रखने में मदद करता है।

नीचे सूचीबद्ध एक VCS के कार्य हैं -

  • डेवलपर्स को एक साथ काम करने की अनुमति देता है।
  • एक-दूसरे के परिवर्तनों को ओवरराइट करने की अनुमति नहीं देता है।
  • हर संस्करण का इतिहास रखता है।

VCS के प्रकार निम्नलिखित हैं -

  • केंद्रीकृत संस्करण नियंत्रण प्रणाली (CVCS)।
  • वितरित / विकेंद्रीकृत संस्करण नियंत्रण प्रणाली (DVCS)।

इस अध्याय में, हम केवल वितरित संस्करण नियंत्रण प्रणाली और विशेष रूप से गिट पर ध्यान केंद्रित करेंगे। Git वितरित संस्करण नियंत्रण प्रणाली के अंतर्गत आता है।

वितरित संस्करण नियंत्रण प्रणाली

केंद्रीकृत संस्करण नियंत्रण प्रणाली (CVCS) सभी फ़ाइलों को संग्रहीत करने के लिए एक केंद्रीय सर्वर का उपयोग करता है और टीम सहयोग को सक्षम करता है। लेकिन CVCS की बड़ी खामी केंद्रीय सर्वर की विफलता का एकमात्र बिंदु है। दुर्भाग्य से, अगर केंद्रीय सर्वर एक घंटे के लिए नीचे जाता है, तो उस घंटे के दौरान, कोई भी बिल्कुल भी सहयोग नहीं कर सकता है। और यहां तक ​​कि सबसे खराब स्थिति में, यदि केंद्रीय सर्वर की डिस्क दूषित हो जाती है और उचित बैकअप नहीं लिया गया है, तो आप परियोजना के पूरे इतिहास को खो देंगे। यहाँ, वितरित संस्करण नियंत्रण प्रणाली (DVCS) चित्र में आती है।

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

Git के फायदे

मुक्त और खुला स्रोत

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

तेज और छोटा

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

निहित बैकअप

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

सुरक्षा

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

शक्तिशाली हार्डवेयर की कोई आवश्यकता नहीं है

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

आसान शाखा

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

डीवीसीएस शब्दावली

स्थानीय रिपोजिटरी

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

वर्किंग डायरेक्टरी और स्टेजिंग एरिया या इंडेक्स

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

हमें Git के मूल वर्कफ़्लो को देखने दें।

Step 1 - आप कार्यशील निर्देशिका से एक फ़ाइल को संशोधित करते हैं।

Step 2 - आप इन फ़ाइलों को स्टेजिंग क्षेत्र में जोड़ते हैं।

Step 3- आप चरणबद्ध क्षेत्र से फ़ाइलों को स्थानांतरित करने वाले प्रतिबद्ध संचालन करते हैं। पुश ऑपरेशन के बाद, यह परिवर्तन को स्थायी रूप से गिट रिपॉजिटरी में संग्रहीत करता है।

मान लीजिए कि आपने दो फ़ाइलों को संशोधित किया है, जिसका नाम "Sort.c" और "search.c" है और आप प्रत्येक ऑपरेशन के लिए दो अलग-अलग कमिट चाहते हैं। आप स्टेजिंग क्षेत्र में एक फ़ाइल जोड़ सकते हैं और कमिट कर सकते हैं। पहली प्रतिबद्ध के बाद, किसी अन्य फ़ाइल के लिए समान प्रक्रिया दोहराएं।

# First commit
[bash]$ git add sort.c

# adds file to the staging area
[bash]$ git commit –m “Added sort operation”

# Second commit
[bash]$ git add search.c

# adds file to the staging area
[bash]$ git commit –m “Added search operation”

धब्बे

बूँद के लिए खड़ा है Binary Large Obअस्वीकृत। फ़ाइल के प्रत्येक संस्करण को बूँद द्वारा दर्शाया जाता है। एक बूँद फ़ाइल डेटा रखती है, लेकिन फ़ाइल के बारे में कोई मेटाडेटा शामिल नहीं करती है। यह एक बाइनरी फ़ाइल है, और Git डेटाबेस में, इसे उस फ़ाइल के SHA1 हैश के रूप में नामित किया गया है। Git में, फ़ाइलों को नामों से संबोधित नहीं किया जाता है। सब कुछ सामग्री-संबोधित है।

पेड़

वृक्ष एक वस्तु है, जो एक निर्देशिका का प्रतिनिधित्व करता है। यह ब्लब्स के साथ-साथ अन्य उप-निर्देशिकाओं को भी धारण करता है। एक पेड़ एक द्विआधारी फ़ाइल है जो ब्लॉब्स और पेड़ों को संदर्भित करता है जिसे नाम भी दिया जाता हैSHA1 पेड़ की वस्तु का हैश।

करता है

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

शाखाओं

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

टैग

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

क्लोन

क्लोन ऑपरेशन रिपॉजिटरी का उदाहरण बनाता है। क्लोन ऑपरेशन न केवल वर्किंग कॉपी की जांच करता है, बल्कि यह संपूर्ण रिपॉजिटरी को भी दिखाता है। उपयोगकर्ता इस स्थानीय भंडार के साथ कई ऑपरेशन कर सकते हैं। नेटवर्किंग के शामिल होने का एकमात्र समय तब होता है जब रिपॉजिटरी इंस्टेंस को सिंक्रनाइज़ किया जा रहा होता है।

खींचें

पुल ऑपरेशन एक दूरस्थ रिपॉजिटरी उदाहरण से स्थानीय एक में परिवर्तन की प्रतिलिपि बनाता है। पुल ऑपरेशन का उपयोग दो रिपॉजिटरी इंस्टेंस के बीच सिंक्रोनाइज़ेशन के लिए किया जाता है। यह सबवर्सन में अपडेट ऑपरेशन के समान है।

धक्का दें

पुश ऑपरेशन प्रतियां एक स्थानीय रिपॉजिटरी उदाहरण से दूरस्थ एक में बदल जाती हैं। इसका उपयोग परिवर्तन को स्थायी रूप से गिट रिपॉजिटरी में संग्रहीत करने के लिए किया जाता है। यह सबवर्सन में प्रतिबद्ध संचालन के समान है।

सिर

HEAD एक पॉइंटर है, जो हमेशा ब्रांच में लेटेस्ट कमेंट की ओर इशारा करता है। जब भी आप कोई प्रतिबद्ध करते हैं, तो HEAD को नवीनतम प्रतिबद्ध के साथ अद्यतन किया जाता है। शाखाओं के प्रमुखों में संग्रहीत किया जाता है.git/refs/heads/ निर्देशिका।

[CentOS]$ ls -1 .git/refs/heads/
master

[CentOS]$ cat .git/refs/heads/master
570837e7d58fa4bccd86cb575d884502188b0c49

संशोधन

संशोधन स्रोत कोड के संस्करण का प्रतिनिधित्व करता है। Git में संशोधन कमिट द्वारा दर्शाए गए हैं। इन कमिटों द्वारा पहचान की जाती हैSHA1 सुरक्षित हैश।

यूआरएल

URL गिट रिपॉजिटरी के स्थान का प्रतिनिधित्व करता है। Git URL को कॉन्फिगर फाइल में स्टोर किया जाता है।

[tom@CentOS tom_repo]$ pwd
/home/tom/tom_repo

[tom@CentOS tom_repo]$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = [email protected]:project.git
fetch = +refs/heads/*:refs/remotes/origin/*