"Git rm - cached x" बनाम "git रीसेट हेड - x"?


163

GitRef.org - मूल :

git rmमचान क्षेत्र से प्रविष्टियाँ निकाल देगा। यह थोड़ा अलग है git reset HEADजिसमें से "unstages" फाइलें हैं। "अनस्टेज" से मेरा मतलब है कि यह मंचन क्षेत्र को प्रभावित करता है इससे पहले कि हम चीजों को संशोधित करना शुरू करते हैं। git rmदूसरी ओर, फ़ाइल को पूरी तरह से मंच से बाहर कर देता है, ताकि यह अगले प्रतिबद्ध स्नैपशॉट में शामिल न हो, जिससे इसे प्रभावी ढंग से हटाया जा सके।

डिफ़ॉल्ट रूप से, एक git rm fileफ़ाइल को मचान क्षेत्र से पूरी तरह से हटा देगा और आपकी डिस्क को भी बंद कर देगा> (कार्यशील निर्देशिका)। फ़ाइल को कार्यशील निर्देशिका में छोड़ने के लिए, आप उपयोग कर सकते हैं git rm --cached

लेकिन क्या वास्तव में बीच का अंतर है git rm --cached asdऔर git reset head -- asd?

जवाबों:


219

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

जब आप कुछ ऐसा करते हैं जैसे git add fileआप इसे इंडेक्स में जोड़ते हैं। और जब आप इसे करते हैं, तो आप इसे पेड़ पर भी जोड़ते हैं।

यह शायद आपको git रीसेट में तीन और सामान्य झंडे जानने में मदद करेगा:

git रीसेट [- <mode>] [ <commit>]

यह फ़ॉर्म वर्तमान शाखा प्रमुख को रीसेट करता है <commit>और संभवतः अनुक्रमणिका (इसे के पेड़ पर रीसेट करना <commit>) और कार्यशील वृक्ष पर निर्भर करता है <mode>, जो निम्न में से एक होना चाहिए:
--soft को अद्यतन करता है

इंडेक्स फ़ाइल और न ही कार्यशील पेड़ को बिल्कुल भी नहीं छूता है (लेकिन <commit>सभी मोड्स की तरह सिर को रीसेट करता है)। यह आपकी सभी परिवर्तित फ़ाइलों को "परिवर्तन किए जाने के लिए प्रतिबद्ध है" छोड़ देता है, क्योंकि गिट स्थिति इसे डाल देगी।

--मिश्रित

सूचकांक को रीसेट करता है, लेकिन काम करने वाले पेड़ को नहीं (यानी, बदली गई फाइलें संरक्षित हैं, लेकिन प्रतिबद्ध के लिए चिह्नित नहीं हैं) और रिपोर्ट करता है कि क्या अद्यतन नहीं किया गया है। यह डिफ़ॉल्ट क्रिया है।

--मुश्किल

सूचकांक और काम करने वाले पेड़ को रीसेट करता है। कार्यशील ट्री में ट्रैक की गई फ़ाइलों में कोई परिवर्तन होने के बाद से <commit>उन्हें छोड़ दिया जाता है।

अब, जब आप कुछ ऐसा करते हैं git reset HEAD- आप वास्तव में क्या कर रहे हैं git reset HEAD --mixedऔर यह सूचकांक को उस स्थिति में "रीसेट" कर देगा , जब आप फ़ाइलों को जोड़ना शुरू कर रहे थे या सूचकांक में संशोधन जोड़ना चाहते थे ( इस माध्यम से git add) इस मामले में, काम की प्रतिलिपि और इंडेक्स (या स्टेजिंग) सिंक में थे, लेकिन आपने रीसेट के बाद सिंक और इंडेक्स को सिंक में बना दिया।

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


मुझे लगता है कि के बाद नोटिस आदेश किसी भी diff है, लेकिन प्रदर्शित नहीं करता है के रूप में अगर यह अभी भी कैश किया गया है, दिखाता है diff। तथापि होने के रूप में फ़ाइल से पता चलता । असंगत की तरह लगता है। git rm --cachedgit diffgit diff --cachedgit statusUntracked
haridsv

