git - गिट भंडार में हटाए गए फ़ाइल को ढूंढें और पुनर्स्थापित करें




file-io git-checkout (14)

git undelete path/to/file.ext

  1. इसे अपने .bash_profile में रखें (या अन्य प्रासंगिक फ़ाइल जो लोड करते समय लोड हो जाती है):

    git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'
    
  2. फिर उपयोग करें:

    git undelete path/to/file.ext
    

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

https://code.i-harness.com

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

मुझे पता है कि मैं git checkout HEAD^ foo.bar का उपयोग करके एक फ़ाइल चेकआउट कर सकता git checkout HEAD^ foo.bar , लेकिन मुझे वास्तव में नहीं पता कि वह फ़ाइल कब हटा दी गई थी।

  1. दिए गए फ़ाइल नाम को हटाए गए प्रतिबद्धता को ढूंढने का सबसे तेज़ तरीका क्या होगा?
  2. उस फ़ाइल को मेरी कामकाजी प्रतिलिपि में वापस लाने का सबसे आसान तरीका क्या होगा?

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


  1. git log --diff-filter=D --summary उपयोग करें git log --diff-filter=D --summary उन सभी git log --diff-filter=D --summary को प्राप्त करने के लिए जो फ़ाइलों को हटा चुके हैं और फ़ाइलों को हटा दिया गया है;
  2. हटाए गए फ़ाइल को पुनर्स्थापित करने के लिए git checkout $commit~1 filename का उपयोग करें।

जहां $commit आपको चरण 1 पर मिली प्रतिबद्धता का मूल्य है, उदाहरण के लिए e4cf499627


कई मामलों में, यह गिट के संयोजन के साथ coreutils (grep, sed, आदि) का उपयोग करने के लिए उपयोगी हो सकता है। मैं पहले से ही इन उपकरणों को अच्छी तरह से जानता हूं, लेकिन गिट कम है। अगर मैं एक हटाई गई फाइल की खोज करना चाहता था, तो मैं निम्नलिखित करता हूं:

git log --raw | grep -B 30 $'D\t.*deleted_file.c'

जब मुझे संशोधन / प्रतिबद्धता मिलती है:

git checkout <rev>^ -- path/to/refound/deleted_file.c

जैसे दूसरों ने मेरे सामने कहा है।

फ़ाइल को अब उस स्थिति में बहाल कर दिया जाएगा जो इसे हटाने से पहले था। अगर आप इसे चारों ओर रखना चाहते हैं तो इसे काम करने वाले पेड़ पर फिर से प्रतिबद्ध करना याद रखें।


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

git rev-list -n 1 HEAD -- <file_path>

फिर कैरेट ( ^ ) प्रतीक का उपयोग करते हुए पहले प्रतिबद्धता पर संस्करण को चेकआउट करें:

git checkout <deleting_commit>^ -- <file_path>

या एक कमांड में, अगर $file फ़ाइल फ़ाइल में है।

git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"

यदि आप zsh का उपयोग कर रहे हैं और EXTENDED_GLOB विकल्प सक्षम है, तो कैरेट प्रतीक काम नहीं करेगा। आप इसके बजाय ~1 उपयोग कर सकते हैं।

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"

मुझे यह समाधान मिला है।

  1. उस प्रतिबद्धता की आईडी प्राप्त करें जहां फ़ाइल को नीचे दिए गए तरीकों में से एक का उपयोग करके हटा दिया गया था।

    • git log --grep=*word*
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word* git log --stat | grep --context=5 *word* # अनुशंसा की जाती है यदि आपको शायद ही कुछ याद रखें
  2. आपको कुछ ऐसा मिलना चाहिए:

प्रतिबद्ध bfe68bd117e1091c96d2976c99b3bcc8310bebe7 लेखक: अलेक्जेंडर Orlov तिथि: गुरु मई 12 23:44:27 2011 +0200

