प्रोजेक्ट कमिटेड हिस्ट्री में डिलीट की गई फाइल को कैसे खोजें?


1274

एक बार मेरे प्रोजेक्ट में एक फाइल आई, जिसे अब मैं प्राप्त करना चाहूंगा।

समस्या यह है: मुझे पता नहीं है कि मैंने इसे कब हटाया है और यह किस मार्ग पर है।

जब यह मौजूद है तो मैं इस फ़ाइल के कमिट का पता कैसे लगा सकता हूँ?


यहां इसी तरह के प्रश्न: stackoverflow.com/questions/7093602/...
Eckes


13
डुप्लिकेट के उत्तरों की तुलना में यहाँ उत्तर मेरे लिए अधिक उपयोगी हैं ।
फेलिप अल्वारेज

5
सहमत ... डुप्लिकेट की परवाह किए बिना ... वे Google खोज में नहीं आए .... यह एक किया ... मुझे आशा है कि हम डुप्लिकेट के बाद का समय बर्बाद करना बंद कर देंगे ... केवल समय और Google का एल्गोरिदम होगा बताओ कौन सा सवाल सबसे अच्छा है
टिम बोलांड

जवाबों:


1598

अगर आपको सही रास्ते का पता नहीं है तो आप इसका इस्तेमाल कर सकते हैं

git log --all --full-history -- "**/thefile.*"

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

git log --all --full-history -- <path-to-file>

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

git show <SHA> -- <path-to-file>

या इसे अपनी कार्यशील प्रतिलिपि में पुनर्स्थापित करें:

git checkout <SHA>^ -- <path-to-file>

ध्यान रखें कि चिन्हित चिह्न ( ^), जिसे चेकआउट करने से पहले चेकआउट हो जाता है , क्योंकि <SHA>फाइल के नष्ट होने की स्थिति में, हमें हटाए गए फ़ाइल की सामग्री को प्राप्त करने के लिए पिछली प्रतिबद्धताओं को देखना होगा।


2
एक पूर्ण के बजाय एक सापेक्ष पथ का उपयोग करने का प्रयास करें (यदि आप पहले से ही नहीं हैं)।
अंबर

63
यदि आपको सटीक मार्ग का पता नहीं है तो क्या होगा? आप सभी जानते हैं कि फ़ाइल नाम क्या है?
पुजारी

17
@PedroMorteRolo git log -- <path>का कोई आउटपुट नहीं होगा जब आप उस शाखा पर हों जिसमें फ़ाइल कभी मौजूद नहीं थी। आपको हमेशा git log --all -- <path>यह सुनिश्चित करने के लिए उपयोग करना चाहिए कि आप अन्य शाखाओं पर हुए परिवर्तनों को याद नहीं करते हैं। git log -- <path>यदि आप एक से अधिक शाखाएँ रखते हैं और पथ और शाखाओं (मेरे जैसे) को भूल जाते हैं, तो यह आदेश बहुत खतरनाक हो सकता है और यदि आप अन्य डेवलपर्स के साथ काम करते हैं तो यह भी खतरनाक है।
18:10 पर 18:10

4
@ एम्बर, अपने जवाब में --all(धन्यवाद फिलिप ) जोड़ने पर विचार करें git log, ताकि लोग अन्य शाखाओं पर परिवर्तनों और फ़ाइलों को याद न करें। यह मेरे जैसे भुलक्कड़ लोगों को बहुत दुःख से बचाएगा।
hobs

3
जैसा कि नीचे जवाब में कहा गया है, फ़ाइल को बहाल किया जाना चाहिए git checkout <SHA>^ -- <path-to-file>की वजह से <SHA> प्रतिबद्ध फ़ाइल हटा दी जाती है, हम पिछले पर देखने की जरूरत है नष्ट कर दिया फ़ाइल की सामग्री प्राप्त करने के लिए प्रतिबद्ध पल में (ध्यान दें ^ प्रतीक),
kipelovets

393

हटाई गई फ़ाइलों की एक सूची प्राप्त करें और हटाए गए फ़ाइल के पूर्ण पथ की प्रतिलिपि बनाएँ

git log --diff-filter=D --summary | grep delete

