स्लैश को कार्यशील निर्देशिका पर लागू क्यों नहीं किया जा सकता है?


96

मैं कार्यशील निर्देशिका में वापस स्‍टेश लागू नहीं कर सकता।

छोटी कहानी:

पहले मैंने कुछ प्रतिबद्ध परिवर्तनों को धकेलने की कोशिश की, लेकिन उसने कहा: "नहीं, तुम नहीं खींच सकते, पहले खींचो" ... ठीक है फिर, मैं गिटहब से चीजों को खींचूंगा और फिर अपने परिवर्तनों को धक्का दूंगा। जब मैंने खींचने की कोशिश की, तो उसने कहा कि मेरे पास बदलाव थे जो ओवरराइट हो जाएंगे, और मुझे अपने परिवर्तनों को रोकना चाहिए। ठीक है, मैंने बदलावों को धराशायी कर दिया ... पुल किया, और प्रतिबद्ध परिवर्तनों को आगे बढ़ाएं। लेकिन अब, मैं उन अनचाहे बदलावों को बहाल नहीं कर सकता, जिन पर मैं काम कर रहा था।

यह त्रुटि है:

MyPath/File.cs already exists, no checkout
Could not restore untracked files from stash

यह सुनिश्चित करने के लिए कि मुझे अभी तक समझ में नहीं आया है, उन्होंने मुझे थोड़ा भ्रमित किया ... शायद मैंने कुछ गलत किया।

यह बहुत अच्छा होगा अगर कोई मुझे इसे हल करने में मदद कर सकता है ... मैं एक घंटे से अधिक समय से Google और सब कुछ खोज रहा हूं, और मैं अभी तक एक समाधान नहीं आया था।

मदद काफी सराहना की है। धन्यवाद!

जवाबों:


74

ऐसा लगता है कि आपके स्टैश में एक अनट्रैक फ़ाइल शामिल है जिसे बाद में रेपो में जोड़ा गया था। जब आप कोशिश करते हैं और इसे देखते हैं, तो सही तरीके से मना कर देते हैं क्योंकि यह एक मौजूदा फ़ाइल को अधिलेखित कर देगा।

ठीक करने के लिए, आप उस फ़ाइल को हटाने जैसा कुछ कर सकते हैं (यह ठीक है, यह अभी भी रेपो में है), अपने स्टैश को लागू करना, और फिर इन-रेपो संस्करण के साथ फ़ाइल के स्टैक्ड संस्करण को उपयुक्त रूप में बदलना।

संपादित करें: यह भी संभव है कि फ़ाइल केवल काम के पेड़ में ही बनाई गई हो, बिना रेपो में जोड़े। इस मामले में, केवल स्थानीय फ़ाइल को न हटाएं, बल्कि:

  1. इसे कहीं और ले जाएं
  2. छप को लागू करें
  3. मैन्युअल रूप से दो फ़ाइल संस्करणों (कार्यशील पेड़ बनाम स्थानांतरित) को मर्ज करें।

2
क्या कोई रास्ता है जिससे मैं भविष्य में चीजों को छिपाने से बच सकता हूं ... मैं एसवीएन से आता हूं, और यह बहुत आगे दिखता है ... आप बस अपडेट करें, संघर्षों को हल करें, और फिर प्रतिबद्ध करें। Git इतना कठिन नहीं हो सकता है, कि मुझे चक्र में 2 चरण जोड़ने की आवश्यकता है। एक बार फिर धन्यवाद!
मिगुएल एंजेलो

2
@ मिगुएल: स्ट्रैसिंग एक बाधा नहीं है। यह गिट द्वारा प्रदान किया गया एक अतिरिक्त उपकरण है जो आपको अपने वर्कफ़्लो को बेहतर बनाने और संघर्षों और अशुद्ध संचार से बचने की अनुमति देता है। git-scm.com/docs/git-stash
कोराकोर 20

