गिट में हटाई गई फ़ाइल को अनस्टेज करें


504

आमतौर पर, एक फ़ाइल में परिवर्तन करने के लिए आप क्या करेंगे:

git checkout -- <file>

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

error: pathspec '<file>' did not match any file(s) known to git.

अन्य परिवर्तनों को पूर्ववत किए बिना उस एकल फ़ाइल को कौन सी कमांड पुनर्स्थापित करेगी?

बोनस बिंदु: इसके अलावा, क्या होगा अगर मैं जिस बदलाव को छोड़ना चाहता हूं वह एक फाइल जोड़ रहा है? मैं यह जानना चाहूंगा कि उस परिवर्तन को कैसे किया जाए।


1
परिवर्तन और अस्थिर करना दो अलग-अलग चीजें हैं, जो आप करने की कोशिश कर रहे हैं?
एंड्रयू मार्शल

1
यह एक पोस्ट में दो अलग-अलग प्रश्न और समस्याएं हैं। यह उत्तरों को बहुत अधिक और अनावश्यक रूप से भ्रमित करता है।
डेविड सोपको

जवाबों:


778

यह मानते हुए कि आप इसके समान git rm <file>या rm <file>इसके बाद के प्रभावों को पूर्ववत करना चाहते हैं git add -A:

# this restores the file status in the index
git reset -- <file>
# then check out a copy from the index
git checkout -- <file>

पूर्ववत करने के लिए git add <file>, ऊपर की पहली पंक्ति यह मानती है कि आपने अभी तक प्रतिबद्ध नहीं किया है।


69
--कुंजी है। git reset <file>काम नहीं करता है, जो मुझे यहाँ लाया है।

लेकिन यह सभी संशोधनों को भी बहाल करेगा। क्या करना है अगर मैं सभी हटाए गए फ़ाइलों को पुनर्स्थापित करना चाहता हूं। और सभी संशोधनों को अछूता रखें।
डेनिअस क्रेविस

2
end-of-options-markerहटाए गए फ़ाइल मामले में ही क्यों आवश्यक है?
haridsv

4
@handsv इसकी कड़ाई से आवश्यकता नहीं है (आप वैकल्पिक रूप से कर सकते हैं git reset HEAD <file>, जो समकक्ष है), लेकिन एक फ़ाइल नाम नहीं, बल्कि रेफरी नाम के रूप में git resetइसके पहले तर्क का व्यवहार करता है end-of-options-marker। क्या इसे थोड़ा और लचीले ढंग से लिखा जा सकता है? शायद। क्यों नहीं था? शायद केवल डेवलपर्स सुनिश्चित करने के लिए जानते हैं।
ट्वालबर्ग नोव

2
@twalberg git reset filenameगैर-हटाई गई फ़ाइलों के लिए ठीक काम करता है।
ब्रायन गॉर्डन

56

दोनों प्रश्नों के उत्तर दिए गए हैं git status

एक नई फ़ाइल के उपयोग को जोड़ने के लिए अस्थिर करना git rm --cached filename.ext

# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   test

फ़ाइल का उपयोग हटाने के लिए अस्थिर करना git reset HEAD filename.ext

# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    test

दूसरे हाथ में, git checkout --कभी भी अस्थिर नहीं होता है, यह सिर्फ गैर-चरणबद्ध परिवर्तनों को छोड़ देता है।


5
मैं डेबियन पर 1.7.2.5 git में हटाए गए फ़ाइल के लिए संकेत नहीं देखता।
ट्रिपल

git statusउद्धृत देखकर अच्छा लगा ; उपयोगकर्ताओं को अब और अगली बार स्वयं-सहायता करने का एक तरीका दिखाता है, और भविष्य के गिट संस्करणों में मामले की जानकारी जोड़ी या अपडेट की जाती है।
विल

ये गलत है। "परिवर्तन के लिए प्रतिबद्ध होने के लिए" तुम क्या देखते है पहलेgit resetबादgit reset , आप "बदल दिया लेकिन अद्यतन नहीं" देखें जो साधन "परिवर्तन का मंचन नहीं" Git लेखकों के मूल भाषा में, जाहिरा तौर पर। इससे भी महत्वपूर्ण बात, "स्थिति के बारे में पूरी हठधर्मिता आपको वह सब कुछ बताती है जो आप जानते हैं" एक झूठ है। (प्रबंधक जो कहते हैं कि लोगों का समय बर्बाद कर रहे हैं और उन्हें निकाल दिया जाना चाहिए।)
personal_cloud

11

आपके दो सवालों के जवाब संबंधित हैं। मैं दूसरे के साथ शुरू करूँगा:

एक बार जब आप एक फ़ाइल (अक्सर साथ git add, हालांकि कुछ अन्य आदेशों के रूप में अच्छी तरह से परिवर्तन मंच git rm), आप इस परिवर्तन के साथ वापस कर सकते हैं git reset -- <file>

आपके मामले में आपने git rmफ़ाइल को निकालने के लिए उपयोग किया होगा , जो कि बस इसे हटाने rmऔर फिर उस परिवर्तन का मंचन करने के बराबर है । यदि आप पहले इसे अपने साथ अनस्टेज कर git reset -- <file>लेते हैं, तो इसके साथ रिकवर कर सकते हैं git checkout -- <file>


7

यदि इसे मंचन और प्रतिबद्ध किया गया है, तो निम्नलिखित फ़ाइल को रीसेट करेगा:

git reset COMMIT_HASH file_path
git checkout COMMIT_HASH file_path
git add file_path

यह एक विलोपन के लिए काम करेगा जो पिछले कई हिट हुए थे।


1
यह अधिक कुशल हैgit revert COMMIT_HASH
फ्लेयर

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