अगले कमांड को निष्पादित करने के लिए उस कमेटी की प्रतिबद्ध आईडी खोजने के लिए और कमिट आईडी को कॉपी करें

git log --all -- FILEPATH

हटाई गई फ़ाइल का विस्तार दिखाएं

git show COMMIT_ID -- FILE_PATH

याद रखें, आप किसी फ़ाइल का उपयोग करके आउटपुट लिख सकते >हैं

git show COMMIT_ID -- FILE_PATH > deleted.diff

1
हालाँकि मुझे पहले चरण की मदद से रास्ता मिला, दूसरा चरण इस त्रुटि को फेंकता है unknown revision or path not in the working tree:।
jvannistelrooy

6
हटाए जाने के साथ-साथ प्रतिबद्ध हैश को देखने के लिए, आप कर सकते हैंgit log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
क्रिस मिडलटन

1
चरण 2 कुछ भी नहीं देता है। किसी भी विचार क्यों ऐसा हो सकता है? मेरा फ़ाइल नाम सही है।
डेनिस नियाज़ेव

2
तीनों को एक फ़ंक्शन में मिलाने के लिए, इसे अपने .bashrc या .zshrc में जोड़ें: git-grep-latest(){ result_path=$(git log --diff-filter=D --summary | grep $1 | head -1 | awk '{print $4;}'); latest_commit=$(git log --all -- $result_path | head -1 | awk '{print $2;}'); git show $latest_commit -- $result_path; }और अब आप बस कर सकते हैं:git-grep-latest some_text
randomor

1
@TylerJones आप पाइप का उपयोग करके लिनक्स को कुछ भी खिला सकते हैं - Google linux pipes.. आप इसे पसंद करेंगे।
जॉन हंट

37

स्वीकृत उत्तर को संपादित नहीं किया जा सकता है, इसलिए इसे यहां एक उत्तर के रूप में जोड़ना,

फ़ाइल को git में पुनर्स्थापित करने के लिए, निम्नलिखित का उपयोग करें (SHA के बाद '^' चिह्न पर ध्यान दें)

git checkout <SHA>^ -- /path/to/file

मुझे समझ नहीं आ रहा है कि आप ^ क्यों चाहते हैं फ़ाइल उस SHA के साथ प्रतिबद्ध है ... आप वहां से दूसरी कमिट क्यों चलना चाहते हैं?
टोनी के।

19
यह उस शा के साथ "हटाए गए" के रूप में है, जिसका अर्थ है कि यह अभी भी मौजूद नहीं है। आपको इससे पहले कमिट में जाना होगा कि वास्तव में इसे वापस लेना है।
tandrewnichols 14

6
@tandrewnichols जिसका अर्थ है कि आप गलत कमिट SHA का उपयोग कर रहे हैं - आप जिस फ़ाइल को चाहते हैं , उसके संस्करण के लिए कमिट चाहते हैं ... जो शायद वह संस्करण नहीं है जहाँ फ़ाइल को हटा दिया गया है।
अंबर

6
@ और आपके द्वारा चाहा गया कमिटमेंट डिलीट होने से पहले सबसे हाल का होने की संभावना है, इसलिए यह उत्तर।
सैम होल्डर

1
@ एएक्सएलआर: <SHA>~1इसे उद्धरण चिह्नों के साथ लपेटने की आवश्यकता के बिना ही काम करना चाहिए।
कोडमेनएक्स

37

मान लीजिए कि आप नामक एक फ़ाइल को पुनर्प्राप्त करना चाहते MyFileहैं, लेकिन इसके पथ (या इसके विस्तार, उस मामले के लिए) से अनिश्चित हैं:

Prelim: git रूट पर जाने से भ्रम से बचें

एक nontrivial प्रोजेक्ट में समान या समान नामों के साथ कई निर्देशिकाएं हो सकती हैं।

> cd <project-root>
  1. पूरा रास्ता खोजें

    git log --diff-filter = D --summary | grep हटाना | grep MyFile

    delete mode 100644 full/path/to/MyFile.js

