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


Answers

  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 का उपयोग करें।
Question

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

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

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

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




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

  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 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>”




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

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

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

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

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

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




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

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

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




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

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




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

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

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)



मेरे नए पसंदीदा उपनाम, 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\"" 



Links