2012-01-15 9 views
10

एक प्रयोग के लिए, की सुविधा देता है अपने git log की पहचान करता है निम्नलिखितक्या SHA-1 की गणना केवल पेड़ की सामग्री पर आधारित होती है?

commit 16bc8486fb34cf9a6faf0f7df606ae72ad9ea438 // added 2nd file 
commit 9188f9a25b045f130b08888bc3f638099fa7f212 // initial commit 

करता 16bc8486fb34cf9a6faf0f7df606ae72ad9ea438 करने से, .git/refs/heads/master अंक के बाद का कहना है।

मान लें, इस के बाद, मैं स्वयं इस बिंदु पर 9188f9a25b045f130b08888bc3f638099fa7f212

को इंगित करने के .git/refs/heads/master फ़ाइल को संपादित, Git स्थिति स्वीकार करता है कि एक नया अप्रतिबद्ध फ़ाइल कुछ ध्यान की जरूरत होती है। यह वही फाइल है जो मेरी दूसरी प्रतिबद्धता पहले की देखभाल करती थी।

तो मैं इसे प्रतिबद्ध है .. git log अब पता चलता

commit b317f67686f9e6ab1eaabf47073b401d677205d5 // 2nd file committed for the 2nd time 
commit 9188f9a25b045f130b08888bc3f638099fa7f212 // initial commit 

प्रश्न 1:

आपको लगता है कि SHA हैश बहुत पहले समय के बीच अलग-अलग मैं एक दूसरी फ़ाइल प्रतिबद्ध हैं पर ध्यान देंगे और अभी व। ऐसा क्यों है? फ़ाइल की सामग्री नहीं बदली, यह अभी भी वही सटीक फ़ाइल है।

प्रश्न 2

इस बिंदु पर, क्या प्रतिबद्ध मूल दूसरे को क्या हुआ? जब मैं git show 16bc8486 करता हूं, तो यह इस प्रतिबद्धता को दिखाता है। हालांकि यह git log इतिहास में दिखाई नहीं देता है।

+1

दिलचस्प पढ़ना: http://book.git-scm.com/1_the_git_object_model.html – Mat

उत्तर

14

प्रश्न 1: क्योंकि हैश उत्पन्न होता है जिसमें सब कुछ लेना मेटा डेटा (जिसमें स्वयं दिनांक और समय होता है) शामिल है।

प्रश्न 2: git log वर्तमान शाखा का लॉग दिखाता है। प्रतिबद्धता 16bc8486 इसका हिस्सा नहीं है। जहां तक ​​मुझे पता है (मुझे पूरी तरह से यकीन नहीं है) कचरा कलेक्टर इसे जल्दी या बाद में ले जाएगा, अगर इसे इसे संदर्भित करने के लिए कुछ भी नहीं मिलता है (git gc --help) ..

+0

क्यू 2 पर, 'गिट शाखा' केवल इस बिंदु पर अस्तित्व में एक शाखा दिखाती है - * मास्टर। पुरानी फाइल अब किस शाखा का हिस्सा है? – JAM

+0

@ जेएएम: यह किसी भी शाखा का हिस्सा नहीं है, यही कारण है कि यह कचरा संग्रह के लिए उम्मीदवार है। आप उस गिट शाखा शाखा_नाम commit_शैश 'पर स्पष्ट रूप से एक शाखा बनाकर इसे "बचाव" कर सकते हैं। – Mat

+0

@ माट, अगर कुछ समय बीत चुका है और हैश आसानी से उपलब्ध नहीं है, तो क्या इसे किसी भी तरह से पुनर्प्राप्त करना संभव है? – JAM

2

SHA1 को भिन्नता से गणना की जाती है और सभी इस प्रतिबद्धता से मेटा डेटा (लेखक और कमिटर, टाइमस्टैम्प, और कई अन्य डेटा सहित)।

आपके दूसरे प्रश्न के लिए, डेटा प्रतिबद्धता अभी भी मौजूद है लेकिन अब किसी भी लाइव शाखा का हिस्सा नहीं है। कभी-कभी गिट एक कचरा संग्रह चलाएगा जहां विभिन्न हटाए गए सामान वास्तव में हटा दिए जाएंगे। आप देखेंगे कि एक बार जब आप इसे git gc का उपयोग करके मैन्युअल रूप से चलाते हैं तो अनधिकृत प्रतिबद्धता समाप्त हो जाएगी और अब भी गिट शो के साथ पहुंच योग्य नहीं होगी।

6

प्रत्येक फ़ाइल ब्लॉब्स दोनों के लिए sha1 मान दोनों मामलों में समान होंगे यदि आपके पास एक ही सामग्री है (भले ही फ़ाइल नाम बदल दिया गया हो)।

इसी तरह पेड़ के लिए sha1 मान ब्लॉब्स के समान होंगे यदि उनके पास एक ही फ़ाइल नाम हैं।

हालांकि बहुत शीर्ष पर हम प्रतिबद्ध जो प्रतिबद्ध पिछले करने के लिए अपरिवर्तित लिंक, शीर्ष पेड़, लेखक और commiter शामिल होंगे है, लेकिन के रूप में KingCrunch कहा, लेखक और commiter तारीख हो जाएगा अलग , तो प्रतिबद्ध sha1 का sha1 अलग होगा।

आप उन्हें एक ही कर सकते हैं, तो आप जानबूझकर वातावरण चर का उपयोग कर तो वे कोई परिवर्तन नहीं होता लेखक और commiter तिथि निर्धारित।

+0

अतिरिक्त अनुशासन; यदि कोई उन्हें समान बनाता है तो वे ऑब्जेक्ट स्टोर और शाखा ग्राफ़ के संबंध में समान होंगे। ऐसा होगा जैसे शुरुआती, लेकिन समान विभाजन कभी नहीं हुआ - वे अलग-अलग हैं! हैप्पी हंटिंग। –

संबंधित मुद्दे