जैसा कि यह git के साथ टैग किया गया है, मुझे आशा है कि मेरे SVN ज्ञान की कमी उपेक्षित है।
वर्तमान में मैं एक रेपो का क्लोनिंग कर रहा हूं और एक विशिष्ट शाखा का उपयोग कर रहा हूं जो कि gitk का उपयोग कर रही है।
आप केवल एक विशिष्ट शाखा ही नहीं, बल्कि पूरे दूरस्थ भंडार का क्लोन बना रहे हैं।
रिपॉजिटरी को डेटाबेस के रूप में सबसे अच्छी तरह से कल्पना की जाती है, इसलिए आप दूरस्थ डेटाबेस की वर्तमान स्थिति का एक क्लोन बना रहे हैं। लेकिन उसके बाद, आप उस डेटाबेस की अपनी प्रति पर काम कर रहे हैं; यदि आप प्रतिबद्ध हैं, तो आप अपने स्थानीय डेटाबेस को बदल देते हैं।
fetch
आदेश दूरदराज के एक साथ सिंक में स्थानीय डेटाबेस रखने के लिए प्रयोग किया जाता है।
आमतौर पर उस स्थानीय डेटाबेस से, आप काम करने के लिए एक शाखा की जाँच करते हैं। यह git के लिए आंतरिक मार्कर जैसा कुछ और नहीं है, जहां आपका वर्तमान कार्य शुरू हुआ है।
कहते हैं, आप एक साधारण भंडार पर काम कर रहे हैं, जहाँ इसके अलावा कोई शाखा नहीं है master
, आप .git
"जादू" का अनावरण करने के लिए फ़ोल्डर में देख सकते हैं:
मान लें कि आपकी अंतिम प्रतिबद्धता (चालू master
) थी 182e8220b404437b9e43eb78149d31af79040c66
, तो आप ठीक उसी के तहत पाएंगे cat .git/refs/heads/master
।
इससे आप एक नई शाखा को छोड़ देते हैं git checkout -b mybranch
, आपको फ़ाइल में ठीक उसी सूचक मिलेगा cat .git/refs/heads/mybranch
।
शाखाएं "संकेत" से ज्यादा कुछ नहीं हैं। "वर्किंग" मार्कर को कहा जाता है HEAD
।
यदि आप जानना चाहते हैं कि आपका स्थान कहां HEAD
है:
cat .git/HEAD
जो कहता है ref: refs/heads/mybranch
, उदाहरण के लिए , जो cat .git/refs/heads/mybranch
कमिट हैश की ओर इशारा करता है78a8a6eb6f82eae21b156b68d553dd143c6d3e6f
वास्तविक कमिट्स को objects
फ़ोल्डर के तहत संग्रहीत किया जाता है (यह अपने आप में एक विषय कैसे है)।
प्रोजेक्ट फ़ोल्डर में केवल उस शाखा की सामग्री है और मैं SVN की तरह सभी शाखाओं को नहीं देख सकता, जो मेरे लिए थोड़ा भ्रमित करने वाला है।
working directory
एक पूरे के रूप में "गिट-डेटाबेस" के साथ भ्रमित न करें । जैसा कि मैंने ऊपर कहा, आपकी कार्यशील निर्देशिका केवल (शायद) एक सबसेट का स्नैपशॉट है।
मान लें कि आपकी अलग-अलग शाखाएँ हैं, आपकी कार्यशील निर्देशिका केवल उस शाखा पर काम करने के लिए समर्पित है (हालाँकि आप वहाँ से कहीं और काम डाल सकते हैं)।
आमतौर पर, यदि आप यह देखना चाहते हैं कि परियोजना के लिए कौन सी शाखाएँ परिभाषित हैं, तो आपको इसकी संभावना है
git branch
स्थानीय शाखाओं के लिए
git branch --remote
दूरस्थ शाखाओं के लिए
git branch -a
दोंनो के लिए
(या git branch -v
)
चूँकि git एक वितरित संस्करण नियंत्रण प्रणाली है जो न केवल संभव है, बल्कि स्थानीय / दूरस्थ विभिन्न शाखाओं को बनाने के लिए प्रोत्साहित किया जाता है।
मेरी विशिष्ट कार्यप्रवाह है:
- एक सुविधा शाखा बंद शाखा
- उसी से डब्ल्यूआईपी (कार्य प्रगति पर) शाखा को शाखा
- हालांकि आप चाहते हैं कि काम करते हैं - भले ही आप एक पंक्ति के बाद प्रतिबद्ध हों; इससे कोई फर्क नहीं पड़ता
जब सुविधा पूरी हो जाती है:
- स्क्वैश /
WIP
ब्रांच को फिर से काम करना (इंटरएक्टिव रिबासिंग के साथ) = उससे एक सिंगल कमिट करें
WIP
शाखा को फ़ीचर शाखा में मर्ज करें और प्रस्ताव करें कि (यदि आप गिथब के साथ काम करते हैं तो उस ऑफ़र को "पुल अनुरोध" कहा जाएगा) स्थिर (मास्टर) शाखा में एकीकृत करने के लिए।
इसके अलावा, मैं यह जानना चाहूंगा कि ऐसी प्रक्रिया को कैसे संभाला जाए जहां मुझे एक ही समय में दो शाखाओं पर wprl करने की आवश्यकता है, उदाहरण के लिए, मुझे मास्टर पर एक हॉटफ़िक्स बनाने की आवश्यकता है, लेकिन दूसरी शाखा की सामग्री भी रखें।
यह इस बात पर निर्भर करता है कि आपकी परियोजना कैसे संरचित है:
कहते हैं कि आपके पास एक स्थिर गुरु है। और सुविधाएँ केवल उस स्थिर शाखा से विकसित होती हैं - इसलिए यह आमतौर पर एक सुविधा शाखा के पीछे होती है। तब आपके पास मास्टर पर एक अंतिम प्रतिबद्धता होगी जो कि सुविधा शाखा का मूल होगा।
फिर आप मास्टर ब्रांच पर कमिटमेंट करेंगे और तय कर सकते हैं कि दोनों ब्रांच को एक साथ मर्ज करना है या रिबेज करना है (जो कि यूजर्स के लिए एक तरह का मर्ज है ऐसा कहने के लिए)।
या आप हमेशा शाखाओं (जैसे master
) में परिवर्तन करने में सक्षम होते हैं और उन्हें अन्य शाखाओं पर चेरी करते हैं।
जीआईटी में रेपो से क्लोन की गई शाखा को शामिल करने के लिए फोल्डर बनाने के लिए एक सिफारिश नाम कन्वेंशन क्या है, उदाहरण myproject-branchname
यह आप पर निर्भर है।
आमतौर पर, आप रिपॉजिटरी नाम के साथ समाप्त होते हैं।
लेकिन ऐसे मौके आते हैं, जब यह नहीं चाहता है:
उदाहरण के लिए, आप ओह-माई-ज़श को git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
यहां पर क्लोन करते हैं .oh-my-zsh
जिसे स्पष्ट रूप से लक्ष्य के रूप में नामित किया गया है।