दिलचस्प पोस्ट
जावा का उपयोग कर एक निर्देशिका में फाइल की संख्या की गिनती कैसे? पैरामीटर और पसंद कथन SQL इतिहास में दफन किए गए एक गिट कमिट को मैं कैसे विभाजित कर सकता हूं? वरीयता स्क्रीन में टाइमपिकर मज़बूती से एक सरणी में तत्वों की संख्या निर्धारित करें सुंदरसूप खोज एक प्राप्त यूडीपी पैकेट का गंतव्य पता प्राप्त करें वसंत में एक क्वार्ट्ज नौकरी में बीन संदर्भ इंजेक्ट? चर संयोजन के लिए एकल उद्धरण या दोहरे उद्धरण? व्युत्पन्न वर्ग में ओवरराइंड किए गए कार्य आधार वर्ग के अन्य अतिभारियों को क्यों छिपाते हैं? इकाई फ़्रेमवर्क के साथ अहस्ताक्षरित int / long types का उपयोग कैसे करें? एक्सेल के लिए सीएसवी फ़ाइल जनरेट करना, मूल्य के अंदर एक नई लाइन कैसे है सभी div सामग्री को अक्षम कैसे करें वेब ब्राज़र को IE9 में मानकों को कैसे नियंत्रित करें? UIWebView के अंदर जावास्क्रिप्ट डिबग करने के कुछ तरीके क्या हैं?

कैसे गिट में गिरा दिया छिपाने की जगह को ठीक करने के लिए?

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

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

कल के छिपाने की जगह को पुनर्प्राप्त करने का एक आसान तरीका क्या है?

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

Solutions Collecting From Web of "कैसे गिट में गिरा दिया छिपाने की जगह को ठीक करने के लिए?"

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

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

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

और विंडोज के लिए:

 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}' ) 

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

आप एक अलग जीयूआई एप पर कंसोल पर एक अच्छा ग्राफ पसंद करते हैं, तो git log --graph --oneline --decorate तरह कुछ के साथ git log --graph --oneline --decorate जगह कर सकते हैं – git log --graph --oneline --decorate

छिपाने की जगह कमाने के लिए, इस फ़ॉर्म के संदेश भेजें:

Somebranch पर डब्ल्यूआईपी : कुछ पुराने प्रतिबद्ध संदेश

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

एक बार जब आप चाहते हैं, तो आप इसे छिपाने के रूप में लागू कर सकते हैं:

 git stash apply $stash_hash 

या आप gitk में संदर्भ मेनू का उपयोग किसी भी अप्राप्य कमिट के लिए शाखाएं बनाने के लिए कर सकते हैं, जिसमें आपकी रुचि है। उसके बाद, आप उन सभी सामान्य टूल के साथ जो कुछ भी चाहते हैं, आप कर सकते हैं। जब आप कर लेंगे, तो सिर्फ उन शाखाओं को फिर से फेंक दो।

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

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

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

उस स्थिति को वापस पाने के लिए, बस git branch tmp 2cae03e , और आप इसे एक शाखा के रूप में प्राप्त करेंगे इसे छिपाने के लिए परिवर्तित करने के लिए, चलाएं:

 git stash apply tmp git stash 

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

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

 $ git stash apply ad38abbf76e26c803b27a6079348192d32f52219 

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

मैंने सिर्फ एक कमांड का निर्माण किया है जो मुझे अपना खोया छिपाने की खोज में मदद करता था:

 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 / ऑब्जेक्ट्स के पेड़ में सभी ऑब्जेक्ट्स को सूचीबद्ध करता है, जो टाइप कमिट के हैं, फिर प्रत्येक एक का सारांश दिखाता है इस बिंदु से यह एक उचित "काम पर डब्ल्यूआईपी: 6 ए 9 बीबी 2" ("काम" मेरी शाखा है, 619 बीबी 2 हाल ही में एक प्रतिबद्ध है) खोजने के लिए प्रतिबद्धता के माध्यम से देखने का मामला था।

मुझे लगता है कि यदि मैं "git छिपाने की जगह पॉप" के बजाय "git छिपाने की जगह लागू" का उपयोग करता हूं, तो मुझे यह समस्या नहीं होती, और अगर मैं "git stash save message " का उपयोग करता हूं तो संभवतः मिलना आसान हो सकता है

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

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

