हटाए गए फ़ाइल को Git रिपॉजिटरी में खोजें और पुनर्स्थापित करें


2802

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

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

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

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


39
ध्यान दें कि पिछली टिप्पणी शीर्षक में सवाल का जवाब देती है, न कि शरीर में - जिसमें यह पता लगाना शामिल है कि फाइल कब डिलीट की गई थी।
अवदाग

8
कमिट ढूंढने के लिए एक फाइल को डिलीट कर दिया गया:git log --diff-filter=D -- path/to/file
टाइटेनियम



54
@hhh git checkout deletedFileहटाना रद्द कर देगा deletedFileयदि इसे हटा दिया गया है, लेकिन उस विलोपन का अभी तक मंचन या प्रतिबद्ध नहीं किया गया है । यही सवाल यहाँ नहीं पूछ रहा है; यह प्रश्न उस फ़ाइल को पुनर्स्थापित करने के तरीके के बारे में है जिसका विलोपन कई कमिट पहले किया गया था।
मार्क एमी

जवाबों:


3149

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

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"

94
मुश्किल बिट ^ प्रत्यय का उपयोग करते हुए, पहले से प्रतिबद्ध जांच करने के लिए है। धन्यवाद।
क्रिश्चियन औडर्ड

4
किसी कारण से, यह zsh में काम नहीं करेगा। ± git checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^ मैं बैश करने के लिए स्विच किया और यह ठीक काम किया।
जोरास

20
विंडोज़ कमांड लाइन से मुझे एक त्रुटि मिली। error: pathspec <filename> did not match any file(s) known to git.। इसका उपाय गिट बैश का उपयोग करना था।
नॉटनर

56
@ ज़ोरस zsh का '^' पर अपना विस्तार है, मेरा मानना ​​है, लेकिन आप '~ 1' के वैकल्पिक वाक्यविन्यास का उपयोग कर सकते हैं: git checkout <deleting-commit>~1 -- <file-path> ~ X आपको निर्दिष्ट प्रतिबद्धताओं से पहले एक्स कमिट्स निर्दिष्ट करने की अनुमति देता है, इसलिए ~ 1 से पहले यह प्रतिबद्ध है, ~ 2 दो से पहले है, आदि
Nils Luxton

22
विंडोज़ cmd प्रॉम्प्ट पर, ^कैरेक्टर एस्केप कैरेक्टर है! इसलिए, cmd पर, आपको cmd ^^को यह बताने के लिए टाइप करना होगा कि आप एकल शाब्दिक ^ चाहते हैं और इसके बाद आपका कुछ और बच नहीं रहा है। कई लोगों के लिए क्या हो रहा है कि ^एक अंतरिक्ष द्वारा पीछा किया जाता है। तो cmd सोचता है कि आप अंतरिक्ष से बच रहे हैं - जो केवल एक अंतरिक्ष चरित्र देता है। इस प्रकार, द्वारा समय Git CLI तर्क हो जाता है, इसे देखता है SHA1और नहीं SHA1^ । इससे वाकई बहुत गुस्सा आता है। ~भागने का पात्र नहीं है, इसीलिए यह अभी भी काम करता है। (पुनश्च अगर आपको लगता है कि googler इस जानकारी को चाहते हैं, तो कृपया इस टिप्पणी को आगे बढ़ाएं)
अलेक्जेंडर बर्ड

875
  1. git log --diff-filter=D --summaryउन सभी कमिटों को प्राप्त करने के लिए उपयोग करें, जिन्होंने डिलीट की गई फाइलें और डिलीट की गई फाइलें;
  2. git checkout $commit~1 path/to/file.extहटाए गए फ़ाइल को पुनर्स्थापित करने के लिए उपयोग करें ।

$commitचरण 1 में आपको मिली कमिट का मान कहाँ है, उदाe4cf499627


10
उत्सुक, ~ 1 को क्या दर्शाता है?
टॉमी चेंग

7
@tommy - टिल्ड स्पेक आपको नामित कमेटी का nth पोता देगा। अधिक जानकारी के लिए book.git-scm.com/4_git_treeishes.html देखें ।
रॉबर्ट मुंटेनू

5
यह अब तक का सबसे आसान और सहज दृष्टिकोण है। git log -- *PartOfMyFileName*। के लिए धन्यवाद$commit~1
bgs

