Git stash: "गंदे काम करने वाले पेड़ पर लागू नहीं हो सकता, कृपया अपने बदलावों को चरणबद्ध करें"


133

मैं उन परिवर्तनों को लागू करने का प्रयास कर रहा हूं, जिनके साथ मैं पहले git stash popमिला था और संदेश प्राप्त करता था:

Cannot apply to a dirty working tree, please stage your changes

इससे निपटने के बारे में कोई सुझाव?

जवाबों:


196

जब मुझे गंदे काम करने वाले कॉपी में स्टैक्ड परिवर्तन लागू करने होते हैं, जैसे कि स्टेश से एक से अधिक बदलाव पॉप करते हैं, तो मैं निम्नलिखित का उपयोग करता हूं:

$ git stash show -p | git apply -3 && git stash drop

मूल रूप से यह

  1. एक पैच बनाता है
  2. पाइप जो कमांड को लागू करने के लिए
  3. यदि कोई संघर्ष है तो उन्हें 3-वे मर्ज के माध्यम से हल करने की आवश्यकता होगी
  4. अगर लागू (या मर्ज) सफल रहा तो यह सिर्फ लागू किए गए स्टाॅश आइटम को गिराता है ...

मुझे आश्चर्य है कि ऐसा कोई -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 show -p | git applyकी तुलना में अलग git stash apply?
फैक्टर मिस्टिक

1
जो फैक्टर, git stash applyयदि आप एक गंदे काम की नकल है, तो स्टैक्ड परिवर्तनों को लागू नहीं करेंगे। तो आप git stash show -p | git applyकिसी प्रकार के जबरन आवेदन को देख सकते हैं ।
मुहुर्त

1
मदद नहीं करता है, लेकिन मदद: जीआईटी रीसेट रीसेट करें और उसके बाद परिवर्तन न करें।
रोजर एलियन

4
मुझे "त्रुटि: पैच विफल हुआ ... फ़ाइलों में से एक के लिए पैच लागू नहीं होता है"। काश, इसने एक मर्ज संघर्ष दिया होता।
हांग्जो डबलिनस्की

1
यह समाधान मेरे लिए काम नहीं किया, यह error: <file> does not match indexहर संशोधित फ़ाइल के साथ विफल रहा । हालांकि, एक और समाधान काम किया।
15

57

मैं इसे इस तरह से करता हूं:

git add -A
git stash apply

और फिर (वैकल्पिक):

git reset

2
+1! यह अन्य समाधानों की तुलना में सरल है जिसमें पैच या संशोधन करना शामिल है, और यह आपके स्थानीय परिवर्तनों को सुरक्षित रूप से लागू होने वाले परिवर्तनों से सुरक्षित रूप से अलग-थलग रखता है, जब तक कि आप सुनिश्चित नहीं होते कि परिवर्तनों को ठीक से विलय कर दिया गया था।
peterflynn

मुझे त्रुटि मिलती है "... पहले से ही मौजूद है, कोई चेकआउट नहीं ... स्टैश से अनट्रैक की गई फ़ाइलों को पुनर्स्थापित नहीं कर सका"
Aleksandr Dubinsky

2
मैंने उपयोग किया है git add -u, जो -Aइसे छोड़कर नहीं है जैसे कि इसमें अनट्रैक की गई फाइलें नहीं हैं।
ब्रैड कपिट

9

आप पैच फ़ाइल के रूप में इच्छित स्टैच को निर्यात करके और इसे मैन्युअल रूप से लागू करके अपने वर्तमान परिवर्तनों को नष्ट करने के बिना कर सकते हैं।

उदाहरण के लिए, मान लीजिए कि आप गंदे पेड़ पर स्टैश @ {0} लगाना चाहते हैं:

  1. पैच के रूप में निर्यात स्टाश @ {0}:

    git stash show -p stash @ {0}> Stash0.patch

  2. मैन्युअल रूप से परिवर्तन लागू करें:

    git Stash0.patch लागू करें

