अकस्मात जीएटी स्टैश पॉप को हटा दें


186

मैंने एक जटिल मर्ज करने से पहले कुछ स्थानीय परिवर्तन किए, मर्ज किया, फिर चलने से पहले बेवकूफी करना भूल गया git stash pop। पॉप ने कुछ समस्याएं (एक बड़े कोडबेस में खराब विधि कॉल) बनाईं जो नीचे ट्रैक करने के लिए कठिन साबित हो रही हैं। मैं भागा git stash show, इसलिए मुझे कम से कम पता है कि कौन सी फाइलें बदली गईं। अगर और कुछ नहीं, मुझे लगता है कि यह एक सबक है और अधिक प्रतिबद्ध है।

मेरा सवाल: क्या यह भी संभव है कि मर्ज को पूर्ववत किए बिना स्टैश पॉप को पूर्ववत करें?


2
आपको git stash popपहले किए बिना अनुमति नहीं दी जानी चाहिए । उसको हासिल करने के लिए आपने क्या किया?
क्रिस जस्टर-यंग

ईमानदार होना निश्चित नहीं है (यह कल था)। मर्ज अपने आप कमिट नहीं हुआ क्योंकि संघर्ष हुए थे। मैं किसी तरह उसके बाद स्टैश पॉप चलाने में सक्षम था।

1
मैं यह सिर्फ git संस्करण 1.7.9.msysgit.0 का उपयोग कर पता था। मेरे पास अस्थिर फाइलें थीं और स्टैश पॉप में बस सबकुछ विलीन हो गया।
पांडा 11

मैं git stash pop2.25.0.windows.1 संस्करण के साथ 2.25.0.windows.1 संस्करण के साथ बदलावों के मंचन के बाद चलने में सक्षम था
आर्टेम हेवोरियन

यदि आप अपने परिवर्तनों को अनुक्रमित करते हैं और उन्हें खो देते हैं जैसा कि आप stash pop/applyएक प्रतिबद्ध बनाने से पहले भागते हैं, तो आप आग लगा सकते हैं git fsck --lost-found। यह कमांड झूलने वाले ब्लब्स (गिट शब्दावली के साथ परिचित नहीं लोगों के लिए वास्तविक फाइलें) के माध्यम से पुनरावृत्ति करेगा, जो मंचन किए गए थे, लेकिन कहीं भी प्रतिबद्ध नहीं थे (इसलिए झूलते हुए), और उन्हें .it / खो-पाया / निर्देशिका के तहत रखा , जहां आप git showउन्हें देख सकते हैं। अगर ये वो फाइलें हैं जिनकी आपको तलाश है।
आर्टेम हेवोरियन

जवाबों:


69

Git में गिराए गए स्लैश को पुनर्प्राप्त करने का उपयोग करके देखें ? आपके द्वारा पॉप किए गए स्टैश को खोजने के लिए। मुझे लगता है कि एक स्टैश के लिए हमेशा दो कमिट होते हैं, क्योंकि यह इंडेक्स और वर्किंग कॉपी को सुरक्षित रखता है (इसलिए अक्सर इंडेक्स कमिट खाली हो जाएगा)। फिर git showउन्हें अंतर देखने और patch -Rउन्हें अनपेक्षित रूप से उपयोग करने के लिए।


6
वाह कि काम किया। मैं git fsck --no-reflog | awk '/dangling commit/ {print $3}'(लिंक से) स्टैट्स कमिट्स को खोजने में सक्षम था , और मैंने सिर्फ उस अंतर से समस्या को मैन्युअल रूप से पाया। धन्यवाद!
नरेन

1
fsck एक बड़ी सूची का उत्पादन करता है। इसके थकाऊ दिखाने के लिए हर SHA1 वहाँ से बाहर है। आप यह कैसे करते हैं ?
मेसोन 10

5
@ मेसोन 10: दुर्भाग्य से स्टैग्स को एक रिफ्लॉग में रखा जाता है, जो कि पॉप्ड स्टैप्स के इतिहास को देखने के लिए एक स्पष्ट तरीका होगा (यदि वे एक वास्तविक शाखा थे)। मुझे यह भी सुझाव देना चाहिए कि मदद के लिए एक downvote + अनुरोध सर्वोत्तम रणनीति नहीं है।
बेन जैक्सन

2
इसे सही करवाने के लिए मुझे थोड़ी मशक्कत करनी पड़ी। यहाँ मेरे काम का परिणाम है git diff -p ${STACH_SHA1}~1 ${STASH_SHA1} | patch -R -p1:; मैंने git showसुझाव के साथ कोशिश की लेकिन इसका उत्पादन पैच के लिए अच्छा नहीं था; मुझे फ़ाइलों को सामने रखने वाले तत्व और तत्व को अलग -p1करने के लिए पैच करने का विकल्प प्रदान करना था अन्यथा यह रिपॉजिटरी रूट से पथ को हल नहीं करता था। सुझाव: सतर्क रहें और पैच के साथ खेलने से पहले एक अलग शाखा में गड़बड़ी करें। a/..b/..git diff
तुलसीकोड

@BenJackson आपके उत्तर में "हमेशा" दोनों का अर्थ है stash popऔर stash pushएक ऐसी प्रतिबद्धता को ट्रिगर करेगा जो सूचकांक और कार्यशील निर्देशिका में परिवर्तनों को बचाएगा, है ना?
आर्टेम हेवरहियन

36

से git stash --help

Recovering stashes that were cleared/dropped erroneously
   If you mistakenly drop or clear stashes, they cannot be recovered through the normal safety mechanisms. However, you can try the
   following incantation to get a list of stashes that are still in your repository, but not reachable any more:

       git fsck --unreachable |
       grep commit | cut -d\  -f3 |
       xargs git log --merges --no-walk --grep=WIP

इससे मुझे उसी परिदृश्य के साथ स्वीकृत उत्तर से बेहतर मदद मिली।


13
ध्यान दें कि "WIP" के लिए खोज करने वाले बहुत सारे समाधान डिफ़ॉल्ट स्लैश संदेशों पर निर्भर हैं। यदि आप अपने संदेश स्पष्ट संदेश देते हैं तो उनमें WIP नहीं हो सकता है।
बेन जैक्सन

धन्यवाद। मैंने पठनीयता में सुधार के लिए लॉग-कमांड में विकल्प --ऑनलाइन जोड़ा।
बासलो

यह केवल आपको स्टैश कमिट का SHA खोजने में मदद करता है। लेकिन अगर स्वीकार किए गए उत्तर से @basilikode टिप्पणी के साथ एकीकृत (git diff SHA ~ 1 SHA | पैच -R), यह ठीक काम करता है। मैं जाँच करने के लिए पहले पथ - चलाने का उपयोग करने की सलाह देता हूँ।
जारेक सी

3

यदि आपका मर्ज बहुत जटिल नहीं था, तो दूसरा विकल्प यह होगा:

  1. "Git stash" का उपयोग करके मर्ज में परिवर्तन सहित सभी परिवर्तनों को वापस स्लैश में ले जाएँ
  2. मर्ज को फिर से चलाएँ और अपने परिवर्तनों को करें (बिना गिराए हुए परिवर्तनों से)
  3. "Git stash pop" चलाएं, जो कि आपके पिछले मर्ज के सभी परिवर्तनों को अनदेखा कर देना चाहिए क्योंकि फाइलें अब समान हैं।

उसके बाद आपके द्वारा छोड़े गए परिवर्तनों से केवल परिवर्तन ही बचा है।

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