8
हालांकि उत्तर मान्य है, मैं वास्तव में निश्चित नहीं हूं कि इस पर गिट "सही" है। फाइलें रेपो में हैं, इसलिए डेटा हानि का कोई खतरा नहीं है। केवल परिवर्तनों को लागू क्यों नहीं किया? इस धागे को देखें - git.661346.n2.nabble.com/stash-refuses-to-pop-td7453780.html
studgeek

5
मुझे लगता है कि यह उत्तर सबसे ज्यादा मददगार नहीं है। git stashस्थानीय परिवर्तनों का शीघ्रता से बैकअप लेने में मदद करनी चाहिए। मैन्युअल रूप से फ़ाइलों के एक सेट को हटाने के लिए यह प्रवाह को तोड़ता है। git stash branchअन्य जवाब में दृष्टिकोण बेहतर लगता है, लेकिन अभी भी बहुत कुछ मैनुअल वांछित है।
16

यह जवाब मेरे लिए सबसे अच्छा काम किया जब एक ही स्थिति में। जब मैंने स्टैप को पॉपअप किया तो मैं एक मर्ज से गुज़रा जैसे मुझे शुरू से ही उम्मीद थी।
बिली लाज़ारो

58

सबसे सुरक्षित और आसान तरीका शायद चीजों को फिर से मारना होगा:

git stash -u             # This will stash everything, including unstaged files
git stash pop stash@{1}  # This will apply your original stash

बाद में यदि आप परिणाम से खुश हैं तो आप कॉल कर सकते हैं

git stash drop

अपनी "सुरक्षित" रोक हटाने के लिए।


2
इसके लिए धन्यवाद, मुझे बहुत सारे दर्द और पीड़ा से बचाया!
danjarvis

9
स्‍टैश पॉप आपके मूल स्‍टश को लागू करेगा और छोड़ देगा। के applyबजाय सुरक्षित उपयोग करने के लिए pop
हिलब्रांड बूवकैंप

2
वास्तव popमें applyऔर का एक संयोजन है drop, लेकिन केवल dropअगर applyसंघर्ष के बिना काम किया। लेकिन हाँ, applyआमतौर पर सुरक्षित है।
कोरकटोर

2
यह मानता है कि जिस कार्य निर्देशिका को आप रखना चाहते हैं, उसमें कोई अन्य परिवर्तन नहीं हैं। इस विशेष प्रश्न के लिए उनका तात्पर्य है (लेकिन स्पष्ट रूप से यह नहीं कहता) वह एक स्वच्छ स्थिति में है, लेकिन मैं यह बताना चाहता था कि स्थानीय परिवर्तन के साथ यहां आने वाले अन्य लोगों के लिए।
स्टडेक

1
यह केवल समस्या को हल करता है यदि परस्पर विरोधी समस्याएं नहीं हुई हैं । आपको ठीक वैसा ही संदेश मिलता है जब वे प्रतिबद्ध हो गए हैं (जैसे एक साफ चेकआउट के साथ) और फिर इससे कोई चीज नहीं बदलेगी ...
जैस्पर

56

जैसा कि @bentolo ने उल्लेख किया है, आप मैन्युअल रूप से उन फ़ाइलों को हटा सकते हैं जिनके बारे में शिकायत है, शाखाओं को स्विच करें, और फिर उन्हें मैन्युअल रूप से वापस जोड़ें। लेकिन मैं व्यक्तिगत रूप से "गिट के भीतर" रहना पसंद करता हूं।

ऐसा करने का सबसे अच्छा तरीका है कि स्टैश को ब्रांच में बदलना। एक बार यह एक शाखा है जिसे आप सामान्य शाखा से संबंधित तकनीकों / उपकरणों का उपयोग करके सामान्य रूप से काम कर सकते हैं जिन्हें आप जानते हैं और प्यार करते हैं। यह वास्तव में सूचीबद्ध त्रुटि नहीं होने पर भी स्टैग के साथ काम करने के लिए एक उपयोगी सामान्य तकनीक है। यह अच्छी तरह से काम करता है क्योंकि वास्तव में एक आवरण कवर (पीएस देखें) के तहत एक प्रतिबद्ध है।

