Git में इंडेक्स से फाइल कैसे निकालें?


355

फ़ाइल सिस्टम से हटाए बिना किसी फ़ाइल को इंडेक्स (= स्टेजिंग एरिया = कैश) से कैसे हटाया जाए?


5
क्या आपका मतलब है "पहले जो था उसे फिर से सेट करें" या "हटाएं, क्योंकि मैं नहीं चाहता कि वह फ़ाइल किसी और" के लिए हो?
एंड्रयू आइलेट

मेरे मामले में यह वही है क्योंकि फ़ाइल पहले मौजूद नहीं थी ...
hcs42

जवाबों:


504

तुम्हें चाहिए:

git rm --cached [file]

यदि आप --cachedविकल्प को छोड़ देते हैं , तो यह उसे कार्यशील ट्री से हटा देगा। git rmकी तुलना में थोड़ा सुरक्षित है git reset, क्योंकि आपको चेतावनी दी जाएगी कि यदि मंचित सामग्री शाखा की नोक या डिस्क पर फ़ाइल से मेल नहीं खाती है। (यदि ऐसा नहीं है, तो आपको जोड़ना होगा --force।)


8
यदि आप गलती से कुछ बिल्ड मध्यवर्ती या स्थानीय कॉन्फ़िगरेशन फ़ाइलों में जाँच करते हैं, तो यह बहुत अच्छा काम करता है। git rm --cachedरेपो से उन्हें निकालने के लिए उपयोग करें। .ignignore, चरणबद्ध और सामान्य के रूप में संबंधित फ़ाइलों या निर्देशिकाओं को जोड़ें। वे रेपो से चले जाएंगे लेकिन आपके स्थानीय पेड़ से अछूते नहीं रहेंगे, और आप गलती से उन्हें फिर से नहीं देखेंगे।
आयनोकॉस्ट ब्रिघम

22
यह आपके द्वारा किए गए और पुश करने के बाद रेपो (रिमोट) से फ़ाइल को हटा भी देता है।
पाउडर 366

6
यह इसे इंडेक्स से नहीं हटाता है, लेकिन इसे इंडेक्स में डिलीट कर देता है।
जटबे जुले

4
यह उत्तर गलत होने की संभावना है क्योंकि यह रेपो (जैसा कि @ पाउडर366 पहले ही उल्लेख किया गया है) से एक फाइल निकालता है जो कि अपेक्षित परिणाम नहीं है।
ओटोमो

1
यह समाधान मेरे लिए काम नहीं किया। यह निर्दिष्ट फ़ाइल को हटाए जाने के रूप में चिह्नित करता है, और फिर इसे स्थानीय रेपो से निकालता है।
पेइगो

134

यह आपके लिए (फ़ाइल को हटाए या अन्यथा संशोधित किए बिना) एक फ़ाइल को अस्थिर कर सकता है:

git reset <file>

6
यह विशिष्ट फ़ाइल के लिए नवीनतम परिवर्तन को हटा देता है लेकिन इसे प्रतिबद्ध और धक्का के बाद रेपो (दूरस्थ) में रखता है।
पाउडर 366

1
यह वह उत्तर है जिसकी मुझे तलाश थी। ध्यान दें कि आपको निर्दिष्ट नहीं करना है HEAD
माइकल डोरस्ट

अच्छी बात @MichaelDorst। मैंने उत्तर छोड़ दिया है HEAD!
डेविड अंडरहिल

3
git reset HEAD <file> 

सूचकांक से एक विशेष फ़ाइल को हटाने के लिए।

तथा

git reset HEAD

सभी अनुक्रमित फ़ाइलों को हटाने के लिए।


1

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

उदाहरण के लिए, अनुक्रमणिका प्रबंधन का समर्थन करने वाले GUI- आधारित उपकरणों में से एक का उपयोग करें:

  • git gui <- Tk विंडोिंग फ्रेमवर्क का उपयोग करता है - समान शैली के लिए gitk
  • git cola <- अधिक आधुनिक शैली वाला GUI इंटरफ़ेस

ये आपको पॉइंट-एंड-क्लिक द्वारा इंडेक्स से फ़ाइलों को अंदर और बाहर ले जाने देते हैं। यहां तक ​​कि उनके पास सूचकांक से (और व्यक्तिगत परिवर्तन) फ़ाइल के भागों को चुनने और आगे बढ़ने के लिए समर्थन है।


एक अलग दृष्टिकोण के बारे में कैसे: यदि आप किसी एक सुझाव का उपयोग करते समय गड़बड़ करते हैं, बल्कि गूढ़ हैं, तो आदेश देते हैं:

  • git rm --cached [file]
  • git reset HEAD <file>

