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




file-io git-checkout (16)

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

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

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

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


फ़ोल्डर में उन सभी हटाए गए फ़ाइलों को पुनर्स्थापित करने के लिए निम्न आदेश दर्ज करें।

git ls-files -d | xargs git checkout --

  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


सरल और सटीक-

सबसे पहले, एक नवीनतम स्थिर प्रतिबद्धता प्राप्त करें जिसमें आपके पास वह फ़ाइल है -

git log 

मान लें कि आपको $ प्रतिबद्धता 1234567 ..., फिर मिलती है

git checkout <$commitid> $fileName

यह उस फ़ाइल संस्करण को पुनर्स्थापित करेगा जो उस प्रतिबद्धता में था।


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

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

git log -- path/to/file

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

git checkout {second to last commit} -- path/to/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 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


इसलिए मुझे एक विशिष्ट प्रतिबद्धता से हटाई गई फ़ाइलों का एक समूह बहाल करना पड़ा और मैंने इसे दो आदेशों के साथ प्रबंधित किया:

git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ -- 
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD 

(प्रत्येक कमांड के अंत में पिछली जगह पर ध्यान दें।)

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


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

सूची लटकती है

git fsck --lost-found

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

git reset --hard <commit id>

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

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

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


यदि आप पागल हैं, तो 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 .

यदि आप फ़ाइल को हटाए गए प्रतिबद्धता को जानते हैं, तो इस आदेश को चलाएं जहां <SHA1_deletion> वह फ़ाइल है जो फ़ाइल को <SHA1_deletion> है:

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

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


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

git checkout -- .

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

git checkout <file_path>

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


मेरे नए पसंदीदा उपनाम, bonyiii के answer (upvoted) के आधार पर, और " गिट उपनाम आदेश के लिए एक तर्क पास " के बारे में मेरा स्वयं का जवाब:

git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'

मैंने कुछ फाइलें खो दी हैं, कुछ गलती से गलती से हटा दी गई है?
शीघ्र:

git restore my_deleted_file

संकट टली।

रॉबर्ट डेली ने निम्नलिखित उपनामों में टिप्पणियों का प्रस्ताव दिया:

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

और jegan टिप्पणी में कहते हैं:

कमांड लाइन से उपनाम सेट करने के लिए, मैंने इस कमांड का उपयोग किया:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 

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

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

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


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

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


git checkout /path/to/deleted.file





git-checkout