एक शाखा को एक टकराव परिवर्तित करना

निम्नलिखित एचएएडी के आधार पर एक शाखा बनाता है जब स्टैश बनाया गया था और फिर स्टैश लागू करता है (यह इसे प्रतिबद्ध नहीं करता है)।

git stash branch STASHBRANCH

"स्लैश शाखा" के साथ काम करना

अब आप आगे क्या करते हैं, यह स्टैश के बीच संबंध पर निर्भर करता है और आपकी लक्ष्य शाखा (जिसे मैं ORIGINALBRANCH कहूंगा) अब है।

विकल्प 1 - स्टैब ब्रांच को सामान्य रूप से रीबेज करें (स्टैश के बाद बहुत सारे बदलाव)

यदि आपने अपने ORIGINALBRANCH में बहुत से बदलाव किए हैं, तो आप शायद किसी स्थानीय शाखा की तरह STASHBRANCH का सबसे अच्छा इलाज कर रहे हैं। STASHBRANCH में अपने परिवर्तन करें, इसे ORIGINALBRANCH पर रीबैज़ करें, फिर ORIGINALBRANCH पर स्विच करें और इसके ऊपर STASHBRANCH परिवर्तनों को मर्ज करें। यदि संघर्ष होते हैं तो उन्हें सामान्य रूप से संभालें (इस दृष्टिकोण का एक लाभ यह है कि आप संघर्षों को देख और हल कर सकते हैं)।

विकल्प 2 - मूल शाखा को स्लैश से मिलान करने के लिए रीसेट करें (स्लैश के बाद से सीमित परिवर्तन)

यदि आप अभी कुछ मंचन किए गए परिवर्तनों को ध्यान में रखते हुए टकराए हैं, तो प्रतिबद्ध हैं, और आप जो कुछ करना चाहते हैं, वह अतिरिक्त परिवर्तन है कि जहाँ आप मंचित नहीं हुए हैं, आप निम्नलिखित कार्य कर सकते हैं। यह आपकी कार्यशील प्रति को बदले बिना आपकी मूल शाखा और सूचकांक पर वापस आ जाएगा। अंतिम परिणाम आपके काम की कॉपी में आपके अतिरिक्त बदलाव होंगे।

git symbolic-ref HEAD refs/heads/ORIGINALBRANCH
git reset

पृष्ठभूमि

स्ट्रैस कमिट हैं लाइक ब्रांच / टैग्स (पैच नहीं)

पुनश्च, यह एक पैच के रूप में एक स्टैश के बारे में सोचने के लिए आकर्षक है (जैसे यह एक पैच के रूप में एक कमेंट के बारे में सोचने के लिए लुभा रहा है), लेकिन एक स्टैश वास्तव में HEAD के खिलाफ एक प्रतिबद्ध है जब इसे बनाया गया था। जब आप आवेदन / पॉप करते हैं तो आप चेरी के समान कुछ कर रहे होते हैं। ध्यान रखें कि शाखाएं और टैग वास्तव में केवल कमिट करने के लिए संदर्भ हैं, इसलिए कई तरीकों से, एक शाखा में टैग्स, शाखाएं और टैग्स एक कमिट (और इसके इतिहास) की ओर इशारा करते हैं।

कभी-कभी जरूरत पड़ने पर भी जब आपने वर्किंग डायरेक्टरी में बदलाव नहीं किया है

PPS, आपको इस तकनीक की आवश्यकता हो सकती है - बस स्टैच के साथ --patch और / या --include-untracked का उपयोग करने के बाद। यहां तक ​​कि काम करने वाली निर्देशिकाओं को बदलने के बिना, वे विकल्प कभी-कभी एक ऐसी स्थिति पैदा कर सकते हैं जिसे आप अभी वापस लागू नहीं कर सकते। मुझे मानना ​​चाहिए कि क्यों पूरी तरह से समझ में नहीं आता है। कुछ चर्चा के लिए http://git.661346.n2.nabble.com/stash-refuses-to-pop-td7453780.html देखें ।


