इस तथ्य के बावजूद कि जीआईटी फ़ाइल डेल्टास को संग्रहीत नहीं करता है, क्या आप अभी भी पिछले फ़ाइल संस्करणों (असीमित बार?) पर रोलबैक कर सकते हैं।


14

मैंने पढ़ा है कि Git फाइल डेल्टास को स्टोर नहीं करता है। यदि यह सच है, तो यह पिछले संस्करणों में फ़ाइल रोलबैक का समर्थन कैसे करता है? यदि यह पूरी फाइल को स्टोर कर रहा है तो डिस्क पर रिपॉजिटरी स्पेस को बड़े पैमाने पर अनमना होना चाहिए। क्या Git फ़ाइल रोलबैक का समर्थन करता है और फ़ाइल संस्करण 1 में वापस आ गया है? क्या यह फाइलों से संबंधित एक संस्करण अवधारणा को भी प्रभावित करता है? यह (मुझे विश्वास है) एक VCS / DVCS और मेरी जरूरतों की मेरी समझ के लिए आवश्यक है। मुझे पिछले संस्करणों के साथ जाँच करने में सक्षम होने की आवश्यकता है।

जवाबों:


44

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

पूरे पेड़ बनाम व्यक्तिगत-फाइलें

आप जो सामंजस्य स्थापित करने की कोशिश कर रहे हैं, वह एक व्यक्तिगत फ़ाइल के पुराने संस्करण को एक्सेस करने का विचार है। इस तथ्य के अनुसार कि गिट का इतिहास मॉडल पूरे पेड़ पर केंद्रित है। पूरे ट्री-वर्जनिंग को देखने के लिए थोड़ा और अधिक काम करने की आवश्यकता होती है (उदाहरण के लिए) foo.cजैसा कि यह संस्करण foo.cपहले से मौजूद था, यह दस -चेंज पहले बनाम पूरे दस-ट्री-परिवर्तन पहले था:

# 10 foo.c-changes ago
git show $(git rev-list -n 10 --reverse HEAD -- foo.c | head -1):foo.c

# 10 whole-tree-changes ago
git show HEAD~10:foo.c

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

भंडारण क्षमता

जब कोई नई वस्तु (उदाहरण के लिए पहले अनदेखी सामग्री वाली फ़ाइल) सिस्टम में प्रवेश करती है, तो इसे "ढीली वस्तु" के रूप में सादे (zlib) संपीड़न के साथ संग्रहित किया जाता है। जब पर्याप्त ढीली वस्तुएं जमा होती हैं ( gc.autoकॉन्फ़िगरेशन विकल्प के आधार पर ; या जब उपयोगकर्ता git gc या निम्न-स्तरीय पैकिंग कमांड में से एक चलाता है ), Git कई ढीली वस्तुओं को एक "पैक फ़ाइल" में एकत्रित करेगा।

एक पैक फ़ाइल में वस्तुओं को या तो सादे संपीड़ित डेटा के रूप में संग्रहीत किया जा सकता है (एक ढीली वस्तु के रूप में, बस दूसरों की वस्तुओं के साथ बंडल), या किसी अन्य वस्तु के खिलाफ संकुचित डेल्टा के रूप में। डेल्टास को कॉन्फ़िगर करने योग्य गहराई ( pack.depth) के साथ एक साथ जंजीर किया जा सकता है और किसी भी उपयुक्त वस्तु के खिलाफ बनाया जा सकता है ( pack.windowसबसे अच्छा डेल्टा आधार के लिए व्यापक रूप से गिट खोज कैसे नियंत्रित करता है; एक ऐतिहासिक रूप से असंबंधित फ़ाइल के एक संस्करण का उपयोग आधार के रूप में किया जा सकता है, अगर ऐसा होगा तो अच्छा डेल्टा संपीड़न)। अक्षांश और गहराई के आकार का विन्यास डेल्टा संपीड़न इंजन देता है जिसके परिणामस्वरूप अक्सर सीवीएस-शैली सरल एक-संस्करण-विरुद्ध-अगले-पिछले-संस्करण "भिन्न" संपीड़न की तुलना में बेहतर डेल्टा संपीड़न होता है।

यह इस आक्रामक डेल्टा संपीड़न (सामान्य zlib संपीड़न के साथ संयुक्त) है जो अक्सर एक Git रिपॉजिटरी (पूर्ण इतिहास और एक असम्पीडित कार्यशील पेड़ के साथ) को एक एकल SVN चेकआउट की तुलना में कम जगह ले सकता है (असम्पीडित कार्यशील पेड़ और प्राचीन प्रतिलिपि के साथ)।

