गिट में, शाखाएं निर्देशित एक विश्वकोश ग्राफ (डीएजी) में काम करने के लिए पॉइंटर्स (संदर्भ) हैं। इसका मतलब है कि एक शाखा को हटाने से केवल संदर्भों को हटा दिया जाता है, जो कुछ डीएजी में पहुंचने योग्य नहीं हो सकता है, इस प्रकार अदृश्य। लेकिन हटाए गए शाखा पर मौजूद सभी काम अभी भी भंडार में होंगे, कम से कम जब तक पहुंचने योग्य काम नहीं किया जाता है (उदाहरण के लिए git gc
का उपयोग करना)।
ध्यान दें कि git branch -d
शाखा को हटाने से इंकार कर देगा अगर यह सुनिश्चित नहीं हो सकता कि इसे हटाने से पहुंचने योग्य काम नहीं छोड़ेगा। शाखा के हटाने को मजबूर करने के लिए आपको मजबूत git branch -D
का उपयोग करने की आवश्यकता है यदि यह पहुंचने योग्य काम छोड़ सकता है।
ध्यान दें कि पहुंचने योग्य, यदि वे मौजूद हैं, तो वे केवल हटाए गए शाखा की अंतिम युक्ति के बीच ही काम करते हैं और या तो एक प्रतिबद्धता जो किसी अन्य मौजूदा शाखा, किसी भी टैग की गई प्रतिबद्धता या शाखाबद्ध बिंदु पर विलय हो जाती है; जो भी बाद में हो। निम्नलिखित स्थिति में उदाहरण के लिए:
----O----*----*----/M----* <-- master <-- HEAD
\ /
\--.----.--/--x---y <-- deleted branch
केवल करता है 'एक्स' और 'y' शाखा को हटाने के बाद पहुंच योग्य नहीं बन जाएगा।
आप किसी हटाए गए शाखा पर संचालित gc.reflogExpire
अवधि के भीतर यदि 90 दिनों के लिए डिफ़ॉल्ट, आप सिर reflog में दर्ज किसी हटाए शाखा के अंतिम टिप के लिए होता है (git reflog show HEAD
, या git log --oneline --walk-reflogs HEAD
देखें)। हटाए गए पॉइंटर को पुनर्प्राप्त करने के लिए आपको हेड रीफ्लॉग का उपयोग करने में सक्षम होना चाहिए। ध्यान दें कि इस मामले में, केवल एक हटाई गई शाखा में पहुंचने योग्य काम gc.reflogExpireUnreachable
अवधि के भीतर छंटनी (हटाने) से संरक्षित किया जाएगा, जो डिफ़ॉल्ट रूप से 30 दिन है।
आप सिर के लिए reflog में एक बस नष्ट कर दिया शाखा की नोक नहीं मिल रहा है, तो आप को खोजने के लिए git fsck
उपयोग करने के लिए खोजने के लिए "पहुँच योग्य नहीं <SHA1> प्रतिबद्ध" कोशिश कर सकते हैं, और उन (git show <sha1>
या git log <sha1>
के माध्यम से) की जांच हटाई गई शाखा की नोक।
कैसे आप किसी हटाए गए शाखा की नोक को खोजने पर स्वतंत्र, आप एक बस नष्ट कर दिया शाखा का उपयोग कर
git branch <deleted-branch> <found-sha1-id>
नोट हालांकि एक शाखा के लिए कि reflog खो जाएगा फिर से बनाने के अकृत, या बल्कि कर सकते हैं।
वहाँ भी जो दिए गए नाम के साथ एक शाखा टिप के निशान खोजने के लिए और फिर से शुरू (हटाना रद्द) यह मदद करता है contrib/
में git-resurrect.sh स्क्रिप्ट है।
उत्तर के लिए धन्यवाद। क्या आप स्पष्ट कर सकते हैं कि "प्रत्येक प्रतिबद्धता का पूरा स्रोत पेड़" है? जैसा कि मैं इसे समझता हूं, गिट में प्रत्येक प्रतिबद्धता डेल्टा का एक सेट है जो एक पैरेंट प्रतिबद्धता को संदर्भित करता है, न कि पूरे पेड़ पर। –
नहीं, प्रत्येक प्रतिबद्धता किसी दिए गए बिंदु पर पेड़ की स्थिति है। डेल्टा को बाद में प्रदर्शित करने और पुन: उपयोग करने के लिए गणना की जाती है और क्या नहीं, लेकिन प्रतिबद्ध आईडी पूरे पेड़ का हैश है। – ben
@ केन लियू: एक प्रतिबद्धता में शून्य या अधिक माता-पिता के लिए पॉइंटर्स होते हैं, एक वृक्ष वस्तु और प्रतिबद्धता के बारे में कुछ मेटाडेटा होता है। प्रतिबद्धता, इसलिए विशिष्ट रूप से दोनों स्रोत पेड़ की पहचान करती है और, जब उसके माता-पिता के खिलाफ देखा जाता है, तो यह परिवर्तन जो इसे पेश करता है। –