"Git rm -r" को कैसे वापस करें?


378

मैंने गलती से कहा git rm -r .। मैं इससे कैसे उबरूं?

मैंने नहीं किया।

मुझे लगता है कि सभी फ़ाइलों को हटाने के लिए चिह्नित किया गया था और मेरे स्थानीय चेकआउट से भौतिक रूप से हटा दिया गया था।

संपादित करें: मैं (यदि मैं कमांड जानता था) अंतिम वचन पर वापस लौट सकता है। लेकिन यह बहुत अच्छा होगा अगर मैं सिर्फ पूर्ववत कर सकता हूं git rm -r .। क्योंकि मैं वास्तव में निश्चित नहीं हूं कि मैंने आखिरी प्रतिबद्ध के बाद और उससे पहले क्या किया git rm -r .


3
इस विशेष प्रश्न के लिए, रीसेट - हार्ड एक अच्छा समाधान है ... यह पहले से ही सूचीबद्ध है इसलिए मैं इस टिप्पणी में सिर्फ यह उल्लेख करूंगा कि आप git-reflog के लिए दस्तावेज़ की जांच करना चाहते हैं।
विलियम पर्ससेल

8
ध्यान दें कि क्योंकि आपने आपूर्ति -fकरने के लिए आपूर्ति नहीं की है, इसलिए git rmउन सभी फ़ाइलों को हटा दिया जाएगा जिन्होंने मंचित या अस्थिर परिवर्तन किए थे ताकि git reset; git checkout .सब कुछ ठीक हो जाए ।
सीबी बेली

बस बाहर देखो - गिट चेकआउट। सभी अस्थिर परिवर्तनों को मिटा देगा।
पीटरब

1
मैंने ऐसा ही कुछ किया है, और मुझे समझ में नहीं आ रहा है कि मेरी स्थानीय फाइलें क्यों हटाई
गईं

Git 2.23+ (अगस्त 2019) के साथ, आप के साथ फ़ाइलों को बहाल होगा git restore: git restore -s@ -SW -- .। देखें नीचे मेरा उत्तर
VonC

जवाबों:


468
git reset HEAD

करना चाहिए। यदि आपके पास कोई भी ऐसा परिवर्तन नहीं है, जिसकी आपको परवाह है, तो

git reset --hard HEAD

अपनी पिछली कमिटियों को जबरन सबकुछ रीसेट कर देना चाहिए। यदि आपके पास बिना परिवर्तन किए हुए बदलाव हैं, लेकिन पहला कमांड काम नहीं करता है, तो अपने अनक्मिटेड परिवर्तनों को इसके साथ सहेजें git stash:

git stash
git reset --hard HEAD
git stash pop

22
ध्यान दें कि git reset --hard HEADआपने वर्तमान कामकाजी निर्देशिका के मूल निर्देशिका में किए गए किसी भी उपयोगी परिवर्तन को नष्ट कर दिया है।
एलेक्स ब्राउन

10
@ बच्चों: मैं अभी भी एक ठंडा पसीना पहन रहा हूँ!
hoipolloi

6
मैंने वोट डाउन नहीं किया, लेकिन मैंने बस कोशिश की, कड़ी मेहनत, पॉप रीसेट करें और अपने सभी हाल के परिवर्तनों को खो दिया। शायद मैंने जवाब को गलत बताया।
ग्रेग एम। क्रास्क

1
यह शायद ही कभी मेरे लिए काम करता है, और मुझे खुशी है कि मैं ड्रॉपबॉक्स फ़ोल्डर में काम करता हूं। गरीब रूप, लेकिन मुझे हर बार बचाता है ...
नुबी

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

252

मैंने कुछ फ़ाइलों को git-rm किया और अपनी अगली प्रतिबद्धताओं से पहले जब मैंने महसूस किया कि मुझे उन फ़ाइलों में से कुछ की आवश्यकता है, तो परिवर्तन करने जा रहा हूं। यदि आप चाहते हैं, तो आप स्टैश और रीसेट के बजाय, आप केवल उन व्यक्तिगत फ़ाइलों को चेकआउट कर सकते हैं जिन्हें आपने मिस / रिमूव किया था:

git checkout HEAD path/to/file path/to/another_file

यह बिना किसी वर्कअराउंड के आपके अनचाहे परिवर्तनों को बरकरार रखता है।


6
इससे मुझे मदद मिली क्योंकि मेरे पास अन्य अन-कम किए गए परिवर्तन थे।
डैन

4
यह उत्तर हम में से उन लोगों के लिए मदद करता है जो इस सवाल पर ठोकर खाए हुए हैं git rm, जो एक पूरे पुनरावर्ती के बजाय एक भी वापस लौट रहे हैं git rm -r। पूर्ण पुनरावर्ती हटाने के लिए, अन्य समाधान बेहतर हो सकते हैं, जो हटाए गए फ़ाइलों की मात्रा पर निर्भर करते हैं।
tresf

आप, मेरे आदमी, एक पुरस्कार के पात्र हैं।
सलामत

अगर मैं कर सकता था तो मैं इसे 100 तक क्लिक करता था !!!
वैगनर ब्रागा

57

कुछ एकल फ़ाइलों या फ़ोल्डरों को पुनः प्राप्त करने के लिए निम्नलिखित का उपयोग कर सकते हैं

git reset -- path/to/file
git checkout -- path/to/file

यह पहली बार इंडेक्स प्रविष्टियों को फिर से बनाएगा path/to/fileऔर फ़ाइल को फिर से बनाएगा क्योंकि यह अंतिम प्रतिबद्ध में था HEAD

