2010-04-10 25 views
130

svn से आ रहा है, बस गिट से परिचित होना शुरू कर दिया।क्या गिट में एक शाखा को हटाना इतिहास से हटा देता है?

जब गिट में एक शाखा हटा दी जाती है, तो क्या इसे इतिहास से हटा दिया जाता है?

svn में, आप डिलीट ऑपरेशन (रिवर्स विलय) को वापस कर आसानी से शाखा पुनर्प्राप्त कर सकते हैं। Svn में सभी deletes की तरह, शाखा वास्तव में कभी नहीं हटाया जाता है, यह सिर्फ वर्तमान पेड़ से हटा दिया गया है।

यदि शाखा वास्तव में गिट में इतिहास से हटा दी जाती है, तो उस शाखा से विलय किए गए परिवर्तनों का क्या होता है? क्या वे बरकरार हैं?

उत्तर

176

शाखाएं गिट में बसने के लिए पॉइंटर्स हैं। गिट में प्रत्येक प्रतिबद्धता का एक पूर्ण स्रोत पेड़ होता है, यह svn से एक बहुत ही अलग संरचना है जहां सभी शाखाएं और टैग (सम्मेलन द्वारा) विशेष 'ट्रंक' के साथ भंडार के अलग 'फ़ोल्डर' में रहते हैं।

यदि शाखा हटा दी जाने से पहले किसी अन्य शाखा में विलय कर दी गई थी तो सभी शाखाएं तब भी दूसरी शाखा से पहुंच योग्य होंगी जब पहली शाखा हटा दी जाएगी। वे ठीक वैसे ही रहते हैं जैसे वे थे।

यदि शाखा किसी अन्य शाखा में विलय किए बिना हटा दी जाती है तो उस शाखा में काम करता है (उस बिंदु तक जहां तक ​​एक प्रतिबद्धता से फंसे हुए अभी तक पहुंचने योग्य) दिखाई देगी।

काम अभी भी भंडार में बनाए रखा जाएगा और हटाए जाने के तुरंत बाद उन्हें पुनर्प्राप्त करना संभव है, लेकिन आखिर में वे कचरा इकट्ठा हो जाएंगे।

+2

उत्तर के लिए धन्यवाद। क्या आप स्पष्ट कर सकते हैं कि "प्रत्येक प्रतिबद्धता का पूरा स्रोत पेड़" है? जैसा कि मैं इसे समझता हूं, गिट में प्रत्येक प्रतिबद्धता डेल्टा का एक सेट है जो एक पैरेंट प्रतिबद्धता को संदर्भित करता है, न कि पूरे पेड़ पर। –

+0

नहीं, प्रत्येक प्रतिबद्धता किसी दिए गए बिंदु पर पेड़ की स्थिति है। डेल्टा को बाद में प्रदर्शित करने और पुन: उपयोग करने के लिए गणना की जाती है और क्या नहीं, लेकिन प्रतिबद्ध आईडी पूरे पेड़ का हैश है। – ben

+1

@ केन लियू: एक प्रतिबद्धता में शून्य या अधिक माता-पिता के लिए पॉइंटर्स होते हैं, एक वृक्ष वस्तु और प्रतिबद्धता के बारे में कुछ मेटाडेटा होता है। प्रतिबद्धता, इसलिए विशिष्ट रूप से दोनों स्रोत पेड़ की पहचान करती है और, जब उसके माता-पिता के खिलाफ देखा जाता है, तो यह परिवर्तन जो इसे पेश करता है। –

62

गिट में, शाखाएं निर्देशित एक विश्वकोश ग्राफ (डीएजी) में काम करने के लिए पॉइंटर्स (संदर्भ) हैं। इसका मतलब है कि एक शाखा को हटाने से केवल संदर्भों को हटा दिया जाता है, जो कुछ डीएजी में पहुंचने योग्य नहीं हो सकता है, इस प्रकार अदृश्य। लेकिन हटाए गए शाखा पर मौजूद सभी काम अभी भी भंडार में होंगे, कम से कम जब तक पहुंचने योग्य काम नहीं किया जाता है (उदाहरण के लिए 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 स्क्रिप्ट है।

+0

बहुत बढ़िया! 'गिट रीफ्लॉग शो हेड' ने प्रतिबद्धता सूचीबद्ध की और मैंने एक नई शाखा बनाई जैसे आपने कहा, सही। –

1

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