5
इस उत्तर को समाधान के रूप में चिह्नित किया जाना चाहिए क्योंकि यह 'लॉक किए गए स्टैश' को सबसे प्रभावी ढंग से हल करने के बारे में सबसे उपयोगी संकेत प्रदान करता है। हो सकता है कि 'सिंपल डिलीट सॉल्यूशन' का उल्लेख करके और दूसरे विकल्प के रूप में ब्रांच सॉल्यूशन में सुधार करें।
bentolor

8
यदि आप इस परिदृश्य का सामना कर रहे हैं तो "git stash Branch STASHBRANCH" काम नहीं करता है (ठीक यही त्रुटि संदेश पॉप के साथ होता है)। आपको पहले से कुछ git resets करने पड़ सकते हैं।

+1 मैं खुद को कमिटमेंट और बदलाव और स्टैशिंग आदि के साथ स्पेगेटी मेस में मिला। यह मुझे स्टैच को एक शाखा से पॉप करके मिला, धन्यवाद स्टूडियोज
रॉबज सिप

स्पष्टीकरण के बारे में धन्यवाद कि कैसे लड़ियाँ पैच नहीं होती हैं और उन्हें HEAD से कैसे जोड़ा जाता है (चोरी के समय)। यह काफी काम की बात है। - तो, ​​मुझे लगता है कि ऐसे मामले हैं जहां एक स्टैश के बजाय पैच बनाने के लिए अधिक लचीला / पोर्टेबल / सुविधाजनक है (जैसा कि आपने उल्लेख किया है: जब बहुत सारे बदलाव होते हैं), ताकि इसे कहीं भी लागू किया जा सके (और सिर्फ विवादों को सुलझाने की बात)। हो सकता है कि git stash show -pवहाँ बनाने के लिए मदद कर रहा है गुप्त कोष -> * पैच *।
कामाफेदर 12

39

समाधान: आपको प्रश्न में फ़ाइल को हटाने की आवश्यकता है, फिर पॉप को हटाने / फिर से लागू करने का प्रयास करें और इसे गुजरना चाहिए। अन्य फ़ाइलों को नष्ट न करें, बस त्रुटि के द्वारा उल्लिखित हैं।

समस्या: गिट कभी-कभी बेकार है। git stash -uइसे चलाते समय इसमें अनट्रैक फाइल्स (कूल!) शामिल होती हैं, लेकिन यह उन अनट्रैक फाइल्स को हटा नहीं पाती है और नहीं है (शांत नहीं!) कैसे बचा के शीर्ष पर रखे ट्रैक न किए गए फ़ाइलों लागू करने के लिए पता है, जो वास्तव में बनाता है -uविकल्प बहुत बेकार।


3
यदि यह मेरा प्रश्न होता तो मैं इस उत्तर को स्वीकार कर लेता। धन्यवाद @qwertzguy, आपके उत्तर ने मेरी समस्या हल कर दी,
मायबर्ग

अपने आप को एक ही मुद्दे में चलाने के लिए, गिट स्टैश पॉप तब तक लागू नहीं होगा जब तक कि मैं प्रश्न में फ़ाइलों को हटा नहीं देता - तब मैं एक फ़ाइल के साथ एक संघर्ष में भाग गया, जिसके कारण टकराव को अस्वीकार कर दिया गया था। लेकिन इसके बजाय फिर उन git stash -u
टूटी

बुरी सलाह यदि आपको प्रभावित फ़ाइलों के दोनों संस्करणों से भागों की आवश्यकता है।
वॉलफ

