सामग्री को हटाने के बिना बड़ी संख्या में फ़ाइलों को कैसे अनस्टेज करें


454

मैंने गलती से बहुत सारी अस्थायी फ़ाइलों का उपयोग किया है git add -A

मैंने निम्न आदेशों का उपयोग करके फ़ाइलों को अस्थिर करने में कामयाब रहा और गंदे सूचकांक को हटाने में कामयाब रहा।

git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

उपरोक्त कमांड में सूचीबद्ध हैं git help rm। लेकिन दुख की बात है कि मेरी फ़ाइलों को भी निष्पादन पर हटा दिया गया था, हालांकि मैंने कैश विकल्प दिया था। मैं सामग्री को खोए बिना सूचकांक को कैसे साफ कर सकता हूं?

साथ ही यह मददगार होगा अगर कोई इस पाइप के काम करने के तरीके को समझा सके।


8
rm -fएक git कमांड नहीं है और इसका कोई --cachedविकल्प नहीं है । आपके द्वारा निष्पादित किए जाने से पहले आपकी स्थानीय फ़ाइलें हटा दी गई थीं, git rmइसलिए मुझे नहीं लगता कि आप किसी git rmभी चीज़ के लिए कानूनी रूप से दोषी ठहरा सकते हैं ।
सीबी बेली

8
@sarat, से अत्यधिक upvoted जवाब देने के लिए सही जवाब बदलने पर विचार करें इयान मैडॉक्स , के रूप में git reset --hardहै सही जवाब नहीं और वास्तव में सामग्री हट जाएगी। यह उपयोगकर्ताओं को भ्रमित करेगा - जैसा कि मैंने किया।
मार्को पशकोव

2
@ मार्त कहते हैं कि मार्को कहते हैं, चलो। इस पेज पर बहुत अधिक ट्रैफ़िक मिलता है।
रॉस

@MarcoPashkov और रॉस धन्यवाद दोस्तों। किया हुआ।
सरट

जवाबों:


986

git reset

यदि आप चाहते हैं कि एक अति उत्साही "गिट ऐड" रन को पूर्ववत करना है:

git reset

आपके परिवर्तन अस्थिर हो जाएंगे और आपके लिए कृपया फिर से जोड़ने के लिए तैयार होंगे।


भागो मत git reset --hard

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


15
मैं तुम्हें एक पिंट इयान देना चाहता हूँ
दासबूटन

1
मैं अक्सर मैं प्रदर्शन करने के लिए है लगता है git checkout -- *के रूप में अच्छी तरह से
Den-जेसन

1
आपने बहुत प्रयास किया। धन्यवाद आदमी
रजनीकांत

35

यदि आपके पास एक प्राचीन रेपो है (या HEAD सेट नहीं है) [1] आप बस कर सकते हैं

rm .git/index

बेशक, इस फाइल को फिर से जोड़ने के लिए की आवश्यकता होगी कि आप था जोड़ा जा करना चाहते हैं।


[१] नोट (जैसा कि टिप्पणियों में बताया गया है) यह आमतौर पर केवल तब होता है जब रेपो एकदम नया ("प्राचीन") होता है या यदि कोई कमिट नहीं किया गया है। अधिक तकनीकी रूप से, जब भी कोई चेकआउट या वर्क-ट्री नहीं होता है।

बस इसे और अधिक स्पष्ट बनाना :)


हाँ, यह स्वयं निर्मित सूचकांक को हटाने की तरह है। अच्छी बात यह है कि, मुझे गिट को फिर से शुरू करने की आवश्यकता नहीं है। धन्यवाद!
सैराट

क्या यह सुनिश्चित है कि यह एक सुरक्षित ऑपरेशन है? मैंने अभी यह किया (वास्तव में सूचकांक को बाहर ले जाया गया) और हटाए जाने के लिए अन्य सभी फ़ाइलों का मंचन किया।
8

@ अदरक "यदि आपके पास प्रिस्टिन रेपो है"। आपके पास स्पष्ट रूप से ऐसा नहीं था।
सेह

