फ़ाइल को पुराने कमिट से git में पुनर्स्थापित करें


188

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


जवाबों:


218
git checkout 'master@{7 days ago}' -- path/to/file.txt

यह HEAD में परिवर्तन नहीं करेगा, यह सिर्फ स्थानीय फ़ाइल को अधिलेखित करेगा path/to/file.txt

वहाँ संभव संशोधन विनिर्देशों के लिए आदमी git-Rev-parse देखें (बेशक एक साधारण हैश (जैसे dd9bacb) अच्छी तरह से करेंगे)

परिवर्तन (समीक्षा के बाद ...) करना न भूलें


15
वाह, @heneryville और sehe, मैंने वास्तव में सोचा था कि '7 दिन पहले' मेटा आपके लिए यह पता लगाएगा कि क्या प्रतिबद्ध था। Ty!
ऐनीइगाइल

7
भाग 2 जब किसी विशेष प्रतिबद्ध को चुनने की इच्छा होती है, तो उपरोक्त प्रारूप काम नहीं करता है। बजाय इसके कि उर्स ने नीचे क्या दिखाया है, इसके बजाय git checkout प्रतिबद्धशाम्बर - path / to / file.txt प्रति stackoverflow.com/questions/215718/…
AnneTheAgile

2
@AnneTheAgile वास्तव में अभी भी एक ही वाक्यविन्यास है, मैं सिर्फ एक "जटिल" उदाहरण देने के लिए हुआ था, revision-specificationजो कि ओपी ने पूछा था कि क्या है
20

1
यदि आपकी कमिट का उपयोग उस फ़ाइल को हटाने के लिए किया गया था जिसे आप पुनर्प्राप्त करने का प्रयास कर रहे हैं, तो तुरंत shacommit~1(पूर्व:) का उपयोग करें git checkout 0f4bbdcd~1 -- path/to/file.txtताकि आप तुरंत कमिट कर सकें।
sdlins

89
  1. अपने पुराने कमिट से फाइल को देखें git checkout [Revision_Key] -- path/to/file
  2. जोड़ें, प्रतिबद्ध, के रूप में उपयुक्त धक्का।

3
git checkoutएकल फ़ाइलों को संभाल सकते हैं (देखें उत्तर द्वारा देखें), कॉपी और पेस्ट करने की आवश्यकता नहीं है।
कोरकटोर

1
क्या संशोधन कीज़ हमेशा कमिटमेंट के लिए SHA1 हैं?
द्वीपकोप

1
वे हैं, लेकिन आमतौर पर SHA1 के पहले 6 से 8 अक्षर संशोधन की पहचान करने के लिए पर्याप्त हैं।
उर्स रिपुके

2
@IslandCow नहीं, वे शा 1 हो सकते हैं, लेकिन शाखा, टैग, या कोई अन्य चीज़ जो किसी कमिटमेंट, उदाहरण HEADके लिए ORIG_HEAD, या किसी भी ^/ ~/ @-स्टाइल संकेतन के साथ संयुक्त अंक की ओर इशारा करती है।
एलोइस महदाल

2
आप इंगित करते हैं कि एक बाद में फ़ाइल को "जोड़ना" है। लेकिन वह गलत है। फ़ाइल को स्टेजिंग क्षेत्र में नहीं रखा गया है। यह पहले से ही जोड़ा गया है।
xApple

8

मुझे एक हालिया फ़ाइल को git में प्रतिबद्ध करने की आवश्यकता है। तो बस फिर से दोहराने और एक और परिप्रेक्ष्य देने के लिए, आपको निम्न दो चरण चलाकर ऐसा करने की आवश्यकता है:

  1. git log -3
    यह तीन सबसे हाल के हिट दिखाता है। टिप्पणियों और लेखक का नाम पढ़ें ताकि आप जो सटीक संस्करण चाहते हैं उसे संकीर्ण कर दें। उस लंबे संस्करण को लिखें (यानी b6b94f2c19c456336d60b9409fb1e373036d3d71) जिस इच्छित संस्करण के लिए आप चाहते हैं।

  2. git चेकआउट b6b94f2c19c456336d60b9409fb1e373036d3d71 - myfile.java
    कमिट आईडी और वह फ़ाइल नाम जिसे आप पुनर्स्थापित करना चाहते हैं पास करें। सुनिश्चित करें कि आपके पास डबल हाइफ़न से पहले और बाद में एक जगह है।

इसे करने के कई अन्य तरीके हैं। लेकिन यह एक सरल है जिसे मैं याद रख सकता हूं। उम्मीद है की वो मदद करदे।

नोट: यदि आप अपने प्रोजेक्ट पथ / फ़ोल्डर के अंदर हैं, तो चेकआउट कमांड में पूर्ण फ़ाइल का पथ टाइप करना आवश्यक नहीं है।


अब तक की सर्वश्रेष्ठ टिप्पणी क्योंकि एक, जो स्वीकृत उत्तर है, मान लेता है कि जिस फाइल को लाना है उसे ऊपर की ओर धकेल दिया जाता है, हालांकि यह कमांड उस फाइल को प्राप्त / पुनर्स्थापित करता है जो केवल स्थानीय रूप से मौजूद है।
ot0

1
बस अपने स्थानीय गिट रेपो के रूट फ़ोल्डर में यह कोशिश की। मुझे अभी भी फ़ाइल के सापेक्ष पथ प्रदान करने की आवश्यकता है। बस - [फ़ाइल नाम] प्रदान करने पर यह अपने आप में कारगर नहीं रहा।
user2784627

@ ot0 नहीं, ऐसा नहीं माना जाता है। वे एक ही जवाब हैं।
मैट

4

सभी उत्तर का उल्लेख है git checkout <tree-ish> -- <pathspec>। Git v2.23.0 के रूप में एक नई git पुनर्स्थापना विधि है, जो उस भाग को मानने वाली है जो git checkoutइसके लिए जिम्मेदार था। जीथब ब्लॉग पर परिवर्तनों के मुख्य अंश देखें ।

इस कमांड का डिफ़ॉल्ट व्यवहार एक कार्यशील पेड़ की स्थिति को sourceपैरामीटर से आने वाली सामग्री को पुनर्स्थापित करना है (जो आपके मामले में एक प्रतिबद्ध हैश होगा)।

यह मानते हुए कि कमिट हैश है abcdefकि कमांड इस तरह दिखाई देगी:

git restore --source=abcdef file_name

जो (डिफ़ॉल्ट रूप से) इसे कार्यशील पेड़ में डालता है। यदि आप बदलाव को सीधे सूचकांक में रखना चाहते हैं, तो इसे सीधे प्रतिबद्ध किया जा सकता है:

git restore --source=abcdef --worktree --staged file_name

या छोटे विकल्प नामों के साथ:

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