... आप डेटा खोने का एक वास्तविक मौका खड़े हैं - या कम से कम इसे खोजने के लिए कठिन बना रहे हैं। जब तक आपको वास्तव में बहुत उच्च आवृत्ति के साथ ऐसा करने की आवश्यकता नहीं होती है, तब तक GUI उपकरण का उपयोग करना अधिक सुरक्षित होता है


सूचकांक के बिना काम करना

टिप्पणियों और वोटों के आधार पर, मुझे पता चला है कि बहुत सारे लोग हर समय सूचकांक का उपयोग करते हैं। मैं नही। ऐसे:

  • मेरी पूरी कामकाजी प्रति (विशिष्ट मामले): git commit -a
  • बस कुछ फाइलें कमिट करें: git commit (list of files)
  • सभी संशोधित लेकिन कुछ संशोधित फ़ाइलें: git commit -aफिर के माध्यम से संशोधन करेंgit gui
  • कार्यशील प्रतिलिपि में सभी परिवर्तनों की रेखांकन की समीक्षा करें: git difftool --dir-diff --tool=meld

@ मार्टिन: मुझे लगता है कि यह आपके वर्कफ़्लो पर निर्भर करता है। अपने दृष्टिकोण में, मैं कभी भी सीधे सूचकांक का उपयोग नहीं करता हूं। जब मैं अपने काम को बचाना चाहता हूं, तो मैं बस पूरा काम करता हूं git commit -a। जब मैं इस सवाल का जवाब दे रहा था, तो ऐसा इसलिए था क्योंकि मैंने (एक विदेशी) " उलटा चेरी पिक " किया था, जो आपके लिए सूचकांक में फाइलें डालता है, लेकिन मैं कमिट करने से पहले एक फाइल को संपादित करना चाहता था। मैंने फ़ाइल को अनुक्रमणिका से बाहर निकाल लिया, जबकि मैंने इसे संपादित किया ताकि डिफरेंशियल उस तरह से काम करे जिस तरह से मैं करता हूँ।
नोबार

मेरा उपयोग मामला वास्तव में बहुत संकीर्ण और बेकार था: एक शाखा बनाएं; केवल शाखा के लिए फ़ाइलों से भरा फ़ोल्डर जोड़ें; गुरु पर स्विच करें; विलय; ops, मास्टर में गलत फ़ोल्डर जोड़ा गया, इसे gitignore में जोड़ें; फाइलों को कमिटमेंट से हटाया नहीं जाएगा, एक बेहतर समाधान बस rmसीधे उपयोग करना होगा, लेकिन मैंने पहले सोचा था कि स्विचिंग शाखाएं अनदेखा फ़ोल्डर को नहीं मारेंगी। लेकिन ... मैं github "gui आधारित" टूल का उपयोग करता हूं जो मेरे लिए काफी अच्छा है और कुछ सूचकांक प्रबंधन का समर्थन करता है, सिवाय इसके कि यह समर्थन नहीं करता है। तो क्या, मुझे संकीर्ण उपयोग के लिए 2 gui का उपयोग करना चाहिए? अभी भी जवाब से सहमत नहीं हो सकते।
cregox

3
यह एक निश्चित रूप से अलोकप्रिय जवाब है। हालाँकि, मुझे पूरा यकीन है कि मेरे द्वारा सुझाया गया दृष्टिकोण कुछ लोगों के लिए सही है (स्वयं शामिल)। मैं प्रति वर्ष कुछ बार सूचकांक में हेरफेर करने के लिए इनमें से एक उपकरण का उपयोग करता हूं।
nobar

1
आजकल प्रोग्रामिंग एडिटर्स और आईडीई ग्राफिकल इंडेक्स हेरफेर का समर्थन करने की संभावना रखते हैं। कम से कम गिटहब का परमाणु करता है।
नोबार

1
मैं किसी भी दिन अपने से अधिक खतरनाक होते हुए भी गुई पर एक क्ली इंटरफ़ेस पसंद करता हूं। यह मुझे बिना gui के भी git का उपयोग करने की अनुमति देगा, जो मुझे आराम देने वाला लगता है (बजाय खो जाने के जब मैं ऐसे उपकरण उदाहरण के लिए रिमोट सर्वर पर स्थापित नहीं कर सकता)। सभी ने कहा कि यह उत्तर पूरी तरह से वैध है और "सीएल अभिजात्य वर्ग" के लायक नहीं है, एक अच्छा विकल्प प्रदान करने के लिए +1;
सिडऑफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.