वास्तव में, मैं सोच रहा था कि आप "प्राचीन रेपो" (मैं या तो गूगल के साथ भाग्यशाली महसूस नहीं करता हूं) का क्या मतलब था .. तो आपका मतलब वास्तव में एक खाली रेपो था?
अंतर्ग्रहण

1
@िंगर सहमत। मुझे यह मानना ​​पड़ा कि ओपी के पास यह सटीक स्थिति थी - वह इसे निर्दिष्ट नहीं करता है, लेकिन उसका विवरण संभावना को छोड़ देता है। वैसे भी, मैं सिर्फ जानकारी साझा कर रहा हूँ, और मतदान प्रभावित नहीं कर सकते :( का जवाब पाठ करने के लिए चेतावनी का एक शब्द भी कहा, मामले में भविष्य में दूसरों मदद करता
sehe

15

git reset HEADफ़ाइलों को हटाए बिना अनुक्रमणिका को रीसेट करने के लिए उपयोग करें । (यदि आप केवल किसी विशेष फ़ाइल को इंडेक्स में रीसेट करना चाहते हैं, तो आप ऐसा करने के git reset HEAD -- /path/to/fileलिए उपयोग कर सकते हैं ।)

पाइप ऑपरेटर, एक शेल में, stdoutबाईं ओर प्रक्रिया लेता है और stdinदाईं ओर प्रक्रिया के रूप में इसे पास करता है । यह अनिवार्य रूप से बराबर है:

$ proc1 > proc1.out
$ proc2 < proc1.out
$ rm proc1.out

लेकिन इसके बजाय $ proc1 | proc2, दूसरी प्रक्रिया डेटा प्राप्त करना शुरू कर सकती है इससे पहले कि इसे आउटपुट किया जाए, और इसमें कोई वास्तविक फ़ाइल शामिल न हो।


लेकिन कई फ़ाइलों के साथ इसका उपयोग कैसे करें। मैंने पहले कभी इन फाइलों को कमिट नहीं किया है।
शरत्

3
बस git reset HEADकिसी और चीज को निर्दिष्ट किए बिना टाइप करें , और यह पूरे सूचकांक को रीसेट कर देगा। फिर आप केवल अपनी इच्छित फ़ाइलों को फिर से जोड़ सकते हैं।
एम्बर

मुझे निम्नलिखित त्रुटि मिली। मैंने इन वस्तुओं को पहले कभी नहीं किया। $ git reset HEAD fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree. Use '--' to separate paths from revisions
शरत्

1
इसके git resetबाद, बिना कोशिश करें HEAD
अंबर

मैंने पहले ही प्रयास किया कि मैं निम्नलिखित त्रुटि में समाप्त हो जाऊं। $ git reset fatal: Failed to resolve 'HEAD' as a valid ref.
सरत

9
git stash && git stash pop

2
मैं would git stash && git stash pop ’करूंगा ताकि स्टैश भी डिलीट हो जाए। 'अप्लाई' स्टाॅक लिस्ट में स्लैश छोड़ देगा।
चिट्टी

8

यदि HEAD सेट नहीं है (यानी, आपके पास अभी तक कोई कमिट नहीं है, लेकिन आप केवल उड़ाना नहीं चाहते हैं .gitक्योंकि आप पहले से ही अन्य रेपो कॉन्फिग सेट कर चुके हैं जिसे आप रखना चाहते हैं), आप भी कर सकते हैं

git rm -rf --cached .

सब कुछ अस्थिर करने के लिए। यह प्रभावी रूप से सेह के घोल के समान है, लेकिन गिट इंटर्ल्स के साथ मिलिंग से बचा जाता है।


यह वास्तव में कैश को कैश्ड क्षेत्र में सब कुछ हटाने के लिए कहता है।
दूरदर्शी सॉफ्टवेयर सॉल्यूशंस

1
कैश को स्टेजिंग क्षेत्र के रूप में भी जाना जाता है, इसलिए मुझे यकीन नहीं है कि आप क्या कर रहे हैं।
जजलिन

Sehe से, rm .git / index बहुत खतरनाक है - ध्यान दें कि वह जिस ब्रांड के नए रेपो के बारे में है, उसे अवश्य पढ़ें! यह उस समय के अन्य 99.999% के लिए अधिक सुरक्षित है। मैंने ध्यान से नहीं पढ़ा और मुझे अपनी वर्किंग कॉपी पर rm .git / index करने के बाद अपनी वर्किंग कॉपी और री-क्लोन को उड़ाना पड़ा।
phpguru

इस आदेश का उपयोग न करें! यह सभी परियोजना को अनट्रैकड अवस्था में बदल देगा (इसमें वे भी शामिल हैं जिनका मंचन नहीं किया गया था)। यह मूल प्रश्न का हल नहीं है। 'Git rm' कमांड का उपयोग करके सही समाधान केवल उन फ़ाइलों को निर्दिष्ट करना है जिन्हें आप अनस्टेज्ड करना चाहते हैं: git rm -rf --cached <files आप unstage> करना चाहते हैं।
मोंटे क्रेसर

आपको केवल इस कमांड का उपयोग तब करना चाहिए जब आपके पास कोई नया रेपो हो, जिसमें अभी तक कोई कमिट नहीं है (यह वह है जो "HEAD सेट नहीं है" का अर्थ है), लेकिन आप केवल .gitइसलिए दूर नहीं फटकना चाहते क्योंकि आपने अन्य रेपो कॉन्फ़िगर किया है रखना की इच्छा है। मैंने इसे स्पष्ट करने के लिए संपादन किया है।
jjlin

5

चेतावनी: जब तक आप बिना काम खोना नहीं चाहते तब तक निम्न कमांड का उपयोग न करें!

का उपयोग करते हुए git resetसमझाया गया है, लेकिन आपने पाइप किए गए आदेशों का स्पष्टीकरण भी मांगा है, इसलिए यहां दिया गया है:

git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

कमांड git ls-filesउन सभी फाइलों को सूचीबद्ध करता है जिनके बारे में git को पता है। विकल्प -zउन पर एक विशिष्ट प्रारूप लागू करता है, जिस प्रारूप की अपेक्षा की जाती है xargs -0, जो तब rm -fउन पर आक्रमण करता है, जिसका अर्थ है कि आपकी स्वीकृति के लिए उन्हें चेक किए बिना हटा दें।

दूसरे शब्दों में, "सभी फ़ाइलों की सूची के बारे में जानते हैं और अपनी स्थानीय प्रति हटा दें"।

फिर हम प्राप्त करते हैं git diff, जो उन विभिन्न संस्करणों के बीच परिवर्तन दिखाता है जिनके बारे में git जानता है। वे विभिन्न पेड़ों के बीच परिवर्तन हो सकते हैं, स्थानीय प्रतियों और दूरस्थ प्रतियों के बीच अंतर हो सकता है, और इसी तरह।
जैसा कि यहां उपयोग किया गया है, यह अस्थिर परिवर्तनों को दर्शाता है; फ़ाइलें जो आपने बदली हैं, लेकिन अभी तक प्रतिबद्ध नहीं हैं। विकल्प का --name-onlyमतलब है कि आप (पूर्ण) फ़ाइल नाम केवल --diff-filter=Dचाहते हैं और इसका मतलब है कि आप केवल नष्ट की गई फ़ाइलों में रुचि रखते हैं। (अरे, क्या हमने सिर्फ सामान का एक गुच्छा नहीं हटाया?) इसके बाद xargs -0हमने पहले देखी गई चीज़ों में पाइप किया , जो git rm --cachedउन पर हमला करता है, जिसका अर्थ है कि वे कैश से हटा दिए जाते हैं, जबकि काम करने वाले पेड़ को अकेला छोड़ दिया जाना चाहिए - इसके अलावा आपने अपने काम के पेड़ से सभी फाइलें हटा दी हैं। अब वे आपके सूचकांक से भी हटा दिए गए हैं।

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


टीएल; डीआर: आपने अभी सब कुछ ठीक किया है; शुरू करें और git resetअभी से उपयोग करें ।


2

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

यदि आप अपनी वर्किंग कॉपी और इंडेक्स वापस पाना चाहते हैं कि वे आखिरी कमिट में कैसे थे , तो आप ( ध्यान से ) निम्न कमांड का उपयोग कर सकते हैं :

git reset --hard

मैं कहता हूं कि "ध्यान से" क्योंकि git reset --hard आपके काम करने की कॉपी और इंडेक्स में अनियोजित परिवर्तन की संभावना है । हालाँकि, इस स्थिति में ऐसा लगता है जैसे आप अपने अंतिम समय में राज्य में वापस जाना चाहते हैं, और वैसे भी अनपेक्षित परिवर्तन खो गए हैं।

अपडेट: यह एम्बर के जवाब पर आपकी टिप्पणियों से लगता है कि आपने अभी तक कोई कमिट नहीं बनाया है (क्योंकि हेड को हल नहीं किया जा सकता), इसलिए यह मदद नहीं करेगा, मुझे डर है।

जैसे कि वे पाइप कैसे काम करते हैं: git ls-files -zऔर git diff --name-only --diff-filter=D -zदोनों बाइट के साथ अलग किए गए फ़ाइल नामों की एक सूची तैयार करते हैं 0। (यह उपयोगी है, क्योंकि, नई लाइनों के विपरीत, 0बाइट्स को यूनिक्स जैसी प्रणालियों पर फ़ाइल नाम में नहीं होने की गारंटी दी जाती है।) कार्यक्रम xargsअनिवार्य रूप से अपने मानक इनपुट से कमांड लाइनों का निर्माण करता है, डिफ़ॉल्ट रूप से मानक इनपुट से लाइनें लेकर और अंत में उन्हें जोड़कर। कमांड लाइन के। -0विकल्प द्वारा द्वारा अलग करने के लिए मानक इनपुट उम्मीद करना कहते हैं 0बाइट्स। xargsहो सकता है कि कमांड लाइन मानक इनपुट से सभी मापदंडों का उपयोग करने के लिए कई बार आदेश दे, ताकि यह सुनिश्चित हो सके कि कमांड लाइन कभी भी लंबी नहीं होती है।

एक साधारण उदाहरण के रूप में, यदि आपके पास test.txtनिम्नलिखित सामग्री के साथ एक फाइल है, तो :

hello
goodbye
hello again

... तो कमांड का आदेश xargs echo whatever < test.txtहोगा:

echo whatever hello goodbye hello again

मैंने कभी कोई कमिट नहीं किया इसलिए यह कहेगा कि वह हेड को हल नहीं कर सकता। ऐसी स्थितियों में हम क्या करते हैं। विस्तार से पाइप समझाने के लिए बहुत बहुत धन्यवाद।
सरट

8
यदि आपने अभी-अभी अपना git अनदेखा बदला है और बहुत सारी फ़ाइलों को शामिल करने के लिए git add --all नहीं किया है, तो उन्हें अस्थिर करने के लिए git reset --hard नहीं चलाएं। वे नष्ट हो जाएगा !!
अजोय

5
Uwaaahh !! शायद आपको "ध्यान से" शब्द को उजागर करने की आवश्यकता है । मैंने सिर्फ ये तीन शब्द "git reset --hard" देखे और मेरी सभी unstaged फाइल्स हैं ... फ़फ़्फ़ !! गया हुआ!!!!!
Vineeth Chitteti

1

यदि आप कमांड के नीचे सभी परिवर्तनों का उपयोग करना चाहते हैं,

git reset --soft HEAD

यदि आप परिवर्तनों को अस्थिर करना चाहते हैं और कार्यशील निर्देशिका से उन्हें वापस लेना चाहते हैं, तो

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