जवाबों:
जब मुझे गंदे काम करने वाले कॉपी में स्टैक्ड परिवर्तन लागू करने होते हैं, जैसे कि स्टेश से एक से अधिक बदलाव पॉप करते हैं, तो मैं निम्नलिखित का उपयोग करता हूं:
$ git stash show -p | git apply -3 && git stash drop
मूल रूप से यह
मुझे आश्चर्य है कि ऐसा कोई -f(बल) विकल्प क्यों नहीं है git stash popजिसके लिए ऊपर दिए गए वन-लाइनर की तरह व्यवहार करना चाहिए।
इस बीच आप इस एक-लाइनर को एक उपनाम के रूप में जोड़ना चाह सकते हैं:
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
-33-मर्ज के माध्यम से सीधे विरोधों को हल करने की अनुमति देने वाले पैरामीटर को इंगित करने के लिए @SamHasler का धन्यवाद ।
git stash applyयदि आप एक गंदे काम की नकल है, तो स्टैक्ड परिवर्तनों को लागू नहीं करेंगे। तो आप git stash show -p | git applyकिसी प्रकार के जबरन आवेदन को देख सकते हैं ।
error: <file> does not match indexहर संशोधित फ़ाइल के साथ विफल रहा । हालांकि, एक और समाधान काम किया।
मैं इसे इस तरह से करता हूं:
git add -A
git stash apply
और फिर (वैकल्पिक):
git reset
git add -u, जो -Aइसे छोड़कर नहीं है जैसे कि इसमें अनट्रैक की गई फाइलें नहीं हैं।
आप पैच फ़ाइल के रूप में इच्छित स्टैच को निर्यात करके और इसे मैन्युअल रूप से लागू करके अपने वर्तमान परिवर्तनों को नष्ट करने के बिना कर सकते हैं।
उदाहरण के लिए, मान लीजिए कि आप गंदे पेड़ पर स्टैश @ {0} लगाना चाहते हैं:
पैच के रूप में निर्यात स्टाश @ {0}:
git stash show -p stash @ {0}> Stash0.patch
मैन्युअल रूप से परिवर्तन लागू करें:
git Stash0.patch लागू करें
यदि दूसरा चरण विफल हो जाता है, तो आपको किसी भी त्रुटि को ठीक करने के लिए Stash0.patch फ़ाइल को संपादित करना होगा और फिर दोबारा आवेदन करने की कोशिश करनी होगी।
या तो अपने वर्किंग डायरेक्टरी को git रीसेट से साफ़ करें, बदलाव करें, या, यदि आप वर्तमान परिवर्तनों को रोकना चाहते हैं, तो प्रयास करें:
$ git स्टैश बचाओ "वर्तमान परिवर्तनों का वर्णन"
$ git स्टैश पॉप स्टैश @ {1}
यह वर्तमान परिवर्तनों को मिटा देगा, और फिर दूसरे स्टैश को स्टैक स्टैक से पॉप कर देगा।
मैथियास का समाधान निश्चित रूप से एक git stash pop --force (और वास्तव में, cit Git devs के सबसे करीब है, चलो इस विकल्प को पहले ही प्राप्त कर लें!)।
हालाँकि, यदि आप केवल git कमांड का उपयोग करके ही काम करना चाहते हैं, तो आप कर सकते हैं:
दूसरे शब्दों में, अपने वर्तमान परिवर्तनों के लिए एक कमिट करें (जिसे हम कभी धक्का नहीं देंगे)। अब जब आपका कार्यक्षेत्र साफ हो गया है, तो अपने स्टैश को पॉप करें। अब, अपने पिछले कमिटमेंट में संशोधन के रूप में स्टेश परिवर्तन करें। ऐसा करने के बाद, अब आपके पास एकल कमिट ("फ़िक्मे") में संयुक्त परिवर्तन के दोनों सेट हैं; सिर्फ रीसेट (--soft Not-hard तो कुछ भी नहीं वास्तव में खो दिया है) अपने चेकआउट को "एक से पहले उस कमिट", और अब आपके पास परिवर्तन के दोनों सेट हैं, पूरी तरह से अनएम्जेड।
** EDIT * *
मैंने महसूस किया कि यह वास्तव में और भी आसान है; आप पूरी तरह से चरण 3 को छोड़ सकते हैं, इसलिए ...
(वर्तमान परिवर्तनों के लिए प्रतिबद्ध करें, स्टैक्ड परिवर्तनों को पॉप करें, रीसेट करें कि पहले परिवर्तन के दोनों सेट को एक संयुक्त राज्य में संयुक्त करने के लिए प्रतिबद्ध करें।)
इन उत्तरों में से कोई भी वास्तव में काम नहीं करता है यदि आप खुद को इस स्थिति में पाते हैं जैसा कि मैंने आज किया। भले ही git reset --hardमैंने कितने भी काम किए हों, यह मुझे कहीं नहीं मिला। मेरा जवाब (किसी भी तरह से आधिकारिक नहीं था):
git reflog --allमुझे महान काम करने के लिए माथियास लेपिक का समाधान भी मिला, इसलिए मैंने इसके लिए अपने वैश्विक .gitconfig में एक उपनाम जोड़ा
[alias]
apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop
अब मैं सिर्फ टाइप कर सकता हूं
git apply-stash-to-dirty-working-tree
जो मेरे लिए बहुत अच्छा काम करता है।
(इस लंबे उर्फ नाम पर आपका माइलेज अलग-अलग हो सकता है। लेकिन जब मैं इसे पूरा करने की कोशिश करता हूं, तो मुझे वर्बोसिटी की खुराक पसंद है।)
आप git addअपने द्वारा किए गए किसी भी बदलाव को पूरा करने के लिए "गंदे" पेड़ पर एक स्टेश लगा सकते हैं , इस प्रकार पेड़ की सफाई कर सकते हैं। तब आप git stash popस्टैक्ड परिवर्तनों को लागू कर सकते हैं, कोई समस्या नहीं।
आपके पास ऐसी फाइलें हैं जिन्हें संशोधित किया गया है लेकिन वे प्रतिबद्ध नहीं हैं। कोई एक:
git reset --hard HEAD (to bring everything back to HEAD)
या, यदि आप अपने परिवर्तनों को सहेजना चाहते हैं:
git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop
मैं इनमें से अधिकांश को काम करने में असमर्थ था; किसी कारण से यह हमेशा सोचता है कि मेरे पास फ़ाइल में स्थानीय परिवर्तन हैं। मैं एक स्लैश लागू नहीं कर सकता, पैच लागू नहीं होंगे, checkoutऔर reset --hardअसफल होंगे। आखिरकार जो काम किया, वह एक शाखा के रूप में स्टैश को बचा रहा था git stash branch tempbranchname, और फिर एक सामान्य शाखा मर्ज कर रहा था: git checkout masterऔर git merge tempbranchname। से http://git-scm.com/book/en/Git-Tools-Stashing :
यदि आप स्टैक्ड परिवर्तनों को फिर से जांचने का एक आसान तरीका चाहते हैं, तो आप गिट स्टैश ब्रांच चला सकते हैं, जो आपके लिए एक नई शाखा बनाता है, आपके द्वारा किए गए काम की जाँच करने पर आपके द्वारा किए गए काम की पुन: जाँच करता है, और फिर आपके काम को रोक देता है यदि यह सफलतापूर्वक लागू होता है, तो रोकें
git stash show -p | git applyकी तुलना में अलगgit stash apply?