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


189

Svn से आ रहा है, बस git से परिचित होना शुरू कर रहा हूं।

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

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

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

जवाबों:


249

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

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

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

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


3
जवाब के लिए धन्यवाद। क्या आप स्पष्ट कर सकते हैं कि "प्रत्येक वचन का एक पूर्ण स्रोत वृक्ष है" से आपका क्या मतलब है? जैसा कि मैंने इसे समझा है, git में प्रत्येक कमेटी डेल्टास का एक सेट है जो एक पूरे पेड़ को नहीं, बल्कि एक माता-पिता के लिए प्रतिबद्ध है।
केन लियू

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

9
@ केन लियू: यह ठीक उसी पर निर्भर करता है जो आप 'समाहित' करते हैं, लेकिन हां, अनिवार्य रूप से प्रत्येक प्रतिबद्ध में एक पूरा पेड़ होता है। ऑब्जेक्ट डेटाबेस ऑब्जेक्ट्स को आईडी द्वारा अनुक्रमित किया जाता है, इसलिए ऑब्जेक्ट्स को सभी ऑब्जेक्ट्स (पेड़ों और कमिट्स) के बीच साझा किया जाता है जो उन्हें संदर्भित करता है ताकि अंतर्निहित संग्रहण ओवरहेड उतना बुरा न हो जितना शुरू में लगता है। git में एक कुशल स्टोरेज ऑप्टिमाइज़ेशन (पैक फाइलें) भी हैं जो डिस्क स्थान का और भी अधिक कुशल उपयोग करती हैं।
सीबी बेली

22
"आखिरकार उन्हें कचरा एकत्र किया जाएगा" - आखिरकार कब?
BadHorsie


86

Git में, शाखाएँ एक निर्देशित चक्रीय ग्राफ (DAG) के कमिट्स में आने वाले बिंदु (संदर्भ) हैं। इसका मतलब यह है कि एक शाखा को हटाने से केवल कमिट्स के संदर्भ हटा दिए जाते हैं, जो कि डीएजी में कुछ कमिट कर सकते हैं, इस तरह अदृश्य हो सकते हैं। लेकिन सभी कमिट जो कि डिलीट की गई ब्रांच पर थीं, अभी भी रिपॉजिटरी में होंगी, कम से कम जब तक अगम्य कॉंटिट्यूड प्रून हो जाता है (उदाहरण के लिए git gc)।

ध्यान दें कि git branch -dएक शाखा को हटाने से इंकार कर दिया जाए तो यह सुनिश्चित नहीं किया जा सकता है कि इसे हटाने से यह पहुंच से बाहर नहीं होगा। आपको git branch -Dशाखा को हटाने के लिए मजबूत का उपयोग करने की आवश्यकता है यदि यह पहुंच से बाहर हो सकता है।

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

---- ओ ---- * ---- * ---- / एम ---- * <- मास्टर <- हेड
     \ /
      \ - - ---- .-- / - x --- y <- हटाई गई शाखा

केवल 'x' और 'y' को हटाता है, शाखा को हटाने के बाद पहुंच से बाहर हो जाएगा।

यदि आप gc.reflogExpire90 दिनों की अवधि के भीतर एक डिलीट ब्रांच पर काम करते हैं , तो आपके पास HEAD रिफ्लॉग (देखें git reflog show HEAD, या git log --oneline --walk-reflogs HEAD) में डिलीट ब्रांच का आखिरी सिरा होगा । आपको हटाए गए सूचक को पुनर्प्राप्त करने के लिए HEAD reflog का उपयोग करने में सक्षम होना चाहिए। यह भी ध्यान दें कि इस मामले में, केवल एक हटाए गए शाखा में पहुंच योग्य नहीं है, इस gc.reflogExpireUnreachableअवधि के भीतर छंटाई (हटाने) से संरक्षित किया जाएगा , जो कि डिफ़ॉल्ट रूप से 30 दिनों का है।

यदि आप HEAD के लिए किसी भी हटाए गए शाखा की नोक को नहीं ढूंढ सकते हैं, तो आप हटाए गए शाखा की नोक git fsckको खोजने के लिए "अगम्य प्रतिबद्ध <sha1>" खोजने के लिए उपयोग कर सकते हैं , और उन (माध्यम git show <sha1>से git log <sha1>) की जांच कर सकते हैं।

डिलीट ब्रांच की टिप कैसे मिलती है, इस पर स्वतंत्र, आप डिलीट को पूर्ववत कर सकते हैं, या केवल डिलीट की गई ब्रांच का उपयोग करके फिर से बना सकते हैं

git branch <deleted-branch> <found-sha1-id>

ध्यान दें कि एक शाखा के लिए फिर से खोना खो जाएगा।


इसमें git-resurrect.sh स्क्रिप्ट भी है contrib/जिसमें दिए गए नाम के साथ एक शाखा टिप के निशान ढूंढने में मदद मिलती है और इसे पुनर्जीवित (undelete) करती है।


1
बहुत बढ़िया! git reflog show HEADप्रतिबद्ध को सूचीबद्ध किया और मैंने एक नई शाखा बनाई जैसे आपने कहा, एकदम सही।
स्टीवन अल्मरोथ

2

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.