यदि दूसरा चरण विफल हो जाता है, तो आपको किसी भी त्रुटि को ठीक करने के लिए Stash0.patch फ़ाइल को संपादित करना होगा और फिर दोबारा आवेदन करने की कोशिश करनी होगी।


यह उस मामले के लिए व्यावहारिक और व्यावहारिक है, जिसे मैंने एक डीआईआर पर हटा दिया (इसे हटा दिया, और अपने नाम के साथ एक सिमलिंक बनाया)। Git यह नहीं बता सका कि मेरे काम करने की कॉपी में क्या बदलाव थे।
युकलीन

1
इसने बहुत अच्छा काम किया। भले ही मुझे यकीन है कि मेरा काम करने वाला पेड़ साफ है, मैं एक स्टैश भी नहीं लगा पा रहा था।
Shiki

हां, मुझे एक बाइनरी फ़ाइल के बारे में लाइनें निकालनी थीं।
डोरियन

8

या तो अपने वर्किंग डायरेक्टरी को git रीसेट से साफ़ करें, बदलाव करें, या, यदि आप वर्तमान परिवर्तनों को रोकना चाहते हैं, तो प्रयास करें:

$ git स्‍टैश बचाओ "वर्तमान परिवर्तनों का वर्णन"
$ git स्‍टैश पॉप स्‍टैश @ {1}

यह वर्तमान परिवर्तनों को मिटा देगा, और फिर दूसरे स्टैश को स्टैक स्टैक से पॉप कर देगा।


5
लेकिन यह आदमी चाहता है कि दो धाराएं लागू हों!
एलजार लीबोविच

@ एलज़ार आप सवाल में पढ़ रहे हैं। ओपी केवल एक पिछली कड़ी लागू करना चाहता है। यदि आप सही हैं कि वर्तमान परिवर्तनों को रखा जाना है, तो समाधान दोहराया जा सकता है: पॉप, कमिट, रिपीट।
विलियम पर्ससेल

मुझे लगता है कि वह दोनों को एक-दूसरे से जोड़ना चाहता है। लेकिन फिर, वह उन्हें दो बार प्रतिबद्ध कर सकता है और उन्हें एक ही प्रतिबद्ध में स्क्वैश कर सकता है।
एलाजार लीबोविच

मुझे त्रुटि मिलती है "... पहले से ही मौजूद है, कोई चेकआउट नहीं ... स्टैश से अनट्रैक की गई फ़ाइलों को पुनर्स्थापित नहीं कर सका"
Aleksandr Dubinsky

6

मैथियास का समाधान निश्चित रूप से एक git stash pop --force (और वास्तव में, cit Git devs के सबसे करीब है, चलो इस विकल्प को पहले ही प्राप्त कर लें!)।

हालाँकि, यदि आप केवल git कमांड का उपयोग करके ही काम करना चाहते हैं, तो आप कर सकते हैं:

  1. git प्रतिबद्ध -a "m" Fixme "
  2. git stash पॉप
  3. git प्रतिबद्ध -a --amend
  4. git रीसेट HEAD ~

दूसरे शब्दों में, अपने वर्तमान परिवर्तनों के लिए एक कमिट करें (जिसे हम कभी धक्का नहीं देंगे)। अब जब आपका कार्यक्षेत्र साफ हो गया है, तो अपने स्टैश को पॉप करें। अब, अपने पिछले कमिटमेंट में संशोधन के रूप में स्टेश परिवर्तन करें। ऐसा करने के बाद, अब आपके पास एकल कमिट ("फ़िक्मे") में संयुक्त परिवर्तन के दोनों सेट हैं; सिर्फ रीसेट (--soft Not-hard तो कुछ भी नहीं वास्तव में खो दिया है) अपने चेकआउट को "एक से पहले उस कमिट", और अब आपके पास परिवर्तन के दोनों सेट हैं, पूरी तरह से अनएम्जेड।

** EDIT * *

मैंने महसूस किया कि यह वास्तव में और भी आसान है; आप पूरी तरह से चरण 3 को छोड़ सकते हैं, इसलिए ...

  1. git प्रतिबद्ध -a "m" Fixme "
  2. git stash पॉप
  3. git रीसेट HEAD ~

