Git में गिरा हुआ निशान कैसे ठीक करें?


1734

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

मुझे पता है कि अगर मैं उपयोग करता हूं git stashतो .it / refs / stash में स्ट्रैश बनाने के लिए उपयोग किए गए कमिट का संदर्भ होता है। और .it / log / refs / stash में पूरा स्टाॅश होता है। लेकिन उन संदर्भों के बाद चले गए हैं git stash pop। मुझे पता है कि कमेटी अभी भी मेरे भंडार में है, लेकिन मुझे नहीं पता कि यह क्या था।

क्या कल के स्टैस कमिट रेफरेंस को रिकवर करने का एक आसान तरीका है?

ध्यान दें कि यह आज मेरे लिए महत्वपूर्ण नहीं है क्योंकि मेरे पास दैनिक बैकअप है और मेरे परिवर्तन प्राप्त करने के लिए कल के काम के पेड़ पर वापस जा सकते हैं। मैं पूछ रहा हूँ क्योंकि वहाँ एक आसान तरीका होना चाहिए!


74
भविष्य के लिए ध्यान दें: यदि आप हर बार अपना नुकसान नहीं उठाना चाहते हैं git stash pop, तो आप इसके git stash applyबजाय कर सकते हैं । यह एक ही काम करता है, सिवाय इसके कि यह लागू किए गए स्लैश के संदर्भ को नहीं हटाता है।
केविन

3
यहाँ सब कुछ करने की कोशिश की, पहले से ही popped था कि एक छिपाने की जगह नहीं मिल सका। IntelliJ के jetbrains.com/help/idea/local-history.html के
जुआन मेंडेस


मुझे यह समस्या थी। मेरी रेपो अद्यतन करने के लिए, मैं भाग गया git stash, git pull -r upstream, git push -f origin, git stash pop, और पॉप ने कहा, "घातक: refs के लिए लॉग / गुप्त कोष खाली है।" Bunch मैंने इन उत्तरों की एक गुच्छा कोशिश की, कुछ भी काम नहीं किया। जब मैंने .it / refs / stash में देखा , तो SHA वहां था। शायद ऑफ़लाइन सिंक के लिए विंडोज नेटवर्क ड्राइव को चिह्नित करने में कोई समस्या है? 🤷🤷 at
14:३३ से

जवाबों:


2782

एक बार जब आप अपने द्वारा छोड़े गए कमिट के हैश को जान लेते हैं, तो आप इसे एक स्लैश के रूप में लागू कर सकते हैं:

git stash apply $stash_hash

या, आप इसके लिए एक अलग शाखा बना सकते हैं

git branch recovered $stash_hash

उसके बाद, आप सभी सामान्य उपकरणों के साथ जो चाहें कर सकते हैं। जब आप पूरा कर लें, तो बस शाखा को उड़ा दें।

हैश का पता लगाना

यदि आपके पास केवल इसे पॉप अप किया गया है और टर्मिनल अभी भी खुला है, तो आपके पास git stash popस्क्रीन पर मुद्रित हैश मान होगा (धन्यवाद, डोडा)।

अन्यथा, आप इसे विंडोज के लिए लिनक्स, यूनिक्स या गिट बैश के लिए उपयोग कर पा सकते हैं:

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

... या Windows के लिए पॉवर्सशेल का उपयोग करना:

git fsck --no-reflog | select-string 'dangling commit' | foreach { $bits = $_ -split ' '; echo $bits[2];}

यह आपको आपके कमिट ग्राफ के उन सभी कमिटों को दिखाएगा जो अब किसी भी शाखा या टैग से संदर्भित नहीं हैं - हर खोई हुई कमिट, जिसमें आपके द्वारा बनाए गए हर स्टैट कमिट भी शामिल हैं, उस ग्राफ में कहीं न कहीं होंगे।

आप जिस स्ट्रैस को चाहते हैं, उसे ढूंढने का सबसे आसान तरीका है gitk:

gitk --all $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' )

