एक बार मेरे प्रोजेक्ट में एक फाइल आई, जिसे अब मैं प्राप्त करना चाहूंगा।
समस्या यह है: मुझे पता नहीं है कि मैंने इसे कब हटाया है और यह किस मार्ग पर है।
जब यह मौजूद है तो मैं इस फ़ाइल के कमिट का पता कैसे लगा सकता हूँ?
एक बार मेरे प्रोजेक्ट में एक फाइल आई, जिसे अब मैं प्राप्त करना चाहूंगा।
समस्या यह है: मुझे पता नहीं है कि मैंने इसे कब हटाया है और यह किस मार्ग पर है।
जब यह मौजूद है तो मैं इस फ़ाइल के कमिट का पता कैसे लगा सकता हूँ?
जवाबों:
अगर आपको सही रास्ते का पता नहीं है तो आप इसका इस्तेमाल कर सकते हैं
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>
फाइल के नष्ट होने की स्थिति में, हमें हटाए गए फ़ाइल की सामग्री को प्राप्त करने के लिए पिछली प्रतिबद्धताओं को देखना होगा।
git log -- <path>
का कोई आउटपुट नहीं होगा जब आप उस शाखा पर हों जिसमें फ़ाइल कभी मौजूद नहीं थी। आपको हमेशा git log --all -- <path>
यह सुनिश्चित करने के लिए उपयोग करना चाहिए कि आप अन्य शाखाओं पर हुए परिवर्तनों को याद नहीं करते हैं। git log -- <path>
यदि आप एक से अधिक शाखाएँ रखते हैं और पथ और शाखाओं (मेरे जैसे) को भूल जाते हैं, तो यह आदेश बहुत खतरनाक हो सकता है और यदि आप अन्य डेवलपर्स के साथ काम करते हैं तो यह भी खतरनाक है।
git checkout <SHA>^ -- <path-to-file>
की वजह से <SHA> प्रतिबद्ध फ़ाइल हटा दी जाती है, हम पिछले पर देखने की जरूरत है नष्ट कर दिया फ़ाइल की सामग्री प्राप्त करने के लिए प्रतिबद्ध पल में (ध्यान दें ^ प्रतीक),
हटाई गई फ़ाइलों की एक सूची प्राप्त करें और हटाए गए फ़ाइल के पूर्ण पथ की प्रतिलिपि बनाएँ
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
unknown revision or path not in the working tree
:।
git log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
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
linux pipes
.. आप इसे पसंद करेंगे।
स्वीकृत उत्तर को संपादित नहीं किया जा सकता है, इसलिए इसे यहां एक उत्तर के रूप में जोड़ना,
फ़ाइल को git में पुनर्स्थापित करने के लिए, निम्नलिखित का उपयोग करें (SHA के बाद '^' चिह्न पर ध्यान दें)
git checkout <SHA>^ -- /path/to/file
<SHA>~1
इसे उद्धरण चिह्नों के साथ लपेटने की आवश्यकता के बिना ही काम करना चाहिए।
मान लीजिए कि आप नामक एक फ़ाइल को पुनर्प्राप्त करना चाहते MyFile
हैं, लेकिन इसके पथ (या इसके विस्तार, उस मामले के लिए) से अनिश्चित हैं:
Prelim: git रूट पर जाने से भ्रम से बचें
एक nontrivial प्रोजेक्ट में समान या समान नामों के साथ कई निर्देशिकाएं हो सकती हैं।
> cd <project-root>
पूरा रास्ता खोजें
git log --diff-filter = D --summary | grep हटाना | grep MyFile
delete mode 100644 full/path/to/MyFile.js
full/path/to/MyFile.js
आपके द्वारा चाहा जा रहा पथ और फ़ाइल है।
उस फ़ाइल को प्रभावित करने वाले सभी कमानों का निर्धारण करें
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.
फ़ाइल की जाँच करें
यदि आप पहली-सूचीबद्ध प्रतिबद्ध (अंतिम कालानुक्रमिक, यहां 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
git log --diff-filter=D --summary | find "delete" | find "MyFile"
git checkout "bd8374c^" -- full/path/to/MyFile.js
@ एम्बर ने सही उत्तर दिया! बस एक और इसके अलावा, यदि आप फाइल का सही रास्ता नहीं जानते हैं तो आप वाइल्डकार्ड का उपयोग कर सकते हैं! इसने मेरे लिए काम किया।
git log --all -- **/thefile.*
नीचे एक सरल कमांड है, जहां एक देव या एक गिट उपयोगकर्ता रिपॉजिटरी रूट डायरेक्टरी से हटाए गए फ़ाइल नाम को पारित कर सकता है और इतिहास प्राप्त कर सकता है:
git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all --
यदि कोई है, तो कमांड में सुधार कर सकते हैं, कृपया करें।
दर्शकों में से किसी एक का उपयोग करने का प्रयास करें, जैसे gitk
कि आप उस आधे याद की गई फ़ाइल को खोजने के लिए इतिहास के चारों ओर ब्राउज़ कर सकते हैं। ( gitk --all
सभी शाखाओं के लिए उपयोग करें )
--all
विकल्प आपके उत्तर और स्वीकृत उत्तर दोनों के लिए महत्वपूर्ण है।
सारांश:
आप डिलीट की गई फाइल्स की हिस्ट्री में अपना फाइल फुल पाथ सर्च करते हैं git log --diff-filter=D --summary | grep filename
आप अपनी फ़ाइल को हटाने से पहले उसे फिर से चालू कर देते हैं
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
यहाँ मेरा समाधान है:
git log --all --full-history --oneline -- <RELATIVE_FILE_PATH>
git checkout <COMMIT_SHA>^ -- <RELATIVE_FILE_PATH>