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

लिनक्स पर स्थापित करना
आमतौर पर गिट लिनक्स वितरण का हिस्सा है और पहले से ही स्थापित है, क्योंकि यह एक उपकरण है जिसे मूल रूप से लिनक्स कर्नेल विकास के लिए लिखा गया था। लेकिन ऐसे हालात हैं जब ऐसा नहीं है। जांचने के लिए, आपको एक टर्मिनल खोलना होगा और लिखना होगा: git --version. यदि आपको एक सुगम उत्तर मिलता है, तो कुछ भी स्थापित करने की आवश्यकता नहीं है। एक टर्मिनल खोलें और Ubuntu पर Git इंस्टॉल करें । मैं उबंटू पर काम कर रहा हूं, इसलिए मैं आपको बता सकता हूं कि इसके लिए क्या लिखना है: sudo apt-get install git।MacOS पर इंस्टॉल करना
यहां भी, आपको पहले यह जांचना होगा कि क्या Git पहले से मौजूद है। यदि आपके पास यह नहीं है, तो इसे प्राप्त करने का सबसे आसान तरीका यहां नवीनतम संस्करण डाउनलोड करना है । यदि Xcode स्थापित है, तो Git निश्चित रूप से स्वचालित रूप से स्थापित हो जाएगा।गिट सेटिंग्स
गिट में उपयोगकर्ता के लिए उपयोगकर्ता सेटिंग्स हैं जो काम सबमिट करेंगे। यह समझ में आता है और आवश्यक है, क्योंकि Git इस जानकारी को लेखक क्षेत्र के लिए लेता है जब एक कमिट बनाया जाता है। निम्नलिखित आदेश चलाकर अपनी सभी परियोजनाओं के लिए एक उपयोगकर्ता नाम और पासवर्ड सेट करें:
git config --global user.name "Ivan Ivanov"
git config --global user.email ivan.ivanov@gmail.com
यदि आपको किसी विशिष्ट परियोजना के लेखक को बदलने की आवश्यकता है, तो आप "--ग्लोबल" को हटा सकते हैं। यह हमें निम्नलिखित देगा:
git config user.name "Ivan Ivanov"
git config user.email ivan.ivanov@gmail.com
थोड़ा सिद्धांत ...
विषय में गोता लगाने के लिए, हमें आपको कुछ नए शब्दों और कार्यों से परिचित कराना चाहिए...- गिट रिपॉजिटरी
- वादा करना
- शाखा
- मर्ज
- संघर्ष
- खींचना
- धकेलना
- कैसे कुछ फ़ाइलों को अनदेखा करने के लिए (.gitignore)
गिट में स्थितियां
Git की कई मूर्तियाँ हैं जिन्हें समझने और याद रखने की आवश्यकता है:- ट्रैक न किए गए
- संशोधित
- मंचन
- प्रतिबद्ध
आपको इसे कैसे समझना चाहिए?
ये ऐसी स्थितियाँ हैं जो हमारे कोड वाली फ़ाइलों पर लागू होती हैं:- एक फ़ाइल जो बनाई गई है लेकिन अभी तक रिपॉजिटरी में नहीं जोड़ी गई है, उसकी "अनट्रैक" स्थिति है।
- जब हम उन फ़ाइलों में परिवर्तन करते हैं जो पहले से ही गिट रिपॉजिटरी में जोड़ी जा चुकी हैं, तो उनकी स्थिति "संशोधित" होती है।
- जिन फाइलों में हमने बदलाव किया है, उनमें से हम उन फाइलों का चयन करते हैं जिनकी हमें जरूरत है और इन कक्षाओं को "चरणबद्ध" स्थिति में बदल दिया जाता है।
- चरणबद्ध स्थिति में तैयार फाइलों से एक कमिट बनाया जाता है और गिट रिपॉजिटरी में जाता है। उसके बाद, "मंचित" स्थिति वाली कोई फ़ाइल नहीं है। लेकिन अभी भी ऐसी फाइलें हो सकती हैं जिनकी स्थिति "संशोधित" हो।

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