2
"यह उन फ़ाइलों को नहीं हटाता है" ... और उन्हें सूची में नहीं रखता है git stash show। इस जवाब ने लाइटबल्ब को आगे कर दिया।
jscs

2
गीत के लिए प्लस एक कभी कभी बेकार है।
हरीश

29

इसके स्थान पर कोड अंतर को पैच के रूप में लागू करने के लिए, निम्न कमांड का उपयोग करें:

git stash show --patch | patch -p1

11
आमतौर पर अनाम कोड की कुछ पंक्तियों को पोस्ट करने के बजाय किसी समाधान की व्याख्या करना बेहतर होता है। आप पढ़ सकते हैं कि मैं एक अच्छा उत्तर कैसे लिखूं , और पूरी तरह से कोड-आधारित उत्तरों की व्याख्या भी कर सकता हूं
मासिमिलियानो क्रूस

मेरे लिए यह काम git stash show --patchअनचाहे फाइलों से पैच के रूप में नहीं है।
स्टीवन शॉ

इस जवाब ने मुझे बहुत मदद की क्योंकि मैं अपने रेपो में बहुत सारे बदलावों के कारण अपने स्टैश को पॉप करने में असमर्थ था क्योंकि स्टैश को धक्का दिया गया था।
एरिक फिनमैन

1

यह मेरे साथ कई बार हुआ है, मैंने अनट्रैक की गई फाइलों को स्टैश किया है git stash -u जिसके अंत में रेपो में जोड़ा जा रहा है और मैं अब स्टैक्ड परिवर्तनों को लागू नहीं कर सकता।

मुझे git stash pop/applyफ़ाइलों को बदलने के लिए बाध्य करने का कोई तरीका नहीं मिला , इसलिए मैं सबसे पहले उन अनटैक की गई फ़ाइलों की स्थानीय प्रतियों को हटा देता हूं जो स्टैक्ड थीं ( सावधान रहें क्योंकि यह उन परिवर्तनों को हटा देगा जो प्रतिबद्ध नहीं हैं ) और फिर स्टैक्ड परिवर्तनों को लागू करें :

rm `git ls-tree -r stash@{0}^3 --name-only`
git stash apply

अंत में, मैं उपयोग करता हूँ git status, git diffऔर अन्य उपकरणों की जाँच और हटाए गए फ़ाइलों से वापस भागों को जोड़ने के लिए अगर वहाँ कुछ याद आ रही है।


यदि आपके पास कोई परिवर्तन नहीं है जिसे आप रखना चाहते हैं, तो आप पहले एक अस्थायी प्रतिबद्धता बना सकते हैं:

git add --all
git commit -m "dummy"
rm `git ls-tree -r stash@{0}^3 --name-only`
git stash apply

पहले से किए गए परिवर्तनों को स्थानीय फ़ाइलों में वापस मर्ज करने के लिए और डमी प्रतिबद्ध को हटाने के लिए जो भी उपकरण आपको सूट करता है उसका उपयोग करें:

git reset HEAD~1

0

मेरा समान रूप से अवरुद्ध पॉप ऑपरेशन था क्योंकि बचे हुए ने फ़ाइलों को अनदेखा कर दिया था (.ignignore फ़ाइल देखें)। Git स्थिति ने मुझे ट्रैक और अनट्रैक किया, लेकिन मेरी गतिविधियों को अनदेखा फ़ाइलों को साफ नहीं किया।

विवरण: मैंने इस्तेमाल किया थाgit stash save -a , मूल व्यवहार को संकलित करने और देखने के लिए मास्टर की जाँच की, फिर संपादन जारी रखने के लिए इसे वापस रखने की कोशिश की। जब मैंने अपनी शाखा की जाँच की और पॉप करने की कोशिश की, तो मेरी नजरअंदाज की गई फाइलें स्टैश सेव से पहले भी थीं। ऐसा इसलिए है क्योंकि मास्टर के चेकआउट ने केवल प्रतिबद्ध फ़ाइलों को प्रभावित किया है - यह अनदेखा फ़ाइलों को मिटा नहीं है। इसलिए पॉप विफल हो गया, अनिवार्य रूप से यह कहना कि वह अभी भी वहां मौजूद फाइलों के शीर्ष पर मेरी अटकी हुई अनदेखी फ़ाइलों को पुनर्स्थापित नहीं करना चाहता था। यह दुर्भाग्यपूर्ण है कि मैं उनके साथ मर्ज सत्र शुरू करने का कोई तरीका नहीं निकाल पाया।