7
कोई बात नहीं ... मुझे इस्तेमाल करना चाहिए था git reset --mixed। मैं उस बयान से थोड़ा भ्रमित था git rm --cachedजो इसके विपरीत है git add। शाब्दिक रूप से लिया गया, यह गलत है और नुकसान का कारण बन सकता है। मेरे मामले में, मैंने git addस्टेजिंग क्षेत्र में एक संशोधित फ़ाइल को जोड़ा और "उस ऐड के विपरीत" को जोड़ा जो फ़ाइल का प्रारंभिक ऐड नहीं था। + ग्रेग हेविल के जवाब से मुझे एक स्पष्ट तस्वीर प्राप्त करने में मदद मिली।

12
मुझे वर्किंग कॉपी, ट्री और वर्किंग ट्री का उपयोग थोड़ा भ्रमित लगता है। क्या वर्किंग ट्री वर्किंग कॉपी है, या ट्री है?
नीलव

3
जैसा कि @haridsv ने कहा है, 'भ्रामक git rm --cachedका ठीक उल्टा git add file' भ्रामक है। git reset fileके विपरीत होने के करीब है git add file
मैट ब्राउन

@ नीलव बेल्टेड, लेकिन दूसरों के लिए जो इस धागे को ढूंढते हैं: वर्किंग कॉपी, ट्री, और वर्किंग ट्री सभी एक ही चीज़ (गिट के संदर्भ में) का उल्लेख करते हैं।
डे नोवो

83

शायद एक उदाहरण मदद करेगा:

git rm --cached asd
git commit -m "the file asd is gone from the repository"

बनाम

git reset HEAD -- asd
git commit -m "the file asd remains in the repository"

ध्यान दें कि यदि आपने कुछ और नहीं बदला है , तो दूसरी प्रतिबद्धता वास्तव में कुछ भी नहीं करेगी।


3
क्या आप मुझे बता सकते हैं कि HEAD के बाद वास्तव में उस डबल हाइफ़न का क्या मतलब है?
युवा

30
@ ओयुवा: --फ़ाइल नामों से कमांड विकल्प को अलग करने के लिए उपयोग किया जाता है। यदि कोई शाखा और नाम की कोई फ़ाइल होती हैasd , तो git reset HEAD asdअस्पष्ट होगी। --कहते हैं, "सब कुछ के बाद इस फ़ाइल का नाम है।"
ग्रेग हेवगिल

है git reset HEAD <file>बिल्कुल के रूप में एक ही git rm --cached <file>है और फिर git add --intent-to-add <file>?
शराब बुरी है

1
@aloiceisevil नहीं, एक विशेष मामले को छोड़कर। इस उत्कृष्ट, संक्षिप्त जवाब को देखें ।
डे नोवो

45

git rm --cached fileफ़ाइल को मंच से हटा देगा । यानी जब आप कमिट करेंगे तो फाइल हटा दी जाएगी। git reset HEAD -- fileकेवल स्टेजिंग क्षेत्र में फ़ाइल को उस स्थिति में रीसेट कर देगा जहां वह HEAD कमिट पर था, यानी पिछले आने के बाद से आपने इसमें कोई भी बदलाव नहीं किया होगा। यदि वह परिवर्तन नई फ़ाइल जोड़ने के लिए होता है, तो वे समतुल्य होंगे।


7
धारणा के साथ संयोजन में (जैसा कि अन्य उत्तरों में उल्लेख किया गया है) git rm --cached file, इसके विपरीत थोड़े हैं git add, इस उत्तर ने मुझे बहुत प्रभावित किया, और बहुत रसीला था। लगभग इस टिप्पणी के रूप में कम;)
rbatt

2
@rbatt के रूप में अच्छी तरह से यहाँ टिप्पणी करने के लिए, और स्पष्ट, git rm --cached fileके विपरीत नहीं हैgit add file । व्यवहार git add fileउस विशिष्ट मामले के विपरीत होता है जहां आपने एक नई, पहले से तैयार की गई फ़ाइल को जोड़ा है। हर दूसरे मामले में विपरीत git add fileहै git reset HEAD fileपहले मामले में git reset HEAD fileभी उलट हो git add fileजाता है (एक अनट्रैक फ़ाइल को जोड़ते हुए), और हर मामले में, यही वजह है कि अगर आप एक गिट ऐड को उल्टा करना चाहते हैं तो यह क्या करने का सुझाव देता है।
डे नोवो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.