अतिरिक्त विवरण के एक बिट के रूप में, ध्यान दें कि git stashया तो दो कमिट करता है, या तीन कमिट करता है। डिफ़ॉल्ट दो है; आप तीन मिलता है अगर आप --allया --include-untrackedविकल्पों में से किसी भी वर्तनी का उपयोग करते हैं।
ये दो या तीन, कमिट एक महत्वपूर्ण तरीके से विशेष हैं: वे बिना किसी शाखा पर हैं। Git उन्हें विशेष नाम से रेखांकित करता है stash। 1 , सबसे महत्वपूर्ण बात, हालांकि, यही वह चीज है जो आपको देती है- और आपको बनाती है - इन दो या तीन कमिट के साथ। इसे समझने के लिए हमें उन कमिट्स में क्या देखना है।
अंदर क्या है
हर कमिट एक या एक से अधिक अभिभावकों को सूचीबद्ध कर सकता है। ये एक ग्राफ बनाते हैं, जो बाद में पहले वाले बिंदुओं पर वापस जाता है। स्टैश आम तौर पर दो कमिट रखता है, जिसे मैं iइंडेक्स / स्टेजिंग-एरिया कंटेंट और wवर्क-ट्री कंटेंट के लिए कॉल करना पसंद करता हूं । यह भी याद रखें कि प्रत्येक प्रतिबद्ध एक स्नैपशॉट रखता है। एक सामान्य प्रतिबद्धता में, यह स्नैपशॉट इंडेक्स / स्टेजिंग-एरिया कंटेंट से बनाया गया है। तो iकमिट वास्तव में एक पूरी तरह से सामान्य प्रतिबद्धता है! यह किसी भी शाखा में नहीं है:
...--o--o--o <-- branch (HEAD)
|
i
यदि आप एक सामान्य स्लैश बना रहे हैं, तो git stashकोड wअब आपके सभी ट्रैक किए गए कार्य-ट्री फ़ाइलों (एक अस्थायी सहायक सूचकांक में) की नकल करके बनाता है । Git wप्रतिबद्ध करने के लिए इंगित करने के HEADलिए इस प्रतिबद्ध के पहले माता-पिता को सेट करता है , और दूसरा माता-पिता को इंगित करने के लिए i। अंतिम, यह stashइस बात की ओर इशारा wकरता है:
...--o--o--o <-- branch (HEAD)
|\
i-w <-- stash
यदि आप जोड़ते हैं --include-untrackedया --all, Git एक अतिरिक्त प्रतिबद्ध बनाता है, uबनाने iऔर के बीच में w। स्नैपशॉट सामग्री uउन फ़ाइलों के लिए होती है जो अनट्रैक की जाती हैं, लेकिन उन्हें अनदेखा नहीं किया जाता है ( --include-untracked), या उन फ़ाइलों को भी जिन्हें अनसुना किया जाता है, भले ही उन्हें अनदेखा कर दिया जाए ( --all)। इस अतिरिक्त uप्रतिबद्ध है कोई माता पिता, और फिर जब git stashबनाता है w, यह सेट wके तीसरे माता-पिता इस के लिए uप्रतिबद्ध है, ताकि आप मिल:
...--o--o--o <-- branch (HEAD)
|\
i-w <-- stash
/
u
Git भी, इस बिंदु पर, किसी भी कार्य-ट्री फ़ाइलों को निकालता है जो uकमिट में घाव करते हैं ( git cleanऐसा करने के लिए)।
एक स्टाॅस्ट का जीर्णोद्धार
जब आप स्टैश को पुनर्स्थापित करने के लिए जाते हैं , तो आपके पास इसका उपयोग करने --index, या न करने का विकल्प होता है। यह बताता है git stash apply(या आदेश होते हैं जो आंतरिक रूप से उपयोग किए जाने वाले किसी भी applyतरह के रूप में, pop) है कि यह करना चाहिए का उपयोगi अपने वर्तमान सूचकांक को संशोधित करने के प्रयास करने के लिए प्रतिबद्ध हैं। इस संशोधन के साथ किया जाता है:
git diff <hash-of-i> <hash-of-i's-parent> | git apply --index
(कम या ज्यादा; इसमें मूल विवरण के रूप में प्राप्त होने वाली बारीकियों का विवरण है)।
यदि आप चूक करते हैं --index, तो git stash applyपूरी तरह से iप्रतिबद्ध की उपेक्षा करें ।
यदि स्टैश में केवल दो कमिट हैं, तो git stash applyअब wकमिट लगा सकते हैं । यह फोन करके ऐसा करता है git merge2 (यह प्रतिबद्ध या एक सामान्य मर्ज के रूप में परिणाम के इलाज के लिए अनुमति के बिना), मूल प्रतिबद्ध है जिस पर गुप्त कोष बनाया गया था का उपयोग कर ( iके माता पिता, और wके पहले माता-पिता) मर्ज आधार के रूप में, wके रूप में --theirsप्रतिबद्ध, और आपका वर्तमान (HEAD) मर्ज के लक्ष्य के रूप में प्रतिबद्ध है। यदि मर्ज सफल हो जाता है, तो सब अच्छा है - अच्छा, कम से कम गिट ऐसा सोचता है - और git stash applyस्वयं सफल होता है। आप का उपयोग किया है git stash popगुप्त कोष में लागू करने के लिए, कोड अब चला जाता है गुप्त कोष। 3 यदि मर्ज विफल हो जाता है, तो गिट लागू होने की घोषणा करता है। अगर आपने इस्तेमाल कियाgit stash popकोड स्टैश को बनाए रखता है और उसी विफलता को स्थिति के रूप में वितरित करता है git stash apply।
लेकिन अगर आपके पास वह तीसरा कमिटमेंट है - यदि uआप जो आवेदन कर रहे हैं, उसमें एक कमिट है - तो चीजें बदल जाती हैं! यह ढोंग करने का कोई विकल्प नहीं है कि uप्रतिबद्धता मौजूद नहीं है। 4 Git उस प्रतिबद्ध से सभी फाइलों uको वर्तमान कार्य-वृक्ष में निकालने पर जोर देता है । इसका मतलब यह है कि फ़ाइलों को या तो मौजूद नहीं होना चाहिए, या uकमिट में जैसी सामग्री होनी चाहिए ।
ऐसा करने के लिए, आप git cleanस्वयं का उपयोग कर सकते हैं - लेकिन याद रखें कि अनटाइटेड फ़ाइलों (अनदेखा या नहीं) का एक Git रिपॉजिटरी के अंदर कोई अन्य अस्तित्व नहीं है, इसलिए सुनिश्चित करें कि ये फ़ाइलें सभी नष्ट हो सकती हैं! या, आप एक अस्थायी निर्देशिका बना सकते हैं, और फ़ाइलों को सुरक्षित रखने के लिए वहां ले जा सकते हैं - या यहां तक कि एक और git stash save -uकर सकते हैं git stash save -a, क्योंकि वे git cleanआपके लिए चलेंगे । लेकिन uबाद में इससे निपटने के लिए आप सिर्फ एक और स्टाइल के साथ छोड़ देते हैं ।
1 यह वास्तव में है refs/stash। यह तब मायने रखता है जब आप एक शाखा बनाते हैं जिसका नाम है stash: शाखा का पूरा नाम है refs/heads/stash, इसलिए ये संघर्ष में नहीं हैं। : लेकिन ऐसा नहीं है Git मन नहीं होगा, लेकिन आप अपने आप को भ्रमित करेंगे। :-)
2git stash कोड वास्तव में उपयोग करता git merge-recursiveसीधे यहाँ। यह कई कारणों से आवश्यक है, और यह सुनिश्चित करने का साइड इफेक्ट भी है कि जब आप संघर्षों को हल करते हैं तो Git इसे मर्ज नहीं मानता है।
3 यही कारण है कि मैं इसके git stash popपक्ष में, परहेज करने की सलाह देता हूं git stash apply। आपको जो मिला है उसकी समीक्षा करने का मौका मिलता है, और यह तय करें कि क्या यह वास्तव में सही तरीके से लागू किया गया था । यदि नहीं, तो आपके पास अभी भी अपना स्टैश है, जिसका अर्थ है कि आप git stash branchपूरी तरह से सब कुछ ठीक करने के लिए उपयोग कर सकते हैं । ठीक है, कि pesky uप्रतिबद्ध की कमी को मानते हुए ।
4 वास्तव में होना चाहिए: git stash apply --skip-untrackedया कुछ और। एक ऐसा संस्करण भी होना चाहिए, जिसका अर्थ है कि उन सभी uफाइलों को एक नई निर्देशिका में छोड़ दें , जैसे git stash apply --untracked-into <dir>, शायद।
git stash show -p | git apply --3