(वर्तमान परिवर्तनों के लिए प्रतिबद्ध करें, स्टैक्ड परिवर्तनों को पॉप करें, रीसेट करें कि पहले परिवर्तन के दोनों सेट को एक संयुक्त राज्य में संयुक्त करने के लिए प्रतिबद्ध करें।)


4

इन उत्तरों में से कोई भी वास्तव में काम नहीं करता है यदि आप खुद को इस स्थिति में पाते हैं जैसा कि मैंने आज किया। भले ही git reset --hardमैंने कितने भी काम किए हों, यह मुझे कहीं नहीं मिला। मेरा जवाब (किसी भी तरह से आधिकारिक नहीं था):

  1. हैश के उपयोग का चित्र देखें git reflog --all
  2. उस शाखा के साथ हैश करें जिसमें आप रुचि रखते हैं

1
बहुत बहुत धन्यवाद यार। मैं इस बात से निराश था कि गित ने अभी-अभी मेरे स्थानीय रेपो पर कैसे अजीब व्यवहार किया, उसी समस्या का आपने वर्णन किया है।
येलियन

4

मुझे महान काम करने के लिए माथियास लेपिक का समाधान भी मिला, इसलिए मैंने इसके लिए अपने वैश्विक .gitconfig में एक उपनाम जोड़ा

[alias]
        apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop

अब मैं सिर्फ टाइप कर सकता हूं

git apply-stash-to-dirty-working-tree

जो मेरे लिए बहुत अच्छा काम करता है।

(इस लंबे उर्फ ​​नाम पर आपका माइलेज अलग-अलग हो सकता है। लेकिन जब मैं इसे पूरा करने की कोशिश करता हूं, तो मुझे वर्बोसिटी की खुराक पसंद है।)


3

आप git addअपने द्वारा किए गए किसी भी बदलाव को पूरा करने के लिए "गंदे" पेड़ पर एक स्टेश लगा सकते हैं , इस प्रकार पेड़ की सफाई कर सकते हैं। तब आप git stash popस्टैक्ड परिवर्तनों को लागू कर सकते हैं, कोई समस्या नहीं।


2

आपके पास ऐसी फाइलें हैं जिन्हें संशोधित किया गया है लेकिन वे प्रतिबद्ध नहीं हैं। कोई एक:

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

1
@ मायकोइपर - मुझे लगता है कि वह सिर्फ मतलब है कि जो भी आप जोड़ना चाहते हैं उसे कमिट करने से पहले जोड़ें।
sscirrus

0

मैं एक ही समस्या थी, लेकिन जीआईटी में शून्य परिवर्तित फाइलें थीं। पता चलता है कि मेरे पास एक index.lock फ़ाइल थी जो चारों ओर पड़ी थी। इसे हटाने से समस्या हल हो गई।


0

मैं इनमें से अधिकांश को काम करने में असमर्थ था; किसी कारण से यह हमेशा सोचता है कि मेरे पास फ़ाइल में स्थानीय परिवर्तन हैं। मैं एक स्लैश लागू नहीं कर सकता, पैच लागू नहीं होंगे, checkoutऔर reset --hardअसफल होंगे। आखिरकार जो काम किया, वह एक शाखा के रूप में स्टैश को बचा रहा था git stash branch tempbranchname, और फिर एक सामान्य शाखा मर्ज कर रहा था: git checkout masterऔर git merge tempbranchname। से http://git-scm.com/book/en/Git-Tools-Stashing :

यदि आप स्टैक्ड परिवर्तनों को फिर से जांचने का एक आसान तरीका चाहते हैं, तो आप गिट स्टैश ब्रांच चला सकते हैं, जो आपके लिए एक नई शाखा बनाता है, आपके द्वारा किए गए काम की जाँच करने पर आपके द्वारा किए गए काम की पुन: जाँच करता है, और फिर आपके काम को रोक देता है यदि यह सफलतापूर्वक लागू होता है, तो रोकें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.