full/path/to/MyFile.js आपके द्वारा चाहा जा रहा पथ और फ़ाइल है।

  1. उस फ़ाइल को प्रभावित करने वाले सभी कमानों का निर्धारण करें

    git log --online --follow - full / path / to / MyFile.js

    bd8374c Some helpful commit message

    ba8d20e Another prior commit message affecting that file

    cfea812 The first message for a commit in which that file appeared.

  2. फ़ाइल की जाँच करें

यदि आप पहली-सूचीबद्ध प्रतिबद्ध (अंतिम कालानुक्रमिक, यहां bd8374c) चुनते हैं, तो फ़ाइल नहीं मिलेगी, क्योंकि यह उस कमिट में हटा दिया गया था।

> git checkout bd8374c -- full/path/to/MyFile.js

`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`

बस पूर्ववर्ती का चयन करें (एक कैरेट संलग्न करें)

> git checkout bd8374c^ -- full/path/to/MyFile.js

3
स्वीकृत उत्तर की तुलना में यह बहुत अधिक स्पष्ट है
पौयन खोडबख्श

विंडोज़ कंसोल (cmd) के लिए, चरण 2 में grep के बजाय git log --diff-filter=D --summary | find "delete" | find "MyFile"git checkout "bd8374c^" -- full/path/to/MyFile.js
फ़ाइंड का

30

@ एम्बर ने सही उत्तर दिया! बस एक और इसके अलावा, यदि आप फाइल का सही रास्ता नहीं जानते हैं तो आप वाइल्डकार्ड का उपयोग कर सकते हैं! इसने मेरे लिए काम किया।

git log --all -- **/thefile.*

4
@PedroMorteRolo हम्म। मुझे नहीं पता कि मैं किसी मौजूदा उत्तर को शीर्ष मतदान में कॉपी करने के बारे में कैसा महसूस करता हूं: / यह उत्तर अपने आप में भी उपयोगी था; एक उत्थान पर्याप्त हो सकता है?
क्लीमेंट

1
यदि यह प्रोजेक्ट रूट (Cygwin में परीक्षण किया गया है) में यह फ़ाइल नहीं मिली है।
वॉर्टवार्ट

19

नीचे एक सरल कमांड है, जहां एक देव या एक गिट उपयोगकर्ता रिपॉजिटरी रूट डायरेक्टरी से हटाए गए फ़ाइल नाम को पारित कर सकता है और इतिहास प्राप्त कर सकता है:

git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all -- 

यदि कोई है, तो कमांड में सुधार कर सकते हैं, कृपया करें।


1
बहुत अच्छे धन्यवाद! ऐसा लगता है कि मेरी फ़ाइल कभी भी अस्तित्व में नहीं थी, लेकिन यह एक अलग और बहुत अधिक बालों वाला मुद्दा है ...

सुनिश्चित करें कि आप इसे रिपॉजिटरी रूट डायरेक्टरी से चलाते हैं, अगर आपकी फाइल 'मिसिंग' लगती है
samaspin

धन्यवाद @samaspin ने उत्तर को अपडेट किया।
जेसन

18

दर्शकों में से किसी एक का उपयोग करने का प्रयास करें, जैसे gitkकि आप उस आधे याद की गई फ़ाइल को खोजने के लिए इतिहास के चारों ओर ब्राउज़ कर सकते हैं। ( gitk --allसभी शाखाओं के लिए उपयोग करें )


4
यह --allविकल्प आपके उत्तर और स्वीकृत उत्तर दोनों के लिए महत्वपूर्ण है।
हॉब्स

3
अधिकांश परियोजनाओं के लिए इतिहास के चारों ओर ब्राउज़ करने में असाधारण समय लगेगा।
मिकमेकाना

5

सारांश:

  1. चरण 1

आप डिलीट की गई फाइल्स की हिस्ट्री में अपना फाइल फुल पाथ सर्च करते हैं git log --diff-filter=D --summary | grep filename

  1. चरण 2

आप अपनी फ़ाइल को हटाने से पहले उसे फिर से चालू कर देते हैं

restore () {
  filepath="$@"
  last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
  echo "Restoring file from commit before $last_commit"
  git checkout $last_commit^ -- $filepath
}

restore my/file_path

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