... या विंडोज के लिए पॉवर्सशेल का उपयोग करते हुए एमरगिन से उत्तर देखें ।

यह एक रिपॉजिटरी ब्राउज़र लॉन्च करेगा, जो आपको रिपॉजिटरी में हर एक कमिटमेंट दिखाएगा , भले ही वह पहुंच योग्य हो या नहीं।

यदि आप कंसोल पर एक अच्छा ग्राफ पसंद करते हैं gitk, git log --graph --oneline --decorateतो आप कुछ के साथ बदल सकते हैं जैसे कि GUI ऐप।

स्‍टैश कमिट करने के लिए, इस फॉर्म के कमिट मैसेज देखें:

Somebranch         पर WIP : कुछ पुराने कमिट मैसेज को कमिट करें

नोट : प्रतिबद्ध संदेश केवल इस रूप में होगा ("WIP on" के साथ शुरू) यदि आपने एक संदेश की आपूर्ति नहीं की है जब आपने किया था git stash


49
जयदेल ने मेरे मुंह से शब्द निकाले। इस पोस्ट ने मेरी नौकरी बचा दी :) मैं सिर्फ यह जोड़ना चाहूंगा - आपने जो कुछ भी खोया है उस पर काम करने की तारीख को याद रखना जो आप खोज रहे हैं उसके लिए गिट ब्राउज़ करना आसान बनाता है।
श्रीधर सरनोबत

4
@ कोडी: क्योंकि पॉवरशेल। मुझे नहीं पता कि क्या MsysGit एक AWK बाइनरी जहाज करता है। Googling मुझसे कहता है कि कुछ ऐसा %{ $_.Split(' ')[2]; }करना चाहिए जो PowerShell {print $3}में उस awkकमांड के बराबर करना चाहिए , लेकिन मेरे पास परीक्षण करने के लिए एक विंडोज सिस्टम नहीं है, और आपको अभी भी /dangling commit/भाग के लिए एक समकक्ष की आवश्यकता है । वैसे भी, बस रन करें git fsck --no-reflogऔर आउटपुट देखें। आप "लटकती प्रतिबद्ध <प्रतिबद्ध>" लाइनों से हैश चाहते हैं।
अरस्तू पैगल्टज़िस

7
यह ध्यान देने योग्य है कि प्रतिबद्ध संदेश में केवल स्ट्रिंग "WIP" होगा यदि आपने अपना संदेश तब प्रदान नहीं किया है जब आप (यानी करके git stash save "<message>")।
समीर अगुइर

12
यदि आपको पता है कि ड्रॉप कब हुआ था, तो आप इस वन-लाइनर का उपयोग समय बढ़ाने के साथ झूलने की सूची प्राप्त करने के लिए कर सकते हैं: git fsck --no-reflog | awk '/dangling commit/ {print $3}' | xargs -L 1 git --no-pager show -s --format="%ci %H" | sortअंतिम प्रविष्टि संभवतः वह है जिसे आप चाहते हैं stash apply
उदय at_लो_जन ०

3
git stash apply {ref}एक गिरा हुआ झड़प बहाल! gitयह बहुत अच्छा है यह अवैध होना चाहिए!
टॉम रसेल

707

यदि आपने टर्मिनल को बंद नहीं किया है, तो बस से आउटपुट देखें git stash popऔर आपके पास गिराए गए स्टैश का ऑब्जेक्ट आईडी होगा। यह आम तौर पर इस तरह दिखता है:

$ git stash pop
[...]
Dropped refs/stash@{0} (2ca03e22256be97f9e40f08e6d6773c7d41dbfd1)

(ध्यान दें कि git stash dropयह भी एक ही लाइन का उत्पादन करता है।)

उस स्टैश को वापस पाने के लिए, बस दौड़ें git branch tmp 2cae03e, और आप इसे एक शाखा के रूप में प्राप्त करेंगे। इसे चरणबद्ध में बदलने के लिए, चलाएं:

git stash apply tmp
git stash