एक शाखा क्या है?
एक शाखा कुछ प्रतिबद्ध करने के लिए सूचक है। क्योंकि एक कमिट जानता है कि कौन सी कमिट इससे पहले होती है, जब कोई ब्रांच किसी कमिट की ओर इशारा करती है, तो पिछले सभी कमिट भी उस पर लागू होते हैं। तदनुसार, हम कह सकते हैं कि आप एक ही कमिट की ओर इशारा करते हुए जितनी चाहें उतनी शाखाएँ रख सकते हैं। काम शाखाओं में होता है, इसलिए जब कोई नया कमिट बनाया जाता है, तो ब्रांच अपने पॉइंटर को हाल के कमिट में ले जाती है।गिट के साथ शुरुआत करना
आप एक स्थानीय रिपॉजिटरी के साथ-साथ एक रिमोट के साथ भी काम कर सकते हैं। आवश्यक आदेशों का अभ्यास करने के लिए, आप स्वयं को स्थानीय रिपॉजिटरी तक सीमित कर सकते हैं। यह केवल .git फ़ोल्डर में स्थानीय रूप से प्रोजेक्ट की सभी जानकारी संग्रहीत करता है। यदि हम दूरस्थ रिपॉजिटरी के बारे में बात कर रहे हैं, तो सभी जानकारी दूरस्थ सर्वर पर कहीं संग्रहीत की जाती है: केवल प्रोजेक्ट की एक प्रति स्थानीय रूप से संग्रहीत की जाती है। आपकी स्थानीय प्रति में किए गए परिवर्तन दूरस्थ रिपॉजिटरी में पुश (गिट पुश) किए जा सकते हैं। यहां और नीचे हमारी चर्चा में, हम कंसोल में गिट के साथ काम करने के बारे में बात कर रहे हैं। बेशक, आप किसी प्रकार के GUI-आधारित समाधान (उदाहरण के लिए, IntelliJ IDEA) का उपयोग कर सकते हैं, लेकिन पहले आपको यह पता लगाना चाहिए कि कौन से कमांड निष्पादित किए जा रहे हैं और उनका क्या मतलब है।एक स्थानीय रिपॉजिटरी में गिट के साथ काम करना
अगला, मेरा सुझाव है कि आप साथ चलें और उन सभी चरणों का पालन करें जो मैंने लेख पढ़ते समय किया था। इससे सामग्री की आपकी समझ और निपुणता में सुधार होगा। अच्छा, बोन एपीटिट! :) एक स्थानीय रिपॉजिटरी बनाने के लिए, आपको लिखने की जरूरत है:
git init

git status

- गिट एड-ए - सभी फाइलों को "चरणबद्ध" स्थिति में जोड़ें
- गिट ऐड। - इस फ़ोल्डर और सभी सबफ़ोल्डर्स से सभी फ़ाइलें जोड़ें। अनिवार्य रूप से, यह पिछले वाले जैसा ही है
- git add <file name> — एक विशिष्ट फ़ाइल जोड़ता है। यहां आप कुछ पैटर्न के अनुसार फाइल जोड़ने के लिए रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं। उदाहरण के लिए, git add *.java: इसका मतलब है कि आप केवल जावा एक्सटेंशन वाली फाइलें जोड़ना चाहते हैं।
git add *.txt
स्थिति की जाँच करने के लिए, हम पहले से ज्ञात कमांड का उपयोग करते हैं:
git status

git commit -m "all txt files were added to the project"

git log

git status

git status

git diff

git add test_resource.txt
git commit -m "added hello word! to test_resource.txt"
सभी कमिट्स को देखने के लिए, लिखें:
git log

git add GitTest.java
git commit -m "added GitTest.java"
git status

.gitignore के साथ कार्य करना
स्पष्ट रूप से, हम केवल स्रोत कोड को अकेले रखना चाहते हैं, और कुछ नहीं, रिपॉजिटरी में। तो और क्या हो सकता है? कम से कम, संकलित कक्षाएं और/या विकास वातावरण द्वारा उत्पन्न फाइलें। Git को उन्हें अनदेखा करने के लिए कहने के लिए, हमें एक विशेष फ़ाइल बनाने की आवश्यकता है। ऐसा करें: प्रोजेक्ट के रूट में .gitignore नाम की एक फाइल बनाएं। इस फ़ाइल की प्रत्येक पंक्ति अनदेखा करने के लिए एक पैटर्न का प्रतिनिधित्व करती है। इस उदाहरण में, .gitignore फ़ाइल इस तरह दिखेगी:
```
*.class
target/
*.iml
.idea/
```
चलो एक नज़र मारें:
- पहली पंक्ति .class एक्सटेंशन वाली सभी फाइलों को अनदेखा करना है
- दूसरी पंक्ति "लक्ष्य" फ़ोल्डर और उसमें मौजूद सभी चीज़ों को अनदेखा करना है
- तीसरी लाइन .iml एक्सटेंशन वाली सभी फाइलों को इग्नोर करना है
- चौथी लाइन .idea फोल्डर को इग्नोर करना है
git status


git add .gitignore
git commit -m "added .gitignore file"
और अब सच्चाई का क्षण: हमारे पास एक संकलित वर्ग GitTest.class है जो "अनट्रैक" है, जिसे हम Git रिपॉजिटरी में नहीं जोड़ना चाहते थे। अब हमें .gitignore फ़ाइल का प्रभाव देखना चाहिए:
git status

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

- हम जिस (99% मामलों में) हैं, उसके आधार पर एक नई शाखा बनाएँ
- एक विशिष्ट प्रतिबद्धता के आधार पर एक शाखा बनाएँ (मामलों का 1%)
चलिए एक विशिष्ट कमिट के आधार पर एक शाखा बनाते हैं
हम कमिट के विशिष्ट पहचानकर्ता पर भरोसा करेंगे। इसे खोजने के लिए, हम लिखते हैं:
git log

git checkout -b development 6c44e53d06228f888f2f454d3cb8c1c976dd73f8
मास्टर शाखा से केवल पहले दो कमिट के साथ एक शाखा बनाई जाती है। इसे सत्यापित करने के लिए, हम पहले एक अलग शाखा में स्विच करना सुनिश्चित करते हैं और वहां कमिट की संख्या देखते हैं:
git status
git log

