अतिरिक्त विवरण के एक बिट के रूप में, ध्यान दें कि 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 merge
2 (यह प्रतिबद्ध या एक सामान्य मर्ज के रूप में परिणाम के इलाज के लिए अनुमति के बिना), मूल प्रतिबद्ध है जिस पर गुप्त कोष बनाया गया था का उपयोग कर ( 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