अंत में, मैं git clean -f -d -xनजरअंदाज की गई फाइलों को हटा देता था। दिलचस्प बात यह है कि मेरी ~ 30, 4 फाइलें अभी भी सफाई के बाद बनी हुई हैं (उपनिर्देशिकाओं में दफन)। मुझे यह पता लगाना होगा कि वे किस श्रेणी में हैं, इसलिए उन्हें मैन्युअल रूप से हटाना पड़ा।

फिर मेरा पॉप सफल हुआ।



-1

अन्य समाधान:

cd to/root/your/project

# Show what git will be remove
git clean -n

# If all is good
git clean -f

# If not all is good, see
git clean --help

# Finish
git stash pop

प्रश्न में उल्लिखित त्रुटि एक फाइल के कारण होती है जो स्टैक और वर्किंग डायरेक्टरी दोनों में मौजूद होती है। सफाई केवल इसे ठीक करती है यदि यह फ़ाइल अनट्रैक है, जो निश्चित रूप से हमेशा मामला नहीं है (और ओपी का मामला नहीं है, क्योंकि उसे एक पुल से फाइल मिली है)।
जेवियर पोइनस

-1

Git 2.14.x / 2.15 (Q3 2017) के साथ, 2014 से क्वर्टीज़्गी का समाधान अब आवश्यक नहीं होगा।

Q3 2017 से पहले, आपको प्रश्न में फ़ाइल को हटाना होगा, फिर पॉप को स्टैश / फिर से लागू करने का प्रयास करें।
अगले Git रिलीज के साथ, आपको ऐसा नहीं करना पड़ेगा।

निकोलस मोरे-चैसेमार्टिन ( ) द्वारा bbffd87 (11 अगस्त 2017) देखें । ( जूनियो सी हमानो द्वारा विलय - - में 0ca2f32 , 23 अगस्त 2017)nmorey
gitster

stash: रीसेट करने से पहले अनटैक की गई फ़ाइलों को साफ़ करें

यदि git stash -uएक रेपो पर कॉल करना जिसमें एक फ़ाइल शामिल है जिसे फ़ाइल के वर्तमान संशोधन के कारण किसी भी अधिक अनदेखा नहीं किया गया gitignoreहै, तो यह फ़ाइल स्टैक्ड है, लेकिन काम करने वाले पेड़ से नहीं हटाएं।
यह git-stashपहले ऐसा करने के कारण होता है reset --hardजो .gitignoreफ़ाइल संशोधन को साफ करता है और फिर कॉल git cleanको छोड़ देता है, जिससे फाइल अछूता रहता है।
यह git stash popफ़ाइल मौजूदा के कारण विफल हो जाता है

यह पैच बस सफाई और रीसेट के बीच क्रम को स्विच करता है और इस usecase के लिए एक परीक्षण जोड़ता है।


-1

पीछा करने का सबसे सुरक्षित तरीका

git stash -u

यह अस्थिर परिवर्तन सहित सभी को रोक देगा

git stash ड्रॉप

आपके द्वारा इस पर काम करने के बाद, अपनी "सुरक्षित" रोक को हटाने के लिए।


जैसा कि stackoverflow.com/a/23743125/6309 में बताया गया है , यह हमेशा Git 2.14 या उससे कम के साथ काम नहीं करेगा। यह Git 2.15: stackoverflow.com/a/46027357/6309
VonC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.