नोट: Git और Mercurial के बीच सबसे बड़ा अंतर सूचकांक या स्टेजिंग क्षेत्र की स्पष्ट उपस्थिति है ।
Git उपयोगकर्ता के लिए Mercurial से :
Git एकमात्र ऐसा डिस्ट्रीब्यूटेड एससीएम है जो इंडेक्स या स्टेजिंग क्षेत्र की अवधारणा को उजागर करता है। अन्य इसे लागू और छिपा सकते हैं, लेकिन किसी अन्य मामले में उपयोगकर्ता को पता नहीं है और न ही इससे निपटना है।
मर्क्यूरियल का मोटा समतुल्य है DirState
, जो अगली प्रति में शामिल की जाने वाली फाइलों को निर्धारित करने के लिए काम की कॉपी स्थिति की जानकारी को नियंत्रित करता है। लेकिन किसी भी स्थिति में, यह फ़ाइल स्वचालित रूप से नियंत्रित की जाती है।
इसके अतिरिक्त, कमांड लाइन पर या जिन फ़ाइलों का आप उपयोग करना चाहते हैं उन्हें निर्दिष्ट करके या तो कम समय में अधिक चयनात्मक होना संभव है RecordExtension
।
यदि आप सूचकांक से निपटने में असहज महसूस करते हैं, तो आप बेहतर के लिए स्विच कर रहे हैं ;-)
चाल है, आपको वास्तव में पूरी तरह से गिट का फायदा उठाने के लिए सूचकांक को समझने की आवश्यकता है। मई 2006 का यह लेख हमें फिर याद दिलाता है (और यह अब भी सच है):
"यदि आप सूचकांक से इनकार करते हैं, तो आप वास्तव में खुद को इनकार करते हैं।"
अब, उस लेख में कई कमांड शामिल हैं जो अब उपयोग करने के लिए सरल हैं (इसलिए इसकी सामग्री पर बहुत अधिक भरोसा नहीं करते हैं;)), लेकिन सामान्य विचार बना रहता है:
आप एक नई सुविधा पर काम कर रहे हैं और एक फ़ाइल पर मामूली संशोधन करना शुरू करते हैं।
# working, add a few lines
$ git add myFile
# working, another minor modification
$ git add myFile
इस बिंदु पर, आपकी अगली प्रतिबद्धता वर्तमान शाखा में 2 मामूली संशोधनों को लागू करेगी
# working, making major modification for the new features
# ... damn! I cannot commit all this in the current branch: nothing would work
$ git commit
केवल इस बिंदु पर मचान क्षेत्र (सूचकांक) में जोड़े गए परिवर्तनों को रिकॉर्ड करता है, न कि वर्तमान में आपके कार्य निर्देशिका में दिखाई देने वाले प्रमुख परिवर्तन।
$ git branch newFeature_Branch
$ git add myFile
अगली प्रतिबद्धताओं में नई शाखा 'newFrature_Branch' में अन्य सभी बड़े बदलाव दर्ज किए जाएंगे।
अब, अंतःक्रियात्मक रूप से या यहाँ तक कि एक विभाजन को जोड़ने पर भी मरक्यूरियल के साथ उपलब्ध सुविधाएँ हैं, ' hg record
' कमांड या अन्य एक्सटेंशन के माध्यम से : आपको स्थापित करने की आवश्यकता होगी RecordExtension
, या CrecordExtension
।
लेकिन यह मर्क्यूरियल के लिए सामान्य वर्कफ़्लो का हिस्सा नहीं है।
Git " फ़ाइल सामग्री परिवर्तनों" की एक श्रृंखला के रूप में एक प्रतिबद्ध विचार करता है , और आपको एक बार में उन परिवर्तनों को जोड़ने देता है।
आपको उस विशेषता और उसके परिणामों का अध्ययन करना चाहिए: अधिकांश गिट पावर (जैसे मर्ज को आसानी से वापस करने की क्षमता (या समस्या को द्विभाजित करना, या एक प्रतिबद्ध वापस करना) , मर्क्यूरियल के विपरीत ) उस "फ़ाइल सामग्री" प्रतिमान से आती है।
tonfa (प्रोफ़ाइल में: "Hg dev, pythonist": आंकड़े ...) टिप्पणियों में,
सूचकांक में मौलिक रूप से "git-ish" कुछ भी नहीं है, hg एक सूचकांक का उपयोग कर सकता है यदि इसे मूल्यवान माना जाता था, वास्तव में mq
या shelve
पहले से ही इसका हिस्सा है।
ओह यार। चलो हम फिरसे चलते है।
सबसे पहले, मैं यहाँ नहीं हूँ कि एक उपकरण दूसरे की तुलना में बेहतर दिखे। मुझे एचजी महान, बहुत सहज, एक अच्छे समर्थन के साथ (विशेष रूप से विंडोज पर, मेरा मुख्य मंच है, हालांकि मैं लिनक्स और सोलारिस 8 या 10 पर भी काम करता हूं)।
सूचकांक वास्तव में सामने है और केंद्र जिस तरह से लिनुस टॉर्वाल्ड्स वीसीएस के साथ काम करता है :
पहला मर्ज करने से पहले ही, Git ने 1 दिन से स्पष्ट सूचकांक अपडेट का उपयोग किया। यह बस कैसे मैं हमेशा काम किया है। मेरे पास गंदे पेड़ हैं, मेरे पेड़ में कुछ बेतरतीब पैच हैं जिन्हें मैं कमिट नहीं करना चाहता, क्योंकि यह अगले संस्करण के लिए एक मेकफाइल अपडेट है
अब सूचकांक का संयोजन (जो केवल Git में देखी गई धारणा नहीं है), और "कंटेंट इज किंग" प्रतिमान इसे बहुत अनूठा और "गिट-ईश" बनाता है :
git एक कंटेंट ट्रैकर है , और एक फ़ाइल नाम का तब तक कोई अर्थ नहीं है जब तक कि उसकी सामग्री से संबंधित न हो। इसलिए, गिट ऐड फाइलनाम के लिए एकमात्र समझदार व्यवहार फ़ाइल की सामग्री के साथ-साथ इसके नाम को सूचकांक में जोड़ना है।
नोट: "सामग्री", यहाँ, इस प्रकार परिभाषित किया गया है :
Git का सूचकांक मूल रूप से बहुत अधिक परिभाषित किया गया है
- पेड़ की कुल " सामग्री " को शामिल करने के लिए पर्याप्त है (और इसमें सभी मेटाडेटा शामिल हैं: फ़ाइल नाम, मोड और फ़ाइल सामग्री "सामग्री" के सभी भाग हैं , और वे सभी अपने आप में अर्थहीन हैं! )
- अतिरिक्त "स्टेट" जानकारी स्पष्ट और तुच्छ (लेकिन बेहद महत्वपूर्ण!) फाइलसिस्टम तुलना अनुकूलन की अनुमति देने के लिए।
तो तुम सच में करना चाहिए के रूप में सूचकांक को देखने जा रहा है सामग्री ।
सामग्री "फ़ाइल नाम" या अलग-अलग भागों के रूप में "फ़ाइल सामग्री" नहीं है। आप वास्तव में दोनों को अलग नहीं कर सकते ।
अपने स्वयं के फ़ाइलनामों का कोई मतलब नहीं है (उनके पास फ़ाइल सामग्री भी है), और अपने आप फ़ाइल सामग्री समान रूप से संवेदनहीन है (आपको यह जानना होगा कि उस तक कैसे पहुंचा जाए)।
मैं जो कहना चाहता हूं, वह यह है कि मौलिक रूप से आपको इसकी सामग्री के बिना फ़ाइल नाम देखने की अनुमति नहीं है। पूरी धारणा पागल है और मान्य नहीं है। इसकी "वास्तविकता" के लिए कोई प्रासंगिकता नहीं है।
से पूछे जाने वाले प्रश्न , मुख्य लाभ हैं:
- एक अच्छा दानेदारता के साथ
- आप अपने पेड़ में एक लंबे समय के लिए एक uncommited संशोधन रखने में मदद करते हैं
- एक प्रतिबद्ध के लिए कई छोटे चरणों को पूरा करने, जाँच क्या आप के साथ किया था
git diff
, और के साथ एक छोटा कदम मान्य git add
या git add -u
।
- मर्ज संघर्ष के उत्कृष्ट प्रबंधन की अनुमति देता है:
git diff --base
, git diff --ours
, git diff --theirs
।
git commit --amend
यदि सूचकांक को इस बीच संशोधित नहीं किया गया है तो केवल लॉग संदेश में संशोधन करने की अनुमति देता है
मुझे व्यक्तिगत रूप से लगता है कि यह व्यवहार डिफ़ॉल्ट नहीं होना चाहिए, आप चाहते हैं कि लोग ऐसा कुछ परीक्षण करें या कम से कम संकलित करें
जब आप सामान्य रूप से ("परीक्षण या संकलित" भाग के बारे में) सही होते हैं, तो जिस तरह से गिट आपको ब्रांचिंग और मर्जिंग (चेरी-पिकिंग या रीबासिंग) के लिए अनुमति देता है, आपको एक अस्थायी निजी शाखा में जितनी बार चाहें उतनी बार करने की अनुमति देता है (केवल धक्का दिया जाता है) दूरस्थ "बैकअप" रिपॉजिटरी के लिए, जबकि सार्वजनिक शाखा पर उन "बदसूरत कमिट्स" को फिर से करते हुए, सभी सही परीक्षणों के साथ।