गिट में, शाखाएं केवल उस प्रतिबद्धता के संकेतक हैं जो उस शाखा में नए काम जोड़े जाते हैं। दूसरे शब्दों में, एक बार पॉइंटर स्थानांतरित हो जाने के बाद, उस स्मृति पर कोई स्मृति नहीं होती है। मेरे सिर को पहली बार लपेटने के लिए यह एक कठिन अवधारणा थी। शायद यह नाम है: "शाखा" मुझे किनारों से जुड़े कई नोड्स के बारे में सोचती है, लेकिन गिट में, एक शाखा वास्तव में केवल एक नोड है।
git log
कर्तव्यपूर्वक एनोटेट्स किसी भी शाखा के साथ काम करता है जो उन्हें इंगित कर रहा है। उदाहरण के लिए, मैंने ब्रांच मास्टर पर "एक", "दो" और "तीन" और "यूनो", "डॉस" और "ट्रेस" शाखा सुविधा पर "रे" बनाया है, फिर मर्ज किए गए फीचर को मास्टर में वापस लाया है। यह सिर्फ बात कर:
* 9eb6e93 (HEAD, master) Merge branch 'feature'
|\
| * 523e2ac (feature) tres
| * 6d3cc0f dos
| * 1bc0b2e uno
* | d39734b three
* | 779d37b two
* | facbcbf one
|/
* 58848f4 Initial commit.
यह सोच कर कि "(फीचर)" एनोटेशन किसी भी तरह सही पर कि शाखा में बात कर रहा है, लेकिन यह नहीं है में मूर्ख बनाया जाना बहुत आसान है: यहाँ क्या git log
मुझसे कहता है इससे पहले कि मैं शाखा हटाना है 523e2ac
प्रतिबद्ध करने के लिए।
ध्यान दें कि, डिफ़ॉल्ट रूप से, जब गिट हमारे मामले में विलय प्रतिबद्धता (9eb6e93
) बनाता है, तो यह स्वचालित रूप से एक टिप्पणी जोड़ता है जिसमें कहा गया है कि यह शाखा 'फीचर' विलय कर रहा है, इसलिए वहां एक शाखा होने के कुछ रिकॉर्ड हैं, लेकिन यह सिर्फ एक टिप्पणी है, और कुछ नहीं।
जब मैं शाखा 'सुविधा' को हटाना, कुछ भी नहीं, सिवाय इसके कि प्रतिबद्ध 523e2ac
नहीं रह गया है के साथ लेबल है बदल जाता है "(फीचर)":
* 9eb6e93 (HEAD, master) Merge branch 'feature'
|\
| * 523e2ac tres
| * 6d3cc0f dos
| * 1bc0b2e uno
* | d39734b three
* | 779d37b two
* | facbcbf one
|/
* 58848f4 Initial commit.
तो, आपके सवाल का जवाब देना, नहीं, एक बार आप है एक शाखा हटा दी गई है, आप उस शाखा नाम के साथ प्रतिबद्धता को एनोटेट करने के लिए git log
नहीं प्राप्त कर सकते हैं (क्योंकि यह अब मौजूद नहीं है)। हालांकि, आपके पास कुछ विकल्प हैं:
शाखा को न हटाएं।जब आप git branch
टाइप करते हैं तो यह आपकी स्क्रीन को बंद कर देता है, इसके अलावा शाखाओं को छोड़ने में कोई हानि नहीं है। साथ ही, आप शाखा नामों का पुन: उपयोग करना चाह सकते हैं, जो बाद में समस्याएं पैदा कर सकती हैं यदि आप अपनी शाखाएं नहीं हटाते हैं।
शाखा हटाने से पहले प्रतिबद्धता को टैग करें। एक टैग वास्तव में एक शाखा है जो हिलती नहीं है। आप टैग नाम को शाखा नाम के समान भी बना सकते हैं।
विलय प्रतिबद्धताओं की स्वचालित टिप्पणी के साथ स्वयं को संतुष्ट करें। जैसा कि पहले उल्लेख किया गया है, जब गिट एक विलय करता है, डिफ़ॉल्ट रूप से, यह शाखा के अस्तित्व में एक रिकॉर्ड बनाते हुए, प्रतिबद्ध टिप्पणी में विलय के नाम का संदर्भ देता है। मेरे लिए, गिट में शाखाओं के काम के आधार पर यह सबसे साफ समाधान है। चूंकि एक शाखा वास्तव में काम की श्रृंखला का संदर्भ नहीं देती है, यह वास्तव में केवल ऐतिहासिक परिणाम है कि एक शाखा मौजूद थी।
शाखा इतिहास का दूसरा स्थान आपके रिफ्लॉग हो सकता है, जो बस लॉग करता है कि आप किन शाखाओं को स्विच कर रहे हैं। यह ज्यादातर आपदा रिकवरी के लिए है (ओउप्स, मेरा मतलब उस शाखा को हटाने का मतलब नहीं था!), और यह उस शाखा इतिहास के लिए वास्तव में उपयोगी नहीं है जिसके बारे में आप बात कर रहे हैं।
"शाखाएं केवल एक प्रतिबद्धता के संकेतक हैं" - ** + 1 **। इसे साबित करने के लिए, एक गिट प्रोजेक्ट निर्देशिका में, 'ls .git/refs/head' चलाएं। अरे देखो, आपकी सभी शाखाएं फाइलें हैं! अब उन बिल्ली में से एक बिल्ली 'बिल्ली'। इसमें केवल एक विशेष प्रतिबद्धता का हैश होता है। टैग 'रेफ/टैग' में समान हैं। इसे देखकर मुझे वास्तव में समझने में मदद मिली कि "शाखा वास्तव में केवल एक नोड" है। –
@ डेविड - यहां तक कि अधिक प्रमाण: 'cp ./git/refs/heads/master .git/refs/head/fancypants'। अब 'गिट शाखा'। हे देखो, एक नई शाखा, जो सटीक समान वंशावली को 'मास्टर' के रूप में साझा करने लगती है! ऐसा इसलिए है क्योंकि शाखाओं का कोई इतिहास नहीं है; ** ** ** एक इतिहास और एक वंशावली है। एक शाखा सिर्फ एक प्रतिबद्धता के लिए एक लेबल है। –