एक शाखा के रूप में होने से यह आपको स्वतंत्र रूप से हेरफेर करने की अनुमति देता है; उदाहरण के लिए, इसे चेरी से चुनें या मर्ज करें।


54
तुम भी कर सकते हैं git stash apply commitidतो git stashएक नया संघर्ष पाने के लिए।
मैथ्यू फ्लैशेन

32
ध्यान दें कि यदि गिट स्‍टैश को मर्ज करता है और टकराव होता है, तो यह आपको हैश नहीं दिखाएगा।
जेम्स

31
@ नाम: फिर, यदि उन संघर्षों का परिणाम है git stash pop, तो यह या तो रोक नहीं होगा, इसलिए यह आम तौर पर एक समस्या नहीं है।
Dolda2000

2
मेरे git स्‍टैश पॉप आउटपुट में कोई SHA नहीं था। :(
दूर खाते

2
@ हनी: यह बात है git stash pop। यदि आप इसे छोड़ने के बिना स्टेश को लागू करना चाहते हैं, तो git stash applyइसके बजाय का उपयोग करें । इसके अतिरिक्त, यदि आप कई शाखाओं में बदलाव लागू करना चाहते हैं, तो आप इसके बजाय कमिटमेंट को भी चुन सकते हैं।
डोडा

271

बस इसके अतिरिक्त स्वीकृत समाधान का उल्लेख करना चाहता था। यह मेरे लिए पहली बार स्पष्ट नहीं था कि मैंने यह तरीका आज़माया (शायद यह होना चाहिए), लेकिन हैश मान से स्टैश लगाने के लिए, बस "git stash apply" का उपयोग करें:

$ git stash apply ad38abbf76e26c803b27a6079348192d32f52219

जब मैं गाइट के लिए नया था, यह मेरे लिए स्पष्ट नहीं था, और मैं "गिट शो", "गिट लागू", "पैच", आदि के विभिन्न संयोजनों की कोशिश कर रहा था।


3
ध्यान दें कि यह लागू होता है (दोह!) वर्तमान कार्यशील पेड़ के लिए टकराव। यदि पेड़ गंदा है, तो आप या तो एक अस्थायी शाखा का उपयोग करना चाहते हैं या पहले स्टाॅश कर सकते हैं, SHA-1 से स्टाॅस लगा सकते हैं, फिर से स्लैश कर सकते हैं और फिर दूसरे से लास्ट स्टाॅश (जिसे स्टेश @ {1} कहा जाता है) को पॉप करें।
मुसिक

111

उन भंडार की सूची प्राप्त करने के लिए जो अभी भी आपके भंडार में हैं, लेकिन किसी भी अधिक उपलब्ध नहीं हैं:

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

यदि आपने अपने स्‍टेश को एक शीर्षक दिया है, तो -grep=WIPअपने संदेश के एक भाग के साथ कमांड के अंत में "WIP" को बदलें , जैसे -grep=Tesselation

कमांड "WIP" के लिए ग्रीप कर रहा है क्योंकि एक स्टैश के लिए डिफॉल्ट कमिट मैसेज फॉर्म में है WIP on mybranch: [previous-commit-hash] Message of the previous commit.


1
गूंज 'गिट fsck - अप्राप्य | grep कमिट | कट -d "" -f3 | xargs git log --merges --no-walk --grep = WIP '> / usr / local / bin / git-stashlog; chmod a + rx / usr / local / bin / git-stashlog # गिट स्टैशलॉग
एरिक मार्टिनो

या आप इसे अपने .itconfig को उपनाम के रूप में जोड़ सकते हैं (पूर्व आदेश के साथ !)।
22

मेरे बेकन को बचाया - अच्छी तरह से वास्तव में नहीं, लेकिन मुझे दिनों के काम को फिर से कोडित करने से बचाया - सराहना की - यह देखते हुए कि मैंने हाल ही में गिरा दिया है मैंने अभी-अभी आपके कमांड के आउटपुट से शीर्ष SHA उठाया है - फिर .... git stash apply SHA ... जैसा कि अन्य उत्तरों में उल्लेख किया गया है - कई thx
danday74

75

मैंने सिर्फ एक कमांड का निर्माण किया, जिससे मुझे अपनी खोई हुई कमिट कमिटमेंट को खोजने में मदद मिली:

for ref in `find .git/objects | sed -e 's#.git/objects/##' | grep / | tr -d /`; do if [ `git cat-file -t $ref` = "commit" ]; then git show --summary $ref; fi; done | less

यह .git / ऑब्जेक्ट्स ट्री में सभी ऑब्जेक्ट्स को सूचीबद्ध करता है, जो टाइप कमिट के होते हैं, को रेखांकित करता है, फिर हर एक का सारांश दिखाता है। इस बिंदु से यह उचित "WIP on work: 6a9bb2" ("काम" मेरी शाखा है, 619bb2 एक हालिया प्रतिबद्ध है) खोजने के लिए कमिट के माध्यम से देखने की बात थी।

मैं ध्यान देता हूं कि अगर मैं "git stash pop" के बजाय "git stash pop" का उपयोग करता हूं तो मुझे यह समस्या नहीं होगी, और यदि मैं "git stash save message " का उपयोग करता हूं, तो कमिटमेंट खोजने में आसान हो सकता है।

अपडेट: नाथन के विचार से, यह छोटा हो जाता है:

for ref in `git fsck --unreachable | grep commit | cut -d' ' -f3`; do git show --summary $ref; done | less

41

git fsck --unreachable | grep commitशा 1 दिखाना चाहिए, हालांकि यह जो सूची देता है वह काफी बड़ा हो सकता है। git show <sha1>यह दिखाएगा कि क्या यह आपकी इच्छा है।

git cherry-pick -m 1 <sha1> वर्तमान शाखा में कमेटी को मर्ज कर देगा।


37

Gitk का उपयोग करते हुए Windows PowerShell समतुल्य:

gitk --all $(git fsck --no-reflog | Select-String "(dangling commit )(.*)" | %{ $_.Line.Split(' ')[2] })

एक पाइप में ऐसा करने के लिए संभवतः अधिक कुशल तरीका है, लेकिन यह काम करता है।


1
मैं आपके उत्तर के लिए बहुत आभारी हूँ
Виталий fulебаниц

32

यदि आप किसी खोए हुए स्लैश को रोकना चाहते हैं, तो आपको पहले अपने खोए हुए स्लैश का हैश ढूंढना होगा।

जैसा कि अरस्तू पगलतज़िस ने सुझाव दिया था कि git fsckआपको मदद करनी चाहिए।

व्यक्तिगत रूप से मैं अपने log-allउपनाम का उपयोग करता हूं जो मुझे स्थिति के बारे में बेहतर दृष्टिकोण देने के लिए हर प्रतिबद्ध (वसूली योग्य काम) को दिखाता है:

git log --graph --decorate --pretty=oneline --abbrev-commit --all $(git fsck --no-reflogs | grep commit | cut -d' ' -f3)

यदि आप केवल "WIP on" संदेशों के लिए देख रहे हैं, तो आप और भी तेज़ी से खोज कर सकते हैं।

एक बार जब आप अपने sha1 को जान लेते हैं, तो आप बस पुराने स्लैश को जोड़ने के लिए अपने स्लैश को बदल देते हैं:

git update-ref refs/stash ed6721d

आप शायद एक संबद्ध संदेश देना पसंद करेंगे -m

git update-ref -m "$(git log -1 --pretty=format:'%s' ed6721d)" refs/stash ed6721d

और आप इसे एक उपनाम के रूप में उपयोग करना चाहते हैं:

restash = !git update-ref -m $(git log -1 --pretty=format:'%s' $1) refs/stash $1

2
हालाँकि, -d\\ होना चाहिए -d\ (या यहां तक ​​कि स्पष्ट -d' ')
joeytwiddle 2

एक त्रुटि मिली: "घातक: अस्पष्ट तर्क 'झूलने': अज्ञात संशोधन या काम करने वाले पेड़ में नहीं।"
डैनियल रयान

आप भी उद्धरण के साथ उप आदेश रैप करने के लिए की जरूरत है git update-ref -m "$(git log -1 --pretty=format:'%s' ed6721d)" refs/stash ed6721
आंद्रेई Shostik

18

मुझे अरस्तू का दृष्टिकोण पसंद था, लेकिन GITK का उपयोग करना पसंद नहीं था ... जैसा कि मुझे कमांड लाइन से GIT का उपयोग करने के लिए उपयोग किया जाता है।

इसके बजाय, मैंने झूलने वाले कमिट ले लिए और अपने कोड एडिटर में समीक्षा के लिए कोड को डीआईएफएफ फ़ाइल में आउटपुट कर दिया।

git show $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' ) > ~/stash_recovery.diff

अब आप परिणामी अंतर / txt फ़ाइल (अपने होम फोल्डर में) को अपने txt संपादक में लोड कर सकते हैं और वास्तविक कोड और परिणाम देख सकते हैं।

तो बस उपयोग करें

git stash apply ad38abbf76e26c803b27a6079348192d32f52219

17

आप टर्मिनल में यह कमांड लिखकर सभी पहुंच से बाहर हो सकते हैं -

git fsck --unreachable

जांच करने योग्य प्रतिबद्ध हैश -

git show hash

अंत में अगर आपको स्टैक्ड आइटम मिल जाए तो आवेदन करें -

git stash apply hash

15

लोग यह सवाल क्यों पूछते हैं? क्योंकि वे अभी तक रिफ्लॉग के बारे में नहीं जानते या समझते हैं।

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

मैं इस प्रश्न के साथ सभी को सलाह दूंगा कि केवल रिफ्लॉग (git reflog) की जांच करें, इससे अधिक नहीं। एक बार जब आप देखते हैं कि सभी कमिट्स की सूची में सौ तरीके हैं, तो यह पता लगाने के लिए कि आप किस चीज की तलाश कर रहे हैं और इसे चेरी-पिक करें या उससे एक शाखा बनाएं। इस प्रक्रिया में आपने विभिन्न मूल git कमांडों के रिफ्लॉग और उपयोगी विकल्पों के बारे में जाना होगा।


1
हाय रॉबी। यह प्रासंगिक है अगर आप काम कर रहे थे, साइड-ट्रैक हो गया, और वापस लेने की आवश्यकता है जहां आपने कुछ हफ़्ते पहले छोड़ दिया था केवल यह जानने के लिए कि आप अपने अटके हुए काम को नहीं पा सकते हैं - यह शायद उस अन्य सामान में कहीं खो गया है कर रहे थे। अगर यह हालिया इतिहास है, लेकिन लंबे समय तक अंतराल के लिए नहीं, तो रिफ्लॉग बहुत अच्छा है।
इमग्रिन्स

1
हे emragins, मैं सहमत हूँ, लेकिन यह बिल्कुल ओपी का उपयोग मामला था। मैं यह सुनिश्चित करने के लिए नहीं जानता कि यहां तैनात अन्य कमांड किस तरह का व्यवहार करेंगे, लेकिन मेरा भूसा यह होगा कि वे एक बार काम करना बंद कर दें, क्योंकि उनकी स्टैडड कमिट का रेफरी साफ हो जाता है।
रॉबडी जुएल

1
हम्म ... ऊपर का परिदृश्य जो मुझे इस सवाल पर लाया गया था, और मुझे पता है कि यह कम से कम कुछ हफ़्ते का था अगर मैं एक महीने के करीब भी नहीं था जब मैंने (अनजाने में) अपना स्टैश खो दिया था और जब मैं इसे पुनर्प्राप्त करने में सक्षम था।
एमरजिन्स

15

OSX में git v2.6.4 के साथ, मैं गलती से git स्‍टैश ड्रॉप चलाता हूं, तो मैंने इसे गर्त से नीचे जाते हुए पाया

यदि आपको स्‍टेश का नाम पता है तो उपयोग करें:

$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show | grep -B 6 -A 2 <name of the stash>

अन्यथा आपको मैन्युअल रूप से परिणाम से आईडी मिलेगी:

$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show

फिर जब आपको कमिट-आईट मिल जाए तो बस हिट करें

आशा है कि यह किसी को जल्दी से मदद करता है


12

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

git fsck --no-reflog | awk '/dangling commit/ {print $3}' > tmp_commits

for h in `cat tmp_commits`; do git show $h | less; done

फिर आप उन हैश के लिए एक के बाद एक प्रदर्शित किए गए सभी भिन्नताएं प्राप्त करते हैं। अगले अंतर पर जाने के लिए 'q' दबाएँ।


12

मुझे विंडोज पर एक साधारण कमांड विंडो (मेरे मामले में विंडोज 7) में काम करने का कोई जवाब नहीं मिला। awk, grepऔर Select-stringकमांड के रूप में मान्यता प्राप्त नहीं थे। इसलिए मैंने एक अलग तरीका आजमाया:

  • प्रथम रन: git fsck --unreachable | findstr "commit"
  • नोटपैड को आउटपुट कॉपी करें
  • बदलें "अगम्य प्रतिबद्ध" के साथ बदलें start cmd /k git show

कुछ ऐसा दिखाई देगा:

start cmd /k git show 8506d235f935b92df65d58e7d75e9441220537a4 start cmd /k git show 44078733e1b36962571019126243782421fcd8ae start cmd /k git show ec09069ec893db4ec1901f94eefc8dc606b1dbf1 start cmd /k git show d00aab9198e8b81d052d90720165e48b287c302e

  • एक .bat फ़ाइल के रूप में सहेजें और उसे चलाएं
  • स्क्रिप्ट प्रत्येक कमांड को दिखाते हुए कमांड विंडो का एक गुच्छा खोलेगी
  • यदि आपको वह मिल गया, जिसे आप ढूंढ रहे हैं, चलाएं: git stash apply (your hash)

सबसे अच्छा समाधान नहीं हो सकता है, लेकिन मेरे लिए काम किया


आप विंडोज पर भी git bash का उपयोग कर सकते हैं। Git bash में आपके पास सभी (unixoid) कमांड लाइन टूल्स हैं जिनकी आपको आवश्यकता है।
एड्रियन डब्ल्यू

10

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

git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
  --grep="WIP on" --min-parents=3 --max-parents=3

इसमें केवल वे कमेंट्स शामिल होंगे, जिनमें 3 पेरेंट कमिट्स (जिसमें एक स्टैश होगा), और जिनके मैसेज में "WIP on" शामिल है।

ध्यान रखें, यदि आपने अपना संदेश संदेश (जैसे git stash save "My newly created stash") से बचा लिया है , तो यह डिफ़ॉल्ट "WIP on ..." संदेश को ओवरराइड कर देगा।

आप प्रत्येक प्रतिबद्ध के बारे में अधिक जानकारी प्रदर्शित कर सकते हैं, जैसे कि प्रतिबद्ध संदेश प्रदर्शित करें, या इसे पास करें git stash show:

git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
  --grep="WIP on" --min-parents=3 --max-parents=3 | \
xargs -n1 -I '{}' bash -c "\
  git log -1 --format=medium --color=always '{}'; echo; \
  git stash show --color=always '{}'; echo; echo" | \
less -R

6

मेरा पसंदीदा यह वन-लाइनर है:

git log --oneline  $( git fsck --no-reflogs | awk '/dangling commit/ {print $3}' )

यह मूल रूप से इस उत्तर के समान विचार है लेकिन बहुत कम है। बेशक, आप अभी भी --graphएक पेड़ के समान प्रदर्शन प्राप्त करने के लिए जोड़ सकते हैं।

जब आपको सूची में कमिटमेंट मिल जाए, तो आवेदन करें

git stash apply THE_COMMIT_HASH_FOUND

मेरे लिए, उपयोग --no-reflogsने खोए हुए स्टैश एंट्री को प्रकट किया, लेकिन --unreachable(जैसा कि कई अन्य उत्तरों में पाया गया) नहीं किया।

जब आप Windows के अंतर्गत हों तो इसे gash bash पर चलाएँ।

क्रेडिट: उपरोक्त आदेशों का विवरण https://gist.github.com/joseluisq/7f0f1402f05c45bac10814a9e38f81bf से लिया गया है


5

निम्नलिखित चरणों का उपयोग करके इसे पुनर्प्राप्त किया गया:

  1. हटाए गए स्टैश हैश कोड को पहचानें:

    gitk --all $ (git fsck --no-reflog | awk '/ dangling प्रतिबद्ध / {प्रिंट $ 5}))

  2. चेरी दंश उठाओ:

    git चेरी-पिक -m 1 $ stash_hash_code

  3. यदि कोई उपयोग कर रहा हो तो विरोधों को हल करें:

    git mergetool

इसके अतिरिक्त अगर आप gerrit का उपयोग कर रहे हैं तो आप प्रतिबद्ध संदेश के साथ समस्या हो सकती है। अगले विकल्पों का पालन करने से पहले कृपया अपने परिवर्तनों को रोकें:

  1. पिछली प्रतिबद्धता के लिए हार्ड रीसेट का उपयोग करें और फिर इस परिवर्तन को पुनः प्राप्त करें।
  2. आप परिवर्तन, रिबेस और पुन: जमाव को भी रोक सकते हैं।

@ miva2 आपके संपादन ने इस प्रश्न के सबसे सही उत्तर के लिंक को हटा दिया। लिंक को वापस टिप्पणी में
अभिजीत

4

मैं यहाँ क्या देख रहा था कि वास्तव में मैं जो भी जाँच कर चुका हूँ, उसकी स्टाॅक वापस कैसे ली जाये। विशेष रूप से, मैंने कुछ स्टैक्ड किया था, फिर एक पुराने संस्करण की जांच की, फिर इसे पॉप किया, लेकिन यह स्टैश उस समय के बिंदु पर एक नो-ऑप था, इसलिए यह स्टैश गायब हो गया; मैं बस git stashइसे स्टैक पर वापस धकेलने के लिए नहीं कर सकता । यह मेरे लिए काम किया:

$ git checkout somethingOld
$ git stash pop
...
nothing added to commit but untracked files present (use "git add" to track)
Dropped refs/stash@{0} (27f6bd8ba3c4a34f134e12fe69bf69c192f71179)
$ git checkout 27f6bd8ba3c
$ git reset HEAD^    # Make the working tree differ from the parent.
$ git stash # Put the stash back in the stack.
Saved working directory and index state WIP on (no branch): c2be516 Some message.
HEAD is now at c2be516 Some message.
$ git checkout somethingOld # Now we are back where we were.

रेट्रोस्पेक्ट में, मुझे उपयोग git stash applyनहीं करना चाहिए था git stash pop। मैं एक कर रहा था bisectऔर एक छोटा सा पैच था जिसे मैं हर bisectकदम पर लागू करना चाहता था । अब मैं यह कर रहा हूँ:

$ git reset --hard; git bisect good; git stash apply
$ # Run tests
$ git reset --hard; git bisect bad; git stash apply
etc.

यह एक उत्तर है, या प्रश्न की निरंतरता है?
एलेक्स ब्राउन

दोनों का थोड़ा सा। मुझे यह पृष्ठ इसलिए मिला क्योंकि मैंने एक स्टैश खो दिया था और इसे वापस पाने की कोशिश कर रहा था। मेरे लिए उपयोग का मामला एक द्विशताब्दी है जहां मैं प्रत्येक चरण पर परीक्षण से पहले एक परिवर्तन लागू करना चाहता हूं। मैंने कठिन तरीका सीखा है कि आप सिर्फ पॉप, टेस्ट, स्टैश, बाइसेक्ट नहीं कर सकते क्योंकि यह स्टैश पर एक अलग कमिट छोड़ सकता है, इसलिए stash apply
बेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.