भ्रामक बिट यहाँ है:
Git कभी भी उन्हें अलग-अलग फ़ाइलों के रूप में नहीं देखता है। Git पूरी सामग्री के रूप में सब कुछ सोचता है।
गिट अक्सर अपने रेपो में वस्तुओं के स्थान पर 160 बिट हैश का उपयोग करता है। फाइलों का एक पेड़ मूल रूप से प्रत्येक की सामग्री (प्लस कुछ मेटाडेटा) के साथ जुड़े नामों और हैश की एक सूची है।
लेकिन 160 बिट हैश विशिष्ट रूप से सामग्री (गिट डेटाबेस के ब्रह्मांड के भीतर) की पहचान करता है। तो सामग्री के रूप में हैश वाले एक पेड़ में सामग्री शामिल होती है ।
यदि आप किसी फ़ाइल की सामग्री की स्थिति बदलते हैं, तो उसका हैश बदल जाता है। लेकिन अगर इसका हैश बदलता है, तो फ़ाइल नाम की सामग्री से जुड़ा हैश भी बदल जाता है। जो बदले में "डायरेक्टरी ट्री" के हैश को बदलता है।
जब एक गिट डेटाबेस एक निर्देशिका ट्री को संग्रहीत करता है, तो उस निर्देशिका ट्री का अर्थ होता है और इसमें सभी उपनिर्देशिकाओं की सामग्री और उसमें सभी फाइलें शामिल होती हैं ।
यह एक पेड़ की संरचना (अपरिवर्तनीय, पुन: प्रयोज्य) के साथ खिलने या अन्य पेड़ों को इंगित करता है, लेकिन तार्किक रूप से यह पूरे पेड़ की संपूर्ण सामग्री का एक एकल स्नैपशॉट है। प्रतिनिधित्व Git डेटाबेस में फ्लैट डेटा सामग्री नहीं है, लेकिन तार्किक वह अपने डेटा और कुछ नहीं के सभी है।
यदि आपने ट्री को किसी फ़ाइल सिस्टम में अनुक्रमित किया है, तो सभी .it फ़ोल्डरों को हटा दिया है, और पेड़ को अपने डेटाबेस में वापस जोड़ने के लिए कहा है, आप डेटाबेस में कुछ भी नहीं जोड़ने के साथ समाप्त हो जाएंगे - तत्व पहले से ही होगा।
यह गैट के हैश को एक संदर्भ के रूप में अपरिवर्तनीय डेटा के लिए पॉइंटर के रूप में सोचने में मदद कर सकता है।
यदि आपने उसके चारों ओर एक एप्लिकेशन बनाया है, तो एक दस्तावेज़ पृष्ठों का एक गुच्छा होता है, जिसमें परतें होती हैं, जिसमें समूह होते हैं, जिनमें ऑब्जेक्ट होते हैं।
जब आप किसी ऑब्जेक्ट को बदलना चाहते हैं, तो आपको इसके लिए एक पूरी तरह से नया समूह बनाना होगा। यदि आप एक समूह को बदलना चाहते हैं, तो आपको एक नई परत बनानी होगी, जिसमें एक नया पृष्ठ होना चाहिए, जिसे एक नया दस्तावेज़ चाहिए।
हर बार जब आप किसी एकल ऑब्जेक्ट को बदलते हैं, तो यह एक नया दस्तावेज़ बनाता है। पुराना दस्तावेज़ मौजूद है। नए और पुराने दस्तावेज़ अपनी अधिकांश सामग्री साझा करते हैं - उनके पास एक ही पृष्ठ (1 को छोड़कर) है। उस एक पृष्ठ में एक ही परतें हैं (1 को छोड़कर)। उस परत में समान समूह हैं (1 को छोड़कर)। उस समूह में समान वस्तुएं हैं (1 को छोड़कर)।
और उसी से मेरा तात्पर्य तार्किक रूप से एक प्रति से है, लेकिन कार्यान्वयन-वार यह उसी अपरिवर्तनीय वस्तु के लिए एक और संदर्भ गिना जाने वाला सूचक है।
एक git रेपो बहुत कुछ ऐसा है।
इसका मतलब यह है कि किसी दिए गए परिवर्तन में अपना प्रतिबद्ध संदेश (हैश कोड के रूप में) होता है, इसमें उसका कार्य वृक्ष होता है, और इसमें उसके मूल परिवर्तन होते हैं।
उन मूल परिवर्तनों में उनके मूल परिवर्तन शामिल हैं, सभी तरह से वापस।
गिट रेपो के जिस हिस्से में इतिहास है, वह बदलावों की श्रृंखला है। "निर्देशिका" पेड़ के ऊपर एक स्तर पर परिवर्तन की यह श्रृंखला - एक "निर्देशिका" पेड़ से, आप विशिष्ट रूप से एक परिवर्तन सेट और परिवर्तनों की श्रृंखला में नहीं जा सकते।
किसी फ़ाइल का क्या होता है, यह जानने के लिए, आप एक परिवर्तन में उस फ़ाइल से शुरू करते हैं। उस बदलाव का एक इतिहास है। अक्सर उस इतिहास में, एक ही नामित फ़ाइल मौजूद होती है, कभी-कभी उसी सामग्री के साथ। यदि सामग्री समान है, तो फ़ाइल में कोई परिवर्तन नहीं हुआ था। यदि यह अलग है, तो एक बदलाव है, और ठीक उसी तरह से काम करने के लिए काम करने की आवश्यकता है।
कभी-कभी फाइल चली जाती है; लेकिन, "निर्देशिका" ट्री में एक ही सामग्री (समान हैश कोड) के साथ एक और फ़ाइल हो सकती है, इसलिए हम इसे इस तरह से ट्रैक कर सकते हैं (ध्यान दें; यही कारण है कि आप एक कमिट-टू-मूव फाइल को एक कमिट से अलग करना चाहते हैं। -संपादित)। या समान फ़ाइल नाम, और फ़ाइल की जाँच करने के बाद पर्याप्त समान है।
तो git एक "फ़ाइल इतिहास" को एक साथ पैचवर्क कर सकता है।
लेकिन यह फ़ाइल इतिहास "संपूर्ण बदलाव" के कुशल पार्सिंग से आता है, न कि फ़ाइल के एक संस्करण से दूसरे लिंक से।