स्टैश की सूची प्राप्त करने के लिए जो आपके रिपॉजिटरी में अभी भी हैं, लेकिन किसी भी अधिक पहुंच नहीं:

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

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

यह आदेश "डब्ल्यूआईपी" के लिए grepping है क्योंकि एक छिपाने के लिए डिफ़ॉल्ट प्रतिबद्ध संदेश WIP on mybranch: [previous-commit-hash] Message of the previous commit. के रूप WIP on mybranch: [previous-commit-hash] Message of the previous commit.

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

git cherry-pick -m 1 <sha1> मौजूदा शाखा में प्रतिबद्ध को विलय करेगा।

यदि आप एक खोया छिपाने की जगह को शांत करना चाहते हैं, तो आपको पहले अपने खोया छिपाने की जगह के हैश खोजने की आवश्यकता है।

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

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

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

यदि आप केवल "डब्ल्यूआईपी ऑन" संदेशों के लिए देख रहे हैं तो आप एक तेज़ खोज कर सकते हैं

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

 git update-ref refs/stash ed6721d 

आप संभवत: किसी संबद्ध संदेश को पसंद करेंगे I

 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 

मुझे ऐरिस्टोले के दृष्टिकोण पसंद आया, लेकिन जीआईटीके का उपयोग करना पसंद नहीं था … क्योंकि मुझे कमांड लाइन से जीआईटी का उपयोग करने के लिए उपयोग किया जाता है

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

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

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

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

 git stash apply ad38abbf76e26c803b27a6079348192d32f52219 

जीआईटी v2.6.4 के साथ ओएसएक्स में, मैं गिट स्टैश ड्रॉप को गलती से चलाता हूं, फिर मुझे नीचे की तरफ कदम उठाता है

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

$ 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

तब जब आप कमिट-आईडी को ढूंढते हैं तो बस git छिपाने की जगह मारो {commit-id} लागू करें

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

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

 git fsck --no-reflog | awk '/dangling commit/ {print $3}' > tmp_commits for h in `cat tmp_commits`; do git show $h | less; done 

तब आपको उन डिब्बों को प्राप्त होता है जो एक दूसरे के बाद प्रदर्शित होते हैं। अगले अंतर को पाने के लिए 'q' दबाएं

Windows PowerShell समकक्ष gitk का उपयोग कर:

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

शायद एक पाइप में यह करने के लिए एक अधिक कुशल तरीका है, लेकिन यह नौकरी करता है

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

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

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

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

 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 

इसमें केवल ऐसे कमान शामिल होंगे, जिनके ठीक तीन माता-पिता हैं (जो एक छिपाने की जगह होगी), और जिनके संदेश में "डब्ल्यूआईपी ऑन" शामिल है

ध्यान रखें, यदि आपने अपना संदेश किसी संदेश के साथ सहेजा है (उदाहरण के git stash save "My newly created stash" ), तो यह डिफ़ॉल्ट "डब्लूपी ऑन …" संदेश को ओवरराइड करेगा

आप प्रत्येक प्रतिबद्ध के बारे में अधिक जानकारी प्रदर्शित कर सकते हैं, उदाहरण के लिए प्रतिबद्ध संदेश प्रदर्शित करें, या इसे 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 

मैं विंडोज पर एक साधारण कमान विंडो में काम करने के लिए कोई जवाब नहीं पा सकता (मेरे मामले में विंडोज 7)। awk , grep और Select-string आज्ञाओं के रूप में पहचाने नहीं गए थे इसलिए मैंने एक अलग दृष्टिकोण की कोशिश की:

  • पहला रन: git fsck --unreachable | findstr "commit" 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 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. 

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

  1. हटाए गए छिपाना हैश कोड की पहचान करें:

    gitk –all $ (git fsck –no-reflog | awk '/ dangling commit / {प्रिंट $ 3}')

  2. चेरी चुरा लेना उठाओ:

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

  3. किसी भी का उपयोग करते हुए संघर्षों का समाधान करें:

    git mergetool

इसके अतिरिक्त आपको संदेश भेजकर समस्या हो सकती है यदि आप gerrit का उपयोग कर रहे हैं कृपया अगले विकल्पों को पूरा करने से पहले अपने बदलावों को छिपाने के लिए:

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