replaced deprecated GWT class
- gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script

प्रतिबद्ध 3ea4e3af253ac6fd1691ff6bb89c964f54802302 लेखक: अलेक्जेंडर ओरलोव तिथि: गुरु मई 12 22:10:22 2011 +0200

3 । अब प्रतिबद्ध आईडी का उपयोग कर bfe68bd117e1091c96d2976c99b3bcc8310bebe7 करें:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

चूंकि प्रतिबद्ध आईडी उस प्रतिबद्धता का संदर्भ देती है जहां फ़ाइल पहले ही हटा दी गई थी, आपको bfe68b से पहले ही प्रतिबद्धता का संदर्भ देना होगा जिसे आप ^1 जोड़कर कर सकते हैं। इसका मतलब है: मुझे bfe68b से पहले ही प्रतिबद्धता दें।


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

सूची लटकती है

git fsck --lost-found

प्रत्येक लटकती प्रतिबद्धता का निरीक्षण करें

git reset --hard <commit id>

जब मैं लटकती प्रतिबद्धता में चला गया तो मेरी फाइलें फिर से दिखाई दीं।

कारण के लिए git status :

“HEAD detached from <commit id where it detached>”


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

git checkout HEAD -- path/to/file.ext


यदि आप पागल हैं, तो git-bisect उपयोग करें। यहां क्या करना है:

git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>

अब स्वचालित परीक्षण चलाने का समय है। शेल कमांड '[ -e foo.bar ]' अगर foo.bar मौजूद है, और 1 अन्यथा वापस आ जाएगा। git-bisect का "रन" कमांड बाइनरी खोज का उपयोग स्वचालित रूप से पहली प्रतिबद्धता को खोजने के लिए करेगा जहां परीक्षण विफल हो जाता है। यह दी गई सीमा के माध्यम से आधा रास्ते शुरू होता है (अच्छे से बुरे से) और निर्दिष्ट परीक्षण के परिणाम के आधार पर इसे आधा में कटौती करता है।

git bisect run '[ -e foo.bar ]'

अब आप उस प्रतिबद्धता पर हैं जिसने इसे हटा दिया है। यहां से, आप भविष्य में वापस कूद सकते हैं और परिवर्तन को पूर्ववत करने के लिए git-revert का उपयोग कर सकते हैं,

git bisect reset
git revert <the offending commit>

या आप एक प्रतिबद्धता वापस जा सकते हैं और क्षति का मैन्युअल रूप से निरीक्षण कर सकते हैं:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .

यदि आप फ़ाइल नाम जानते हैं, तो बुनियादी आदेशों के साथ यह एक आसान तरीका है:

उस फ़ाइल के लिए सभी कामों की सूची बनाएं।

git log -- path/to/file

अंतिम प्रतिबद्धता (शीर्षतम) वह है जिसने फ़ाइल को हटा दिया है। तो आपको दूसरी प्रतिबद्धता को दूसरे को पुनर्स्थापित करने की आवश्यकता है।

git checkout {second to last commit} -- path/to/file

यदि आपने केवल परिवर्तन किए हैं और एक फ़ाइल हटा दी है, लेकिन इसे प्रतिबद्ध नहीं करते हैं, और अब आप अपने परिवर्तनों के साथ टूट गए हैं

git checkout -- .

लेकिन आपकी हटाई गई फाइलें वापस नहीं आईं, आप बस निम्न आदेश करते हैं:

git checkout <file_path>

और presto, आपकी फाइल वापस आ गया है।


हटाए गए और सबमिट की गई फ़ाइल को पुनर्स्थापित करने के लिए:

git reset HEAD some/path
git checkout -- some/path

यह गिट संस्करण 1.7.5.4 पर परीक्षण किया गया था।


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

चार्ल्स बेली के उत्कृष्ट उत्तर के आधार पर मेरा एक लाइनर है:

git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)

git checkout /path/to/deleted.file





git-checkout