3
git checkout $commit~1 filenameवाक्य रचना अलग-अलग फ़ाइलों के लिए एकदम सही काम करता है, और भी पूरे निर्देशिकाओं के लिए काम करता है। अर्थात्: सभी नष्ट कर दिया छवियों को बहाल करने के लिए। sha sha 12345 से git checkout 12345~1 images:। इस उत्तर के लिए धन्यवाद!
4

34
@ अलेक्सार का $commit~1मतलब है कि आपको कमिट का नाम जोड़ना चाहिए। 1d0c9ef6eb4e39488490543570c31c2ff594426cजहां $commitजैसा कुछ है।
यूजीन

319

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

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

1
फ़ाइलों को कहां से पाइप किया जाता है? मुझे कोई बदलाव नहीं दिख रहा है।
विलियम ग्रैंड

21
यह शायद सबसे आसान तरीका है। यह विकृत है कि कितना मुश्किल gitकाम भी आसान काम है।
jww

git checkout - [फ़ाइल] [फ़ाइल] में परिवर्तन वापस कर देगा। पाइप हटाए गए फ़ाइलों के नाम के साथ [फ़ाइल] को बदल देगा।
मनु

6
ls-filesउप कमान आसान है, लेकिन उस के साथ निकाल दिया गया था फ़ाइलों के लिए काम करने के लिए प्रतीत नहीं होता है git rmयानी मंचन किया, अकेले प्रतिबद्ध है, जो है क्या ओ पी पूछा।
MarkHu

यह हटाई गई फ़ाइलों को पुनर्स्थापित करने के लिए काम किया है, लेकिन मैं उन फ़ाइलों को कैसे अपडेट कर सकता हूं जहां बदल गया और M myChangedFileबाद में दिखा git checkout?
लिब्बी

124

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

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


93

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

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

अब स्वचालित परीक्षण चलाने का समय आ गया है। शेल कमांड '[ -e foo.bar ]'0 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 .

2
क्या आप विस्तार से बता सकते हैं git bisect run '[ -e foo.bar ]'?
अवधगं

आप अच्छे और बुरे का उपयोग मैन्युअल रूप से कर सकते हैं, अगर यह कुछ ऐसा है जिसे स्वचालित रूप से जांचा नहीं जा सकता है। बाइसेक्ट मैन पेज देखें।
जोश ली