कैसे Git स्टोर ऑब्जेक्ट और Git कम्युनिटी बुक के Packfile अनुभाग देखें । इसके अलावा git पैक-ऑब्जेक्ट्स मैनपेज

* आप बता सकते हैं कि "इतिहास को फिर से लिखना" और git रीसेट जैसे आदेशों के साथ Git थ्रो कमिट करता है , लेकिन इन मामलों में भी Git "हैंग हो जाता है" कुछ समय के लिए नए डिस्क्लेमर कमिट हो जाते हैं, बस अगर आप तय करते हैं कि आपको उनकी ज़रूरत है। Git reflog और git prune देखें ।


3
+1 केवल आपके द्वारा दी गई जानकारी की मात्रा और विवरण के लिए।
तमारा विज्समैन

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

क्रिस, आप Git internals पर एक बहुत अच्छा संभाल रहे हैं। किसी भी मौका आप इस पर एक झूले ले सकते हैं? stackoverflow.com/questions/5176225/…
नाथन लॉन्ग

@ChrisJohnsen कृपया इसे समझने में मेरी मदद करें। आपके द्वारा बताए गए आधार पर, क्या गिट तोड़फोड़ की तरह समान (या बेहतर) भंडारण दक्षता प्राप्त कर सकता है? मुझे पता है कि अगर मैं कई बार थोड़े बदलाव के साथ फाइल करता हूं, तो 100 एमबी में 1GB डेटा बचाया जा सकता है। क्या जीआईटी भी ऐसा कर सकता है?
एलेरिज़ा नूरी

@AlirezaNoori: यह सभी डेटा की प्रकृति और कैप्चर किए गए परिवर्तनों (फ़ाइल का आकार, फ़ाइल की संपीड़ितता, आकार और परिवर्तनों का स्थान, आदि) पर निर्भर करता है। ऐसा कुछ निश्चित रूप से संभव होना चाहिए (बारीकियों के आधार पर)। सामान्य तौर पर, Git की पैक फाइलें अपने डेल्टा संपीड़न के लिए आधारों के एक बड़े चयन से आकर्षित कर सकती हैं, क्योंकि एसवीएन सर्वर का उपयोग करने वाले सख्ती से रिवर्स-कालानुक्रमिक डेल्टास की तुलना में (उपयोग किया जाता है? मैं एसवीएन विकास का पालन नहीं करता हूं ...)। यदि आपके मन में कुछ विशिष्ट प्रश्न हैं, तो आपको एक नया प्रश्न पूछना चाहिए, जिसमें सभी प्रासंगिक विवरण शामिल हों।
क्रिस जॉन्सन

1

इसे उसी पृष्ठ पर पढ़ा जा सकता है:

...

नतीजतन, गिट स्रोत कोड पेड़ के नीचे किसी भी स्तर पर स्पष्ट रूप से फ़ाइल संशोधन रिश्तों को रिकॉर्ड नहीं करता है।

...

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

...

इस प्रकार आप किसी फ़ाइल के पिछले संशोधनों पर वापस जा सकते हैं और दो फ़ाइलों की तुलना कर सकते हैं।


1

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

संस्करणों के बीच अंतर देखने के लिए, निम्न में से एक करें:

  1. git diff - अंतिम संस्करण और फाइलों में अंतर के बीच अंतर दिखाता है जिन्हें बदल दिया गया है, लेकिन git addउन पर नहीं चला था ।
  2. git diff --cached - पिछले संस्करण और उन सभी फ़ाइलों के बीच अंतर दिखाता है जो git addचल चुकी हैं, लेकिन प्रतिबद्ध नहीं हुई हैं
  3. git diff कमिट - वर्तमान वर्किंग डाइरेक्टरी और पिछली कमिट के बीच के अंतर को कमिटमेंट के साथ बताए अनुसार दिखाते हैं
  4. git diff commita..commitb - दो कमिट्स, a और b के बीच के अंतर को दर्शाता है। यह शाखाएं या टैग जैसे प्रतीकात्मक नाम भी हो सकते हैं।

यह उत्तर वास्तव में सही नहीं है। उन सभी आदेशों को फ़ाइलों के एक अनियंत्रित सेट के साथ-साथ पूरे पेड़ पर लागू किया जा सकता है - बस अंत में फ़ाइल नाम जोड़ें ...
naught101
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.