संकेत: एक पुराने आदेश से फ़ाइलों को फिर से बनाने के लिए दोनों आदेशों के लिए एक प्रतिबद्ध हैश पारित कर सकता है। देखें git reset --helpऔर git checkout --helpविवरण के लिए।


सबसे बढ़िया उत्तर। एक भी git rmऑपरेशन के आसान सर्जिकल 'पूर्ववत्' अन्य अप्रभावित परिवर्तनों को मिटाए बिना।
२०:०६ बजे जूल '’

मेरी मदद की! सबसे बढ़िया उत्तर।
अकरम

28

अपडेट करें:

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

git reset HEAD . # This undoes the index changes
git checkout .   # This checks out files in this and child directories from the HEAD

यह वही करना चाहिए जो आप चाहते हैं। यह आपके चेक-आउट कोड या इंडेक्स के मूल फ़ोल्डर को प्रभावित नहीं करता है।


पुराना उत्तर जो नहीं था:

reset HEAD

चाल करेंगे , और आपकी फ़ाइलों में आपके द्वारा किए गए किसी भी अपरिवर्तित परिवर्तन को नहीं मिटाएंगे

उसके बाद आपको कोई भी दोहराने की आवश्यकता है git add आपको अपने द्वारा पंक्तिबद्ध किए गए आदेश ।


1
क्षमा करें, मैं हमेशा सेटअप करता हूं git alias.co="checkout"ताकि git coचेकआउट हो।
एलेक्स ब्राउन

25

यदि आप उपरोक्त में से कोई भी काम नहीं करते हैं, तो आप यहाँ से सुझाव का उपयोग करके डेटा पुनः प्राप्त करने में सक्षम हो सकते हैं: http://www.spinics.net/lists/git/msg62499.html

git prune -n
git cat-file -p <blob #>

4 साल बाद, अभी भी एक जीवनसाथी!
थिसिससिक्स

मैंने परिणामों को संक्षिप्त करने के लिए एक सी ++ प्रोग्राम लिखा था (मेरे रेपो में कुछ 100 ऑब्जेक्ट झूल रहे थे, जिससे यह आवश्यक हो गया)। बस संकलित करें और चलाएं, फिर अपने गिट रेपो स्थानीय निर्देशिका में पास करें। raw.githubusercontent.com/bluuman/git-recover-files/master/…
जेम्स

14

पूर्ववत git rm

git rm file             # delete file & update index
git checkout HEAD file  # restore file & index from HEAD

पूर्ववत gm rm -r

git rm -r dir          # delete tracked files in dir & update index
git checkout HEAD dir  # restore file & index from HEAD

पूर्ववत gm rm -rf

git rm -r dir          # delete tracked files & delete uncommitted changes
not possible           # `uncommitted changes` can not be restored.

Uncommitted changesशामिल not staged changes, staged changes but not committed


बेशक, कुछ भी पूर्ववत् नहीं हो सकता है git rm -rf, क्योंकि इससे अनट्रैक या स्टेज्ड (केवल) फाइलें भी डिलीट हो सकती हैं।
jpaugh

git rm -rf fileऔर git rm -rf dirकिसी भी फ़ाइल को नष्ट नहीं करेगा।
गीत xu

10

यदि आपने परिवर्तन किए हैं और परिवर्तनों को आगे बढ़ाया है, तो आप फ़ाइल को वापस लाने के लिए ऐसा कर सकते हैं

// Replace 2 with the # of commits back before the file was deleted.
git checkout HEAD~2 path/to/file

इसने 'परिवर्तन किए जाने के लिए कार्य किया:' जहां एक फाइल को पुराने git चेरी-पिक से हटा दिया गया था, जिसकी मुझे अभी भी आवश्यकता थी। मैंने git रीसेट की कोशिश की है HEAD ~ <नंबर> <फ़ाइल> जो काम नहीं किया।
मशरूम

7

कुछ अच्छे उत्तर पहले से ही हैं, लेकिन मैं थोड़ा-सा वाक्यविन्यास सुझा सकता हूं जो न केवल बहुत अच्छा काम करता है, बल्कि आप जो चाहते हैं उसमें बहुत स्पष्ट है (इसके लिए डरावना या रहस्यमय नहीं है)

git checkout <branch>@{"20 minutes ago"} <filename>

3

सूची तैयार करवाएं

git log  --oneline

उदाहरण के लिए, स्थिर प्रतिबद्ध हैश: 45ff319c360cd7bd5442c0fbbe14202d20ccdf81

git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git push -ff origin master

1

मेरी भी ऐसी ही स्थिति थी। मेरे मामले में समाधान था:

git checkout -- .

0

Git 2.23+ (अगस्त 2019) के साथ, फ़ाइलों (और सूचकांक) को पुनर्स्थापित करने के लिए उचित कमांड का उपयोग करना होगा ... git restore(नहीं reset --hardया भ्रमित git checkoutकमांड )

अर्थात्:

git restore -s=HEAD --staged --worktree -- .

या इसका संक्षिप्त रूप:

git restore -s@ -SW -- .

-1

मेरे पास एक ही मुद्दा था: मेरे फ़ोल्डर को साफ करना, फ़ाइलों को फिर से व्यवस्थित करना और चलाना। मैंने प्रवेश किया: git rm और हिट दर्ज करें; और फिर महसूस किया कि मेरी आंतें थोड़ी ढीली हैं। सौभाग्य से, मैं git कमिट में नहीं लिख रहा हूँ -m "" सीधा।

हालाँकि, निम्न आदेश

git checkout .

सब कुछ बहाल कर दिया, और मेरी जान बचाई।

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