Git में हटाए गए फ़ाइल को देखना


104

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

जवाबों:


144
git show HEAD^:path/to/file

आप एक स्पष्ट प्रतिबद्ध पहचानकर्ता का उपयोग कर सकते हैं या HEAD~nपुराने संस्करणों को देख सकते हैं या यदि आपने इसे हटा दिया है तो एक से अधिक प्रतिबद्ध हैं।


6
ध्यान दें कि path/to/fileपरियोजना के शीर्ष (रिपॉजिटरी के शीर्ष डायर) से पूर्ण पथ है।
जकुब नारबस्की

1
मुझे मिल गया है fatal: Invalid object name 'HEAD^'.(मुझे उल्लेख करना होगा, कि मेरे पास केवल "प्रारंभिक प्रतिबद्ध" है)
vladkras

1
यदि विलोपन का मंचन किया गया है, लेकिन प्रतिबद्ध नहीं है, तो HEAD ^ के बजाय HEAD का उपयोग करें (क्योंकि यह HEAD में मौजूद है)। उदाहरण के लिए, मुझे लगा कि मुझे फ़ाइल की आवश्यकता है, इसलिए मैंने इसे जोड़ा और अपने काम को बचाने के लिए प्रतिबद्ध किया, फिर बाद में इसे हटा दिया जब मैं एक अलग समाधान के साथ आया। फिर से करने से पहले मूल फ़ाइल देखने के लिए, मैंने git शो HEAD: path / to / file
टोनी विकम

1
मुझे लगता है कि यह भी ध्यान देने योग्य है कि यह केवल तभी काम करता है जब फ़ाइल को हाल ही में कमिट किया गया हो। यदि फ़ाइल कई बार पहले हटा दी गई थी, तो आपको अन्य उत्तरों में से एक का उपयोग करने की आवश्यकता होगी।
22 अक्टूबर को jayhendren

50

यदि यह एक ऐसी फ़ाइल है जिसे आपने कुछ समय पहले हटा दिया है और संशोधन के लिए शिकार नहीं करना चाहते हैं , तो आप उपयोग कर सकते हैं (फ़ाइल fooइस उदाहरण में है; आप एक पूर्ण पथ का उपयोग कर सकते हैं):

git show $(git rev-list --max-count=1 --all -- foo)^:foo

rev-listके सभी संशोधन के लिए मंगलाचरण दिखता है foo, लेकिन केवल सूचियों एक। चूँकि rev-listरिवर्स कालानुक्रमिक क्रम में सूचियाँ होती हैं, तो यह जो सूची है वह अंतिम संशोधन है जो परिवर्तित हो गई है foo, जो कि हटाए गए वचन होंगे foo। (यह धारणा है कि Git एक हटाई गई फ़ाइल को बदलने की और अभी तक अनुमति नहीं देता है पर आधारित है रहते हैं नष्ट कर दिया।) आप सिर्फ इतना है कि संशोधन उपयोग नहीं कर सकते rev-listरिटर्न के रूप में- क्योंकि fooअब कोई वहां मौजूद। आप जो फ़ाइल का अंतिम संशोधन, इसलिए होता है बस इसे पहले एक के लिए पूछने के लिए ^में git show


2
आपको अंतिम फू को / .foo में बदलने की आवश्यकता हो सकती है। और उनके लिए bash का उपयोग नहीं करने के लिए, "git rev-list --max-count = 1 --all - foo" के साथ आईडी प्राप्त करें और फिर "git show 5824127a8d99576632a04ac2b5b2344bcf751967 :/ foo" आईडी के साथ करें (524 ..)। आईडी)
ड्रोर

1
अच्छा उत्तर। मुझे ^ के बजाय ~ का उपयोग करना था। यकीन नहीं है कि क्यों। और बस लोगों को इस पर स्पष्ट है, यहाँ 'फू' जीआईटी रूट से एक पूर्ण पथ होना चाहिए।
19

**/fooयदि आप पथ नहीं जानते हैं, तो आप लिख सकते हैं (यह रिवाइस-लिस्ट कमांड के लिए काम करेगा, लेकिन शो कमांड नहीं। हालाँकि रि-लिस्ट कमांड से कमिटमेंट के बाद आप पा सकते हैं)।
निकोलई

10

चूँकि आप सटीक पथ को याद नहीं कर सकते हैं, आप इसके बजाय git लॉग से sha1 प्राप्त कर सकते हैं तो आप बस जारी कर सकते हैं

 git cat-file -p <sha1>

5
सैमुअल स्लंड की ओर से : ऊपर उपयोग करने के लिए sha1 योग को खोजने का एक तरीका है: git whatchanged --no-abbrevजो git (या svn) लॉग के समान आउटपुट देता है।
आर्टलेस शोर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.