1
@avdagag git bisect runGit को 'रन' शब्द के बाद कमांड चलाकर बाइसेक्शन को स्वचालित करने के लिए कहता है जहां कमांड को 0एक goodसंस्करण के लिए वापस लौटना चाहिए ( git help bisectविवरण के लिए देखें)। '[ -e foo.bar ]'जांच करना है कि फ़ाइल के लिए एक मानक अभिव्यक्ति है foo.barमौजूद है (कार्यान्वयन फ़ाइल में आमतौर पर है करता है /usr/bin/[जो आम तौर पर करने के लिए hardlinked है /usr/bin/test) और एकल quation के निशान एक भी कमांड लाइन तर्क के रूप में वह सब डाल करने के लिए उपयोग किया जाता है।
मिकको रैंटलैनेन

महान विचार। मैंने इस दृष्टिकोण की कोशिश की और इसने विलोपन से पहले एक कमिट की पहचान की, लेकिन वह कमिट नहीं जिसने वास्तव में फाइल को डिलीट किया। और एक अन्य परीक्षण में यह पहचान की गई 2 हटाए जाने से पहले करता है।
माइकल ओस्फोस्की

पागल? शायद। लेकिन बिज़ेक एक बग खोजने में मदद करने का एक शानदार तरीका है और इसलिए यह वैसे भी सीखने के लिए एक मूल्यवान कौशल है। हालांकि, शायद 'सही' या सबसे 'सही' तरीका नहीं है, फिर भी यह एक अच्छा विचार है और निश्चित रूप से एक +1 के लायक है!
प्रिएफ्टन

77

मेरा नया पसंदीदा उपनाम, जो बोनीआई के उत्तर ( अपवोटेड ) पर आधारित है , और मेरा खुद का जवाब " एक तर्क उर्फ ​​कमांड को पास करें ":

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

संकट टली।

चेतावनी, Git 2.23 (Q3 2019) के साथ प्रयोगात्मक कमांडgit restore ((!) नाम आता है ।
इसलिए इस उपनाम का नाम बदलें (जैसा कि नीचे दिखाया गया है)।


रॉबर्ट Dailey टिप्पणी में प्रस्ताव निम्नलिखित उपनाम:

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

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

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

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

7
यह अनुरोध की गई फ़ाइल ही नहीं, पूरी प्रतिबद्ध को पुनर्स्थापित करता है।
डेनियल बैंग

5
यहाँ मेरा उपनाम है, अद्भुत काम करता है:restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
void.pointer

1
@RobertDailey जो बहुत अच्छा लग रहा है! अधिक दृश्यता के उत्तर में मैंने आपके उपनाम को शामिल किया है।
वॉन

1
कमांड लाइन से उपनाम स्थापित करने के लिए, मैंने इस कमांड का उपयोग किया:git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
jegan

2
Expansion of alias 'restore' failed; '!git' is not a git command
कार्ल मॉरिसन

54

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

उस फाइल के सभी कमिट्स को सूचीबद्ध करें।

git log -- path/to/file

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

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

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

क्या अगला-टू-लास्ट कमिट (डिलीट करने के लिए पिछली कमिट) में डिलीट की गई फाइल का सबसे हाल का वर्जन नहीं होगा? दूसरा-टू-लास्ट (डिलीट करने के लिए पिछली कमिटमेंट से पहले) उम्मीद से पुराना हो सकता है।
सनकैट

1
यह पहला समाधान है जो मैंने देखा है कि यह काफी सरल है कि मुझे अगली बार इसे खोजने के लिए यहां वापस नहीं आना पड़ेगा। शायद।
एलॉफ

@ Suncat2000 "सेकंड टू लास्ट" का अर्थ है "डिलीट करने के लिए पिछली कमिटमेंट", "अगले से अंतिम" के समान। en.wiktionary.org/wiki/penultimate#Synonyms
wisbucky

इस उत्तर के लिए एक zillion बार धन्यवाद !!!!!
राकेश बीके

29

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

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

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


1
यह मेरे लिए काम नहीं किया। चेकआउट के बाद, मुझे error: pathspec 'foo' did not match any file(s) known to git.पता चला कि फ़ाइल का नाम सही था। Git संस्करण 2.7.0
wisbucky

-1; ये गलत है। ये आदेश एक ऐसी विलोपन को पूर्ववत कर देगा, जो अभी तक नहीं किया गया है (यदि पहला मंच हटाता है, तो इसका मंचन किया जाता है, और दूसरा एक फ़ाइल में परिवर्तन नहीं करता है), लेकिन आप यहाँ दावा कर रहे हैं कि वे प्रतिबद्ध को पुनर्स्थापित करेंगे। फ़ाइल का विलोपन, जो वास्तव में सत्य नहीं है और ऊपर @ वारबैंक की टिप्पणी में उस तरह की त्रुटि के साथ विफल हो जाएगी।
मार्क अमेरी

@MarkAmery वास्तव में, मुझे लगता है कि इस कमांड ने उन डेवलपर्स के लिए अच्छी तरह से काम किया, जिन्होंने हटाए गए फ़ाइलों के लिए प्रतिबद्ध करने के लिए स्पष्ट मंचन नहीं किया था git add -A, लेकिन इसलिए बहाल की गई फाइल अभी भी गैर-प्रतिबद्ध चरण में थी।
फेडिर RYKHTIK

25

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

git checkout -- .

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

git checkout <file_path>

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


24

मुझे इसका हल मिल गया है ।

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

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

प्रतिबद्ध bfe68bd117e1091c96d2976c99b3bcc8310bebe7 लेखक: अलेक्जेंडर ओरलोव दिनांक: 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

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

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

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


स्वीकृत उत्तर के रूप में यह एक ही दृष्टिकोण है, लेकिन हटाने के लिए कुछ और तरीके हैं। मुझे अभी भी स्वीकृत उत्तर में लिया गया दृष्टिकोण पसंद है, लेकिन ये अच्छे विकल्प हैं। धन्यवाद!
avdgaag

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


12

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
    

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


11

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

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

जब मुझे संशोधन / वचन मिल जाए:

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

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

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


7

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

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 rm। मुझे फ़ाइलों को पुनर्स्थापित करने की आवश्यकता थी, लेकिन फिर उन्हें अस्थिर कर दिया। मेरे पास प्रत्येक फ़ाइल के लिए चीजों को पुनर्स्थापित करने और टाइप करने के लिए सैकड़ों फाइलें थीं, जैसा कि अन्य उदाहरणों में बहुत धीमी गति से होने जा रहा था।


7

वास्तव में, यह सवाल सीधे Git के बारे में है, लेकिन मेरे जैसा कोई व्यक्ति WebStorm VCS जैसे GUI टूल के साथ काम करता है GIT CLI कमांड के बारे में जानने के अलावा अन्य ।

मैं उस पथ पर राइट क्लिक करता हूं जिसमें हटाई गई फ़ाइल है, और फिर Git पर जाएं और फिर Show History पर क्लिक करें ।

यहां छवि विवरण दर्ज करें

VCS उपकरण सभी संशोधन ट्रेन दिखाते हैं और मैं उनमें से प्रत्येक के सभी कमिट और परिवर्तन देख सकता हूं।

यहां छवि विवरण दर्ज करें

फिर मैं उन कमिटों का चयन करता हूं जो मेरे दोस्त ने PostAd.jsफाइल को डिलीट कर दिया है। अब नीचे देखें:

यहां छवि विवरण दर्ज करें

और अब, मैं अपनी इच्छा हटाई गई फ़ाइल देख सकता हूं। मैं सिर्फ फ़ाइल नाम पर डबल-क्लिक करता हूं और यह ठीक हो जाता है।

यहां छवि विवरण दर्ज करें

मुझे पता है कि मेरा जवाब Git कमांड नहीं है, लेकिन यह शुरुआती और पेशेवर डेवलपर्स के लिए तेज़, विश्वसनीय और आसान है। WebStorm VCS टूल Git के साथ काम करने के लिए बहुत बढ़िया और सही है और इसे किसी अन्य प्लगइन या टूल की आवश्यकता नहीं है।


1
यह कमाल का है! धन्यवाद। JetBrains 'IDEs का उपयोग करने वालों के लिए निश्चित रूप से एक आसान समाधान है।
फाबियानो अरुडा

यदि यह छवि है तो हम फ़ाइल को कैसे पुनर्स्थापित करेंगे?
नादिराबेगमिक्सेनोयिम

प्रिय @FabianoArruda, JetBrains IDEs विकास के लिए शक्तिशाली उपकरण हैं। आपकी प्यारी टिप्पणी के लिए धन्यवाद।
AmerllicA

प्रिय @PeterMortensen संस्करण के लिए धन्यवाद।
अमेरलिसिया

6

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

झूलने की सूची कमिट करें

git fsck --lost-found

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

git reset --hard <commit id>

जब मैं झूलने वाली कमेटी में गया तो मेरी फाइलें फिर से दिखाई दीं।

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

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


2
आपका बहुत बहुत धन्यवाद। आपने मुझे हज़ारों पंक्तियों को पुनर्स्थापित करने में मदद की।
रूबेन

5
user@bsd:~/work/git$ rm slides.tex
user@bsd:~/work/git$ git pull 
Already up-to-date.
user@bsd:~/work/git$ ls slides.tex
ls: slides.tex: No such file or directory

हटाए गए फ़ाइल को पुनर्स्थापित करें:

user@bsd:~/work/git$ git checkout
D       .slides.tex.swp
D       slides.tex
user@bsd:~/work/git$ git checkout slides.tex 
user@bsd:~/work/git$ ls slides.tex
slides.tex

2
यह प्रश्न हटाए जाने के बाद एक फ़ाइल को पुनर्स्थापित करने के बारे में था और इसमें बदलाव किया गया है। यह उत्तर एक फ़ाइल को पुनर्स्थापित करने के बारे में है जिसे केवल कार्यशील निर्देशिका में हटा दिया गया था।
एकैहोला

यह सच है, और यही मैं ढूंढ रहा था।
होला सो ईदु फेलिज नवाडीद

4

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

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

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


4

अपनी फ़ाइल को हटाने वाली प्रतिबद्ध खोजें:

git log --diff-filter=D --oneline -- path/to/file | cut -f -d ' '

नमूना उत्पादन:

4711174

Git 2.23 के रूप में वास्तव में एक restoreकमांड है। यह अभी भी प्रायोगिक है लेकिन आपके द्वारा किसी कमेटी में निकाले गए कुछ को बहाल करने के लिए (4711174 इस मामले में) आप तब टाइप कर सकते हैं:

git restore --source=4711174^ path/to/file

नोट ^ आईडी प्रतिबद्ध के बाद के रूप में हम प्रतिबद्ध से कुछ को बहाल करना चाहते से पहले एक है कि फ़ाइल हटा दी।

--sourceतर्क कहता है restoreकमान जहां फ़ाइल (फ़ाइलें) को बहाल करने के लिए देखने के लिए और यह किसी भी प्रतिबद्ध और यहां तक कि सूचकांक हो सकता है।

देखें: git 2.23.0 के लिए git-Restore doc


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)

2

सरल और सटीक-

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

git log 

कहते हैं कि आप $ 1234567 प्रतिबद्ध हैं ..., तो

git checkout <$commitid> $fileName

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


1

ऐसा करने का सबसे अच्छा तरीका है, इसे आज़माएं।


सबसे पहले, उस कमेटी की कमेंट आईडी ढूंढें, जिसने आपकी फाइल को डिलीट किया है। यह आपको उन कमिट्स का सारांश देगा जो डिलीट की गई फाइल्स हैं।

git log --diff-filter = D --summary

git checkout 84sdhfddbdddf ~ 1

नोट: 84sdhfddbdddआपका हैcommit id

इसके जरिए आप सभी डिलीट की गई फाइल्स को आसानी से रिकवर कर सकते हैं।


1

आप हमेशा git revertअपनी कमिटमेंट कर सकते हैं जिससे फाइल डिलीट हो जाए। ( यह मानता है कि हटाए जाने के वादे में केवल बदलाव था। )

> git log
commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3
Author: Dave <dave@domain.com>
Date:   Thu May 9 11:11:06 2019 -0700

    deleted readme.md

और अगर आपने काम जारी रखा है, और बाद में महसूस किया कि आप उस विलोपन को कमिट नहीं करना चाहते हैं, तो आप इसका उपयोग करके वापस कर सकते हैं:

> git revert 2994bd

अब git logदिखाता है:

> git log
Author: Dave <dave@domain.com>
Date:   Thu May 9 11:17:41 2019 -0700

    Revert "deleted readme"

    This reverts commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3.

और readme.mdभंडार में बहाल कर दिया गया है।


चूँकि यह सवाल दबाया जाता है कि फ़ाइल डिलीट होने के बाद बहुत सारे कमिट किए गए थे और चूँकि ऐसा कोई संकेत नहीं है कि बाद के कमिट अवांछित हैं, इसलिए यह वर्णित स्थिति में ओपी की मदद करने की संभावना नहीं है।
जोनाथन लेफ़लर

1
हां! आप बाद में कमिट कर सकते हैं, और फिर भी डिलीट कमिट को वापस कर सकते हैं। तो अगर 111 कमिट फ़ाइल को डिलीट करता है, और 222, 333, 444 को कमिट करता है, चीजों को जोड़ता / संशोधित करता है, तो आप डिलीट को पूर्ववत करने के लिए अभी भी 111 को वापस कर सकते हैं, और यह 555 हो जाएगा
डेव बगदैनोव

0

स्थानीय निर्देशिका में पिछली फ़ाइल को पुनः प्राप्त करने के लिए मुझे नीचे दिए गए कोड का उपयोग करके भी यह समस्या है:

git checkout <file path with name>

नीचे दिया गया उदाहरण मेरे लिए काम कर रहा है:

git checkout resources/views/usaSchools.blade.php


कृपया जिक्र करें कि समस्या क्या है
अकबर

विलोपन पहले से ही प्रतिबद्ध था। आपको इस मामले में बहाल करने के लिए प्रतिबद्ध निर्दिष्ट करने की आवश्यकता है।
सबा


-1

यदि विलोपन नहीं किया गया है, तो नीचे दिया गया कमांड कार्यशील ट्री में हटाए गए फ़ाइल को पुनर्स्थापित करेगा।

$ git checkout -- <file>

आप नीचे दिए गए आदेश का उपयोग करके कार्यशील ट्री में सभी हटाए गए फ़ाइलों की एक सूची प्राप्त कर सकते हैं।

$ git ls-files --deleted

यदि विलोपन किया गया है, तो उस प्रतिबद्ध को ढूंढें जहां यह हुआ था, फिर इस कमिट से फ़ाइल को पुनर्प्राप्त करें।

$ git rev-list -n 1 HEAD -- <file>
$ git checkout <commit>^ -- <file>

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

$ git log --diff-filter=D --summary

-1

Git के साथ सभी हटाई गई फ़ाइल को पुनर्स्थापित करने के लिए, आप यह भी कर सकते हैं:

git checkout $(git ls-files --deleted)

जहाँ git ls-files --deletedसभी हटाई गई फ़ाइलों को सूचीबद्ध git checkout $(git command)करता है और एक पैरामीटर में फ़ाइलों की सूची को पुनर्स्थापित करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.