git branch -a

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

git checkout -b feature/update-txt-files

युद्ध वियोजन
इससे पहले कि हम यह पता लगाएँ कि संघर्ष क्या है, हमें एक शाखा को दूसरी शाखा में विलय करने के बारे में बात करने की आवश्यकता है। यह चित्र एक शाखा को दूसरी शाखा में मिलाने की प्रक्रिया को दर्शाता है:

git add *.txt
git commit -m "updated txt files"
git log

git checkout master
git merge feature/update-txt-files
git log

git branch -D feature/update-txt-files
अब तक सब कुछ स्पष्ट है, हाँ? आइए स्थिति को जटिल करें: अब मान लें कि आपको txt फ़ाइल को फिर से बदलने की आवश्यकता है। लेकिन अब यह फाइल मास्टर ब्रांच में भी बदली जाएगी। दूसरे शब्दों में, यह समानांतर में बदल जाएगा। जब हम अपने नए कोड को मास्टर ब्रांच में मर्ज करना चाहते हैं तो Git यह पता नहीं लगा पाएगा कि क्या करना है। चल दर! हम मास्टर के आधार पर एक नई शाखा बनाएंगे, text_resource.txt में बदलाव करेंगे और इस काम के लिए एक कमिट बनाएंगे:
git checkout -b feature/add-header
... we make changes to the file

git add *.txt
git commit -m "added header to txt"

git checkout master
… we updated test_resource.txt

git add test_resource.txt
git commit -m "added master header to txt"
और अब सबसे दिलचस्प बिंदु: हमें फीचर/ऐड-हेडर शाखा से मास्टर में परिवर्तनों को मर्ज करने की आवश्यकता है। हम मास्टर ब्रांच में हैं, इसलिए हमें केवल लिखने की जरूरत है:
git merge feature/add-header
लेकिन परिणाम test_resource.txt फ़ाइल में एक विरोध होगा: 

- मास्टर ब्रांच में इस लाइन पर जो परिवर्तन थे, वे "<<<<<<< HEAD" और "====" के बीच पाए गए।
- फीचर/ऐड-हेडर शाखा में जो परिवर्तन थे वे "====" और ">>>>>>> फीचर/ऐड-हेडर" के बीच पाए गए।

git status

git add *.txt

git commit

रिमोट रिपॉजिटरी के साथ काम करना
अंतिम चरण कुछ और आदेशों का पता लगाना है जो दूरस्थ रिपॉजिटरी के साथ काम करने के लिए आवश्यक हैं। जैसा कि मैंने कहा, एक रिमोट रिपॉजिटरी कुछ ऐसी जगह है जहां रिपॉजिटरी स्टोर की जाती है और जिससे आप इसे क्लोन कर सकते हैं। वहां किस तरह के रिमोट रिपॉजिटरी हैं? उदाहरण:-
GitHub रिपॉजिटरी और सहयोगी विकास के लिए सबसे बड़ा स्टोरेज प्लेटफॉर्म है। मैंने पिछले लेखों में इसका वर्णन पहले ही कर दिया है। गिटहब
पर मेरा अनुसरण करें । मैं अक्सर उन क्षेत्रों में अपना काम दिखाता हूँ जहाँ मैं काम के लिए अध्ययन कर रहा हूँ। -
GitLab खुले स्रोत के साथ DevOps जीवनचक्र के लिए एक वेब-आधारित उपकरण है । यह अपने स्वयं के विकी, बग ट्रैकिंग सिस्टम , CI/CD पाइपलाइन और अन्य कार्यों के साथ कोड रिपॉजिटरी के प्रबंधन के लिए एक Git- आधारित प्रणाली है। Microsoft द्वारा GitHub को खरीदे जाने की खबर के बाद, कुछ डेवलपर्स ने GitLab में अपनी परियोजनाओं की नकल की।
-
BitBucket Mercurial और Git वर्जन कंट्रोल सिस्टम पर आधारित प्रोजेक्ट होस्टिंग और सहयोगी विकास के लिए एक वेब सेवा है। एक समय में गिटहब पर इसका बड़ा फायदा था कि यह मुफ्त निजी रिपॉजिटरी की पेशकश करता था। पिछले साल, GitHub ने भी इस क्षमता को सभी के लिए मुफ्त में पेश किया था।
-
और इसी तरह…
git clone https://github.com/romankh3/git-demo
अब परियोजना की पूरी स्थानीय प्रति है। यह सुनिश्चित करने के लिए कि परियोजना की स्थानीय प्रति नवीनतम है, आपको परियोजना को लिखकर खींचने की आवश्यकता है:
git pull


git add test_resource.txt
git commit -m "prepared txt for pushing"
इसे दूरस्थ रिपॉजिटरी में धकेलने का आदेश है:
git push

उपयोगी लिंक
- आधिकारिक गिट दस्तावेज । मैं इसे एक संदर्भ के रूप में अनुशंसा करता हूं।
GO TO FULL VERSION