मैं कमिट करने से पहले 'git add' कैसे कर सकता हूं?


8955

मैंने गलती से कमांड का उपयोग करके Git में फ़ाइलें जोड़ी हैं:

git add myfile.txt

मैं अभी तक नहीं चला git commit। क्या इसे पूर्ववत करने का कोई तरीका है, इसलिए इन फ़ाइलों को कमिट में शामिल नहीं किया जाएगा?


22
Git v1.8.4 के साथ शुरू, उस उपयोग के नीचे सभी उत्तर HEADया headअब इसके @स्थान पर उपयोग कर सकते हैं HEADयह जानने के लिए कि आप ऐसा क्यों कर सकते हैं, यह उत्तर (अंतिम खंड) देखें ।

3
मैंने थोड़ी गर्मी पैदा की जो एक फ़ाइल को अनस्टैज करने के सभी तरीके दिखाता है: stackoverflow.com/questions/6919121/…
डैनियल एल्डर

5
चेक चेकआउट क्यों नहीं?
एरिक रेपेने

13
@ ErikReppen कमिटेड git checkoutइंडेक्स से चरणबद्ध परिवर्तन को नहीं हटाता है। यह केवल अंतिम प्रतिबद्ध संशोधन के लिए अन-स्टेज किए गए परिवर्तनों का सम्मान करता है - जो वैसे भी नहीं है जैसा कि मैं चाहता हूं, मैं उन परिवर्तनों को चाहता हूं, मैं उन्हें बाद में प्रतिबद्ध करना चाहता हूं।
paxos1977

4
यदि आप ग्रहण का उपयोग करते हैं, तो यह
कमिटमेंट

जवाबों:


10358

आप के git addसाथ करने से पहले पूर्ववत कर सकते हैं

git reset <file>

जो इसे बिना किसी और बदलाव के वर्तमान सूचकांक ("प्रतिबद्ध होने के बारे में" सूची) से हटा देगा।

आप उपयोग कर सकते हैं

git reset

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

Git के पुराने संस्करणों में, उपरोक्त आदेश क्रमशः git reset HEAD <file>और उसके बराबर git reset HEADहैं, और यदि HEADअपरिभाषित है (क्योंकि आपने अभी तक अपनी रिपॉजिटरी में कोई कमिट नहीं किया है) या अस्पष्ट (क्योंकि आपने एक शाखा बनाई है HEAD, जो एक बेवकूफी वाली बात है आपको ऐसा नहीं करना चाहिए)। इसे Git 1.8.2 में बदल दिया गया था , हालांकि, Git के आधुनिक संस्करणों में आप अपना पहला विज्ञापन बनाने से पहले भी ऊपर दिए गए आदेशों का उपयोग कर सकते हैं:

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


92
बेशक, यह एक सच्चा पूर्ववत नहीं है, क्योंकि अगर गलत git addपिछले एक मंचित अनवांटेड संस्करण को ओवरवोट करता है, तो हम इसे पुनर्प्राप्त नहीं कर सकते। मैंने नीचे अपने उत्तर में इसे स्पष्ट करने का प्रयास किया।
leonbloy

7
git reset HEAD *.extजहां extदिए गए विस्तार आप unadd करना चाहते हैं फ़ाइलों है। मेरे लिए यह था *.bmpऔर*.zip
boulder_ruby

18
@ जॉनी, इंडेक्स (उर्फ स्टेजिंग एरिया) में सभी फाइलें होती हैं, न कि सिर्फ बदली हुई फाइलें। यह "जीवन शुरू करता है" (जब आप एक प्रतिबद्ध या एक रेपो की जांच करते हैं) हेड द्वारा इंगित की गई सभी फाइलों की एक प्रति के रूप में। इसलिए यदि आप इंडेक्स से फाइल हटाते हैं ( git rm --cachedतो इसका मतलब है कि आप एक कमिट करने की तैयारी कर रहे हैं जो उस फाइल को डिलीट कर देता है। git reset HEAD <filename>दूसरी तरफ HEAD से फाइल को इंडेक्स में कॉपी करेगा, ताकि अगली कमिट में उस फाइल में कोई बदलाव न हो।
वाइल्डकार्ड

11
मुझे बस पता चला कि जैसा है git reset -pवैसा ही है git add -p। यह कमाल का है!
दान

10
आप वास्तव में पूर्व में किए गए अधिलेखित लेकिन अप्रभावित परिवर्तनों को पुनर्प्राप्त कर सकते हैं, लेकिन उपयोगकर्ता के तरीके से नहीं और 100% सुरक्षित नहीं (कम से कम कोई भी मुझे नहीं मिला): गोटो .गित / ऑब्जेक्ट्स, git addआप के समय में बनाई गई फ़ाइलों की खोज करना चाहते हैं ( 61/3AF3...-) > ऑब्जेक्ट आईडी 613AF3...), तब git cat-file -p <object-id>(कई घंटों के काम को ठीक करने के लिए इसके लायक हो सकता है लेकिन अधिक बार कम करने के लिए एक सबक ...)
पीटर श्नाइडर

2151

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

git rm --cached <added_file_to_undo>

तर्क:

जब मैं इसके लिए नया था, मैंने पहली बार कोशिश की थी

git reset .

(मेरे पूरे प्रारंभिक ऐड को पूर्ववत करने के लिए), केवल यह पाने के लिए (ऐसा नहीं) सहायक संदेश:

fatal: Failed to resolve 'HEAD' as a valid ref.

यह पता चला है कि यह इसलिए है क्योंकि HEAD रेफरी (शाखा?) पहले प्रतिबद्ध होने तक मौजूद नहीं है। यही है, अगर आप अपने वर्कफ़्लो में मेरे जैसे ही वर्कफ़्लो में चलेंगे, तो मैं कुछ इस तरह था:

  1. मेरे महान नए परियोजना निर्देशिका के लिए सीडी बाहर की कोशिश करने के लिए गिट, नई हॉटनेस
  2. git init
  3. git add .
  4. git status

    ... बकवास के बहुत सारे स्क्रॉल द्वारा ...

    => धिक्कार है, मैं वह सब नहीं जोड़ना चाहता था।

  5. Google "पूर्ववत करें" जोड़ें

    => स्टैक ओवरफ्लो खोजें - yay

  6. git reset .

    => घातक: एक वैध रेफरी के रूप में 'हेड' को हल करने में विफल।

यह आगे पता चलता है कि मेलिंग सूची में इस के unhelpfulness के खिलाफ एक बग लॉग इन किया है

और वह सही समाधान Git स्टेटस आउटपुट में वहीं था (जो, हां, मैंने 'बकवास' के रूप में चित्रित किया था)

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

और समाधान वास्तव में उपयोग करना है git rm --cached FILE

यहां कहीं और चेतावनियों पर ध्यान दें - git rmफ़ाइल की आपकी स्थानीय कार्यशील प्रतिलिपि को हटा देता है, लेकिन यदि आप उपयोग नहीं करते हैं तो - कैश की गई । यहाँ का परिणाम है git help rm:

--cached इस विकल्प का उपयोग केवल इंडेक्स से अनस्टेज और पाथ को हटाने के लिए करें। कार्यशील ट्री फाइलें, चाहे संशोधित हो या न हों, छोड़ी जाएंगी।

मैं उपयोग करने के लिए आगे बढ़ना

git rm --cached .

सब कुछ हटाने और फिर से शुरू करने के लिए। हालांकि काम नहीं किया है, क्योंकि जबकि add .पुनरावर्ती है, पता चला है कि पुनरावृत्ति की rmजरूरत -rहै। आह।

git rm -r --cached .

ठीक है, अब मैं वापस आ गया हूं जहां मैंने शुरू किया था। अगली बार मैं -nएक सूखा रन करने के लिए उपयोग करने जा रहा हूं और देखूंगा कि क्या जोड़ा जाएगा:

git add -n .

मैंने किसी चीज को नष्ट नहीं करने के git help rmबारे में भरोसा करने से पहले एक सुरक्षित जगह पर सब कुछ झोंक दिया --cached(और अगर मुझे यह याद आया तो)।


15
हा। मैंने इसी प्रक्रिया का पालन किया। सिवाय मैंने हार मान ली और कहा rm -rf .git, git initक्योंकि मुझे git rm --cachedअपनी काम की कॉपी रखने पर भरोसा नहीं था । यह थोड़ा कहता है कि कैसे कुछ जगहों पर गिट अभी भी जटिल है। git unstageबस एक स्टॉक मानक कमांड होना चाहिए, मुझे परवाह नहीं है कि क्या मैं इसे एक उपनाम के रूप में जोड़ सकता हूं।
एड्रियन मैकनील

5
मेरे लिए git कहता हैgit reset HEAD <File>...
drahnr

16
git rm - cached <file> वास्तव में सही उत्तर है, यदि यह रिपॉजिटरी में <file> का प्रारंभिक आयात है। यदि आप फ़ाइल में कोई बदलाव करने की कोशिश कर रहे हैं, तो git रीसेट सही उत्तर है। लोगों का कहना है कि यह जवाब गलत है, एक अलग सवाल है।
बैरी केली

14
यह वास्तव में काम करेगा, लेकिन केवल पहली प्रतिबद्ध पर, जहां फ़ाइल पहले मौजूद नहीं थी, या जहां git addकमांड ने नई फाइलें जोड़ीं, लेकिन मौजूदा फ़ाइलों में परिवर्तन नहीं हुआ
n

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

532

यदि आप टाइप करते हैं:

git status

Git आपको बताएगा कि मंचन क्या है, आदि, कैसे अस्थिर करने के निर्देश सहित:

use "git reset HEAD <file>..." to unstage

मुझे लगता है कि Git मुझे इस तरह की परिस्थितियों में सही काम करने के लिए मुझे परेशान करने का एक अच्छा काम करता है।

नोट: हाल के गिट संस्करणों (1.8.4.x) ने इस संदेश को बदल दिया है:

(use "git rm --cached <file>..." to unstage)

19
यह संदेश अलग-अलग होगा कि addएड फाइल पहले से ट्रैक की जा रही थी ( addकेवल कैश के लिए एक नया संस्करण सहेजा गया था - यहां यह आपका संदेश दिखाएगा)। अन्य जगहों पर, यदि फ़ाइल का पहले मंचन नहीं किया गया था, तो यह प्रदर्शित होगीuse "git rm --cached <file>..." to unstage
'18

महान! git reset HEAD <file>एक केवल एक ही है कि मामले में काम करेंगे आप एक फ़ाइल को नष्ट unstage करना चाहते है
skerit

2
मेरा git संस्करण 2.14.3 अस्थिर git reset HEADकरने के लिए कहता है।
सिल्वरवॉल्फ - मोनिका

246

स्पष्ट करने के लिए: चालन क्षेत्र (इंडेक्स) git addमें वर्तमान कार्यशील निर्देशिका से परिवर्तन होता है ।

इस प्रक्रिया को स्टेजिंग कहा जाता है । तो सबसे प्राकृतिक आदेश के लिए मंच परिवर्तन (बदल फ़ाइलें) स्पष्ट एक है:

git stage

git add के लिए बस एक आसान से अन्य प्रकार है git stage

अफ़सोस की बात है कोई git unstageऔर न ही git unaddआदेशों। प्रासंगिक व्यक्ति अनुमान लगाने या याद रखने में कठिन है, लेकिन यह बहुत स्पष्ट है:

git reset HEAD --

हम आसानी से इसके लिए एक उपनाम बना सकते हैं:

git config --global alias.unadd 'reset HEAD --'
git config --global alias.unstage 'reset HEAD --'

और अंत में, हमारे पास नए आदेश हैं:

git add file1
git stage file2
git unadd file2
git unstage file1

व्यक्तिगत रूप से मैं भी छोटे उपनाम का उपयोग करता हूं:

git a # For staging
git u # For unstaging

3
"चाल"? यह इंगित करता है कि यह कार्यशील निर्देशिका से चला गया है। ऐसी बात नहीं है।
थॉमस वेलर

4
यह स्पष्ट क्यों है?
लेनार होयट

वास्तव में, git stageउर्फ है git add, जो ऐतिहासिक कमान है, जो गिट और अन्य एससीएम दोनों पर है। यदि यह कह सकता है कि "Git's git रिपॉजिटरी" में 11920d28da के साथ इसे 2008 में जोड़ा गया है।
ओब्सीडियन

1
यह असंबंधित हो सकता है, लेकिन मैंने एक उपयोगी विचार जोड़ने से पहले भी फ़ाइल को मान्य किया है, चेक-कमांड फ़ाइलनाम और& git ऐड फ़ाइल नाम की तरह कुछ, मैंने अपनी मशीन में एक छोटे जी के साथ गिट को बदल दिया, और अब तक यह काम किया है मेरे लिए ठीक है: github.com/dataf3l/g , मुझे नहीं पता कि यह किसी के लिए उपयोगी होगा, लेकिन मैं इसे यहाँ रखूँगा आशा करता हूँ कि यह कुछ लोगों के समय को बचाता है।
फेलिप वैलेड्स

167

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

यह चिंता की बात नहीं है; फ़ाइल वास्तव में अभी भी भंडार में है, लेकिन केवल "ढीली वस्तु" के रूप में। इसे अन्य रिपॉजिटरी (क्लोन, पुश) के माध्यम से कॉपी नहीं किया जाएगा, और अंतरिक्ष को अंततः पुनः प्राप्त किया जाएगा - हालांकि बहुत जल्द नहीं। यदि आप चिंतित हैं, तो आप दौड़ सकते हैं:

git gc --prune=now

अद्यतन (क्या कुछ भ्रम को दूर करने का मेरा प्रयास है जो सबसे अधिक उत्तर दिए गए प्रश्नों से उत्पन्न हो सकता है):

तो, जो वास्तविक पूर्ववत है git add?

git reset HEAD <file> ?

या

git rm --cached <file>?

सख्ती से बोल रहा हूँ, और अगर मुझसे गलती नहीं है: कोई नहीं

git add पूर्ववत नहीं किया जा सकता - सुरक्षित रूप से, सामान्य रूप से।

आइए पहले याद करें कि git add <file>वास्तव में क्या होता है:

  1. यदि पहले ट्रैक नहीं किया<file> गया था , तो इसे अपनी वर्तमान सामग्री के साथ कैश में जोड़ देता है।git add

  2. यदि पहले से ट्रैक किया<file> गया था , तो वर्तमान सामग्री (स्नैपशॉट, संस्करण) को कैश में सहेजता है । गिट में, इस क्रिया को अभी भी ऐड कहा जाता है , (केवल इसे अपडेट नहीं), क्योंकि किसी फ़ाइल के दो अलग-अलग संस्करणों (स्नैपशॉट) को दो अलग-अलग मदों के रूप में माना जाता है: इसलिए, हम वास्तव में कैश में एक नया आइटम जोड़ रहे हैं, अंततः होने के लिए बाद में प्रतिबद्ध।git add

इसके प्रकाश में, सवाल थोड़ा अस्पष्ट है:

मैंने गलती से कमांड का उपयोग करके फाइलें जोड़ दीं ...

ओपी का परिदृश्य पहले वाला (अनटैक्ड फ़ाइल) लगता है, हम ट्रैक किए गए आइटम से फ़ाइल (न केवल वर्तमान सामग्री) को हटाने के लिए "पूर्ववत करना" चाहते हैं। यदि यह मामला है, तो इसे चलाना ठीक है git rm --cached <file>

और हम भी दौड़ सकते थे git reset HEAD <file>। यह सामान्य रूप से बेहतर है, क्योंकि यह दोनों परिदृश्यों में काम करता है: यह पूर्ववत भी करता है जब हमने गलत तरीके से पहले से ही ट्रैक किए गए आइटम का एक संस्करण जोड़ा था।

लेकिन दो कैविएट हैं।

पहला: वहाँ है (जैसा कि उत्तर में बताया गया है) केवल एक परिदृश्य जिसमें git reset HEADकाम नहीं करता है, लेकिन git rm --cachedयह करता है: एक नया भंडार (कोई सराहनीय नहीं)। लेकिन, वास्तव में, यह एक व्यावहारिक रूप से अप्रासंगिक मामला है।

दूसरा: ध्यान रखें कि git reset HEAD पहले से कैश की गई फ़ाइल सामग्री को जादुई रूप से पुनर्प्राप्त नहीं किया जा सकता है, यह सिर्फ HEAD से इसे फिर से सिंक्रनाइज़ करता है। यदि हमारे गुमराह git addपिछले एक मंचन uncommitted संस्करण overwrote, हम इसे पुनर्प्राप्त नहीं कर सकते। इसीलिए, सख्ती से बोलते हुए, हम पूर्ववत नहीं कर सकते [*]।

उदाहरण:

$ git init
$ echo "version 1" > file.txt
$ git add file.txt   # First add of file.txt
$ git commit -m 'first commit'
$ echo "version 2" > file.txt
$ git add  file.txt   # Stage (don't commit) "version 2" of file.txt
$ git diff --cached file.txt
-version 1
+version 2
$ echo "version 3" > file.txt
$ git diff  file.txt
-version 2
+version 3
$ git add  file.txt    # Oops we didn't mean this
$ git reset HEAD file.txt  # Undo?
$ git diff --cached file.txt  # No dif, of course. stage == HEAD
$ git diff file.txt   # We have irrevocably lost "version 2"
-version 1
+version 3

बेशक, यह बहुत महत्वपूर्ण नहीं है अगर हम केवल नई फ़ाइलों (केस 1) को जोड़ने के लिए 'git add' करने के सामान्य आलसी वर्कफ़्लो का पालन करते हैं, और हम प्रतिबद्ध, git commit -aकमांड के माध्यम से नई सामग्री अपडेट करते हैं ।


* (संपादित करें: उपरोक्त व्यावहारिक रूप से सही है, लेकिन फिर भी परिवर्तनों को ठीक करने के लिए कुछ थोड़े हैकिश / दृढ़ तरीके हो सकते हैं, लेकिन प्रतिबद्ध नहीं थे और फिर अधिलेखित नहीं हुए - जोहान्स माटॉइक और आईसोलिट द्वारा टिप्पणियां देखें)


4
कड़ाई से बोलते हुए एक पहले से ही मंचित फ़ाइल को पुनर्प्राप्त करने का एक तरीका है जिसे गिट ऐड के साथ बदल दिया गया था। जैसा कि आप उल्लेख करते हैं कि git ऐड उस फाइल के लिए एक git ऑब्जेक्ट बनाता है जो न केवल फाइल को पूरी तरह से हटाने पर एक ढीला ऑब्जेक्ट बन जाएगा, बल्कि नई सामग्री के साथ ओवरराइट होने पर भी होगा। लेकिन इसे स्वचालित रूप से पुनर्प्राप्त करने के लिए कोई आदेश नहीं है। इसके बजाय फ़ाइल की पहचान की जानी चाहिए और मैन्युअल रूप से या केवल इस मामले के लिए लिखे गए टूल के साथ (libgit2 इसे अनुमति देगा)। लेकिन यह केवल तभी भुगतान करेगा जब फ़ाइल बहुत महत्वपूर्ण और बड़ी हो और पिछले संस्करण को संपादित करके पुनर्निर्माण न किया जा सके।
जोहान्स मटोकिक

2
अपने आप को सही करने के लिए: एक बार ढीली वस्तु फ़ाइल मिल जाने पर (सामग्री दिनांक / समय जैसे मेटा-डेटा का उपयोग करें) git cat-fileका उपयोग इसकी सामग्री को पुनर्प्राप्त करने के लिए किया जा सकता है।
जोहान्स मटोकिक

2
करने के लिए एक और तरीका है जो परिवर्तन का मंचन किया गया, लेकिन प्रतिबद्ध नहीं और उसके बाद ओवरराइट की वसूली एक और जैसे द्वारा git addके माध्यम से है git fsck --unreachableकि सभी पहुँच योग्य नहीं obj, जिसे फिर से निरीक्षण कर सकते हैं सूची जाएगा git show SHA-1_IDया git fsck --lost-foundकि इच्छाशक्ति> लिखें में वस्तुओं झूलते .git/lost-found/commit/या .git/lost-found/other/, प्रकार के आधार पर। यह भी देखेंgit fsck --help
iolsmit

110

पूर्व में जोड़ी गई फ़ाइल को Git का उपयोग करना काफी आसान है। रीसेट करने के लिए myfile.txt, जिन्हें पहले ही जोड़ा जा चुका है, उपयोग करें:

git reset HEAD myfile.txt

स्पष्टीकरण:

आपके द्वारा अवांछित फ़ाइल का मंचन करने के बाद, पूर्ववत करने के लिए, आप कर सकते हैं git resetHeadस्थानीय में आपकी फ़ाइल का प्रमुख है और अंतिम पैरामीटर आपकी फ़ाइल का नाम है।

मैंने आपके लिए और अधिक विवरणों में नीचे दी गई छवि में चरणों को शामिल किया है, इन मामलों में हो सकने वाले सभी चरणों सहित:

git HEAD फ़ाइल रीसेट करें


चित्र: "कमांड एड ...""कमांड जोड़ता है ..." ( वर्तमान में सरल काल, तीसरे व्यक्ति )
पीटर मॉर्टेंसन

चित्र: वानाचाहते हैं (यहाँ स्लैंग का उपयोग करने की कोई आवश्यकता नहीं है)
पीटर मॉर्टेंसन

92
git rm --cached . -r

आपके वर्तमान निर्देशिका से पुनरावर्ती रूप से जोड़ी गई सभी चीज़ों को "अन-एड" करेगा


3
मैं सबकुछ अन-एड करना नहीं चाह रहा था, सिर्फ एक विशिष्ट फ़ाइल।
paxos1977

3
यदि आपके पास कोई पिछला कमिट नहीं है तो भी उपयोगी है। पिछली प्रतिबद्धताओं के अभाव में, git reset HEAD <file>कहेंगेfatal: Failed to resolve 'HEAD' as a valid ref.
प्रिया रंजन सिंह

6
नहीं, यह कहते हैं एक विलोपन अपने वर्तमान निर्देशिका में सब कुछ की। केवल अस्थिर परिवर्तनों के लिए बहुत अलग है।
मार्क अमेरी

88

Daud

git gui

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


1
हां मैं समझता हूं। मैं केवल यह संकेत देना चाहता था कि आपका संकेत यह है कि आपके उत्तर पर "जैसे आप उपयोग कर सकते हैं git-gui...." :)
अलेक्जेंडर सुरफेल

1
यह कहता है, "git-gui: कमांड नहीं मिला"। मुझे यकीन नहीं है कि अगर यह काम करता है।
परिंदा

वाह, यह बहुत सरल है तो कमांड लाइन करना जो आपको समझ नहीं आया। यह निश्चित रूप से मेरी तरह एक शुरुआत के लिए सिफारिश की है। इसे लिखने के लिए धन्यवाद!
इरफैंडी जिप

धन्यवाद। यह जोखिम नहीं करना चाहता था इसलिए GUI का उपयोग करना पड़ा।
सागर खत्री

83

Git में कल्पनाशील हर कार्य के लिए कमांड हैं, लेकिन चीजों को सही तरीके से प्राप्त करने के लिए इसे व्यापक ज्ञान की आवश्यकता होती है और इस कारण से यह काउंटर पर सहज ज्ञान युक्त है ...

आपने पहले क्या किया था:

  • एक फ़ाइल को बदला और उपयोग किया git add ., या git add <file>

आपको क्या चाहिए:

  • फ़ाइल को अनुक्रमणिका से निकालें, लेकिन उसे संस्करण में रखें और काम की प्रतिलिपि में बिना किसी बदलाव के छोड़ दिया जाए:

    git reset head <file>
    
  • फ़ाइल को HEAD से अंतिम स्थिति में रीसेट करें, परिवर्तनों को पूर्ववत करें और उन्हें अनुक्रमणिका से निकालें:

    # Think `svn revert <file>` IIRC.
    git reset HEAD <file>
    git checkout <file>
    
    # If you have a `<branch>` named like `<file>`, use:
    git checkout -- <file>

    यह आवश्यक है क्योंकि git reset --hard HEADएकल फ़ाइलों के साथ काम नहीं करेगा।

  • <file>अनुक्रमणिका और संस्करण से निकालें , कार्यशील प्रतिलिपि में परिवर्तनों के साथ संयुक्त संस्करण वाली फ़ाइल को रखते हुए:

    git rm --cached <file>
    
  • <file>पूरी तरह से काम की प्रतिलिपि और संस्करण से निकालें :

    git rm <file>
    

1
मैं 'git रीसेट हेड <फ़ाइल>' और 'git rm --cached <file>' के अंतर को बर्दाश्त नहीं कर सकता। क्या आप इसे समझा सकते हैं?
jeswang

6
@jeswang फाइलें या तो 'git' के लिए जानी जाती हैं (उनमें परिवर्तन ट्रैक किए जा रहे हैं।), या वे 'versioned' नहीं हैं। reset headआपके वर्तमान परिवर्तनों को हटा देता है, लेकिन फ़ाइल को अभी भी मॉनिटर द्वारा देखा जा रहा है। rm --cachedफ़ाइल को संस्करण से बाहर ले जाता है, इसलिए परिवर्तन के लिए अब इसे चेक नहीं करता है (और अंत में अनुक्रमित वर्तमान परिवर्तनों को भी हटाता है, पूर्व से गिट करने के लिए कहा गया है add), लेकिन परिवर्तित फ़ाइल को आपकी कार्यशील प्रतिलिपि में रखा जाएगा, जो कि आप फ़ाइल फ़ोल्डर में है एचडीडी पर।
शाम

3
अंतर git reset HEAD <file>अस्थायी है - कमांड केवल अगले प्रतिबद्ध के लिए लागू किया git rm --cached <file>जाएगा , लेकिन जब तक इसे फिर से नहीं जोड़ा जाता है तब तक यह अस्थिर रहेगा git add <file>। इसके अलावा, git rm --cached <file>इसका मतलब है कि यदि आप उस शाखा को रिमोट से धक्का देते हैं , तो शाखा को खींचने वाला कोई भी व्यक्ति अपने फ़ोल्डर से फ़ाइल को डिलीट कर देगा।
19

80

प्रश्न स्पष्ट रूप से सामने नहीं आया है। कारण यह है कि git addदो अर्थ हैं:

  1. स्टेजिंग क्षेत्र में एक नई फ़ाइल जोड़ना , फिर उसके साथ पूर्ववत करें git rm --cached file
  2. स्टेजिंग क्षेत्र में एक संशोधित फ़ाइल जोड़ना , फिर उसके साथ पूर्ववत करें git reset HEAD file

संदेह होने पर उपयोग करें

git reset HEAD file

क्योंकि यह दोनों मामलों में अपेक्षित काम करता है।

चेतावनी: यदि आप ऐसा git rm --cached fileएक फ़ाइल है कि गया था पर संशोधित (एक फ़ाइल है कि भंडार में पहले मौजूद), तो फ़ाइल को निकाल दी जाएगी git commit! यह अभी भी आपके फ़ाइल सिस्टम में मौजूद है, लेकिन यदि कोई अन्य व्यक्ति आपकी कमिटमेंट को खींचता है, तो फ़ाइल को उनके कार्य ट्री से हटा दिया जाएगा।

git statusआपको बताएगा कि फ़ाइल एक नई फ़ाइल थी या संशोधित :

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   my_new_file.txt
    modified:   my_modified_file.txt

7
+1। इस पृष्ठ पर अत्यधिक संख्या में उत्कीर्ण उत्तर और टिप्पणियों का केवल फ्लैट-आउट होना गलत है git rm --cached somefile। मुझे उम्मीद है कि यह उत्तर पृष्ठ को एक प्रमुख स्थान पर ले जाता है जहां यह सभी झूठे दावों से गुमराह होने से नए लोगों की रक्षा कर सकता है।
मार्क अमेरी

यहाँ पर सबसे अच्छे उत्तरों में से एक, दुख की बात है कि यह सूची में काफी कम है
Creos

64

यदि आप अपनी प्रारंभिक प्रतिबद्धता पर हैं और आप उपयोग नहीं कर सकते हैं git reset, तो बस "Git दिवालियापन" की घोषणा करें और .gitफ़ोल्डर को हटा दें और शुरू करें


5
एक टिप आपकी .it / config फाइल को कॉपी करने के लिए है यदि आपने फ़ोल्डर को हटाने से पहले रिमोट ओरिजिनल जोड़ा है।
टियागो

4
@ChrisJohnsen टिप्पणी हाजिर है। कभी-कभी, आप एक को छोड़कर सभी फ़ाइलों को कमिट करना चाहते हैं: git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit' (यह तब भी काम करता है जब पिछली कोई Failed to resolve 'HEAD'समस्या न हो , फिर से समस्या हो)

57

अन्य कई उत्तरों के अनुसार, आप उपयोग कर सकते हैं git reset

परंतु:

मैं इस महान छोटी पोस्ट है कि वास्तव में के लिए Git आदेश (अच्छी तरह से, एक उपनाम) कहते हैं पाया git unadd: देखने Git unadd विवरण या के लिए ..

सीधे शब्दों में,

git config --global alias.unadd "reset HEAD"

अब आप कर सकते हैं

git unadd foo.txt bar.txt

45

git add -iअपनी आगामी प्रतिबद्ध से जस्ट-एडेड फ़ाइलों को हटाने के लिए उपयोग करें । उदाहरण:

उस फ़ाइल को जोड़ना जो आप नहीं चाहते थे:

$ git add foo
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   foo
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]#

अपने ऐड को पूर्ववत करने के लिए इंटरएक्टिव ऐड में जा रहे हैं (यहां git पर टाइप की गई कमांड्स "r" (रिवर्ट), "1" हैं (लिस्ट में पहली एंट्री रिवर्ट शो), रिवर्ट मोड से बाहर जाने के लिए 'वापसी', और "q" (छोड़):

$ git add -i
           staged     unstaged path
  1:        +1/-0      nothing foo

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> r
           staged     unstaged path
  1:        +1/-0      nothing [f]oo
Revert>> 1
           staged     unstaged path
* 1:        +1/-0      nothing [f]oo
Revert>> 
note: foo is untracked now.
reverted one path

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> q
Bye.
$

बस! यहाँ आपका प्रमाण है, जो दिखा रहा है कि "foo" वापस अनट्रैक सूची में है:

$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]
#       foo
nothing added to commit but untracked files present (use "git add" to track)
$

42

git removeया git rmइसके लिए इस्तेमाल किया जा सकता है, --cachedझंडे के साथ । प्रयत्न:

git help rm

9
क्या यह फ़ाइल को पूरी तरह से हटाने वाला नहीं है?
Willa

8
git rm --cached ...एक git रेपो से फाइल को हटा देगा। वे अभी भी आपके कंप्यूटर पर मौजूद होंगे, लेकिन यह बहुत अस्थिर है एक फ़ाइल में अस्थिर परिवर्तनों से। इस पर ठोकर खाने वाले किसी भी व्यक्ति के लिए, यह सवाल का वैध जवाब नहीं है।
Addison

38

जब आप एक नई परियोजना शुरू करते हैं तो इस विकराल समस्या से बचने का एक तरीका है:

  • अपने नए प्रोजेक्ट के लिए मुख्य निर्देशिका बनाएं।
  • भागो git init
  • अब एक .gitignore फ़ाइल बनाएं (भले ही वह खाली हो)।
  • अपनी .gitignore फ़ाइल को कमिट करें।

git resetयदि आपके पास कोई कमिट नहीं है तो Git करना वास्तव में कठिन है। आप बनाते हैं, तो एक छोटे से प्रारंभिक सिर्फ एक होने के लिए प्रतिबद्ध, आप कर सकते हैं कि उसके बाद git add -Aऔर git resetकई बार के रूप के रूप में आप सब कुछ सही पाने के लिए चाहते हैं।

इस विधि का एक और लाभ यह है कि यदि आप बाद में परेशानियों को खत्म करने की कोशिश करते हैं और अपनी सभी फाइलों को रिफ्रेश करने की आवश्यकता होती है, तो यह आसान है:

  • प्रारंभिक जांच करें। यह आपकी सभी फाइलों को हटा देगा।
  • फिर अपने सबसे हाल के कमिटमेंट को फिर से देखें। यह आपकी फ़ाइलों की नई प्रतियों को आपके वर्तमान लाइन-एंड सेटिंग्स का उपयोग करके पुनः प्राप्त करेगा।

1
की पुष्टि! Git ऐड के बाद git रिसेट करने की कोशिश की। और git भ्रष्ट HEAD के बारे में शिकायत कर रहा था। आपकी सलाह के बाद, मैं कोई समस्या नहीं के साथ आगे और पीछे जोड़ सकते हैं :)
Kounavi

1
दूसरा भाग काम करता है, लेकिन यह थोड़ा अनाड़ी है। लाइन अंत कैसे संभाला जाता है, autocrlfमूल्य पर निर्भर करता है ... यह सेटिंग्स के आधार पर हर परियोजना में काम नहीं करेगा।
सजेस

1
यह जवाब उस समय वाजिब था जब यह पोस्ट किया गया था, लेकिन अब अप्रचलित है; git reset somefileऔर git resetपहले काम करने से पहले दोनों काम करते हैं। कई Git के रिलीज़ होने के बाद से यह मामला रहा है।
मार्क अमेरी

@ मार्की, आप सही हो सकते हैं (यदि आप अपने दावे के लिए एक स्रोत पोस्ट करते हैं तो यह अच्छा होगा), लेकिन एक साफ कमिट या दो के साथ अपने रेपो को शुरू करने में अभी भी मूल्य है।
रयान ल्यूडी

34

हो सकता है कि आपके सवाल पोस्ट करने के बाद से Git विकसित हुआ हो।

$> git --version
git version 1.6.2.1

अब, आप कोशिश कर सकते हैं:

git reset HEAD .

यह वही होना चाहिए जो आप ढूंढ रहे हैं।


2
ज़रूर, लेकिन फिर आपके पास फॉलोअप का सवाल है कि किसी को दो (या अधिक) फ़ाइलों में से एक को कैसे अनडड करना चाहिए । "गिट रीसेट" मैनुअल का उल्लेख है कि "गिट रीसेट <पथ>" हालांकि "गिट जोड़ <पथ>" के विपरीत है।
एलेक्स नॉर्थ-कीज

34

ध्यान दें कि यदि आप एक संशोधन निर्दिष्ट करने में विफल रहते हैं तो आपको एक विभाजक को शामिल करना होगा। मेरे कंसोल से उदाहरण:

git reset <path_to_file>
fatal: ambiguous argument '<path_to_file>': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

git reset -- <path_to_file>
Unstaged changes after reset:
M    <path_to_file>

(Git संस्करण 1.7.5.4)


2
मैंने कोशिश की git reset <path>और यह एक विभाजक के बिना ठीक काम करता है। मैं भी 1.9.0 git का उपयोग कर रहा हूँ। शायद यह पुराने संस्करणों में काम नहीं करता है?

31

मेज़बान क्षेत्र से नई फ़ाइलों को निकालने के लिए (और केवल एक नई फ़ाइल के मामले में), जैसा कि ऊपर बताया गया है:

git rm --cached FILE

संयोग से जोड़े गए नई फ़ाइलों के लिए केवल rm --cached का उपयोग करें।


4
मन कि --cachedवास्तव में यहाँ एक महत्वपूर्ण हिस्सा है।
ताकेशिन

1
-1; नहीं, यह फ़ाइल को अन-स्टेज नहीं करता है, यह फ़ाइल को हटाने का कार्य करता है (वास्तव में आपके काम के पेड़ से इसे हटाने के बिना)।
मार्क अमेरी

25

किसी विशेष फ़ोल्डर (और उसके सबफ़ोल्डर) में प्रत्येक फ़ाइल को रीसेट करने के लिए, आप निम्न कमांड का उपयोग कर सकते हैं:

git reset *

4
वास्तव में, यह हर फाइल को रीसेट नहीं करता है क्योंकि * शेल विस्तार का उपयोग करता है और यह डॉटफाइल्स (और डॉट-निर्देशिका) को अनदेखा करता है।
लूका

आप git statusकुछ भी शेष देखने के लिए चला सकते हैं और इसे मैन्युअल रूप से रीसेट कर सकते हैं git reset file
ज़ोरयार

25

*एक समय में कई फ़ाइलों को संभालने के लिए कमांड का उपयोग करें :

git reset HEAD *.prj
git reset HEAD *.bmp
git reset HEAD *gdb*

आदि।


3
ध्यान रहे कि * आमतौर पर dotfiles शामिल नहीं होंगे या 'डॉट-निर्देशिका' जब तक आप स्पष्ट रूप से निर्दिष्ट .*या.*.prj
ल्यूक

23

बस टाइप करें git resetयह वापस लौट आएगा और यह ऐसा है जैसे आपने git add .अपनी पिछली प्रतिबद्धताओं के बाद कभी टाइप नहीं किया । सुनिश्चित करें कि आपने पहले किया है।


जैसा कि होता है, एक अंतिम कमिटमेंट था ... लेकिन मैं विशेष रूप से कमेटी से हर फाइल को हटाने के बारे में पूछ रहा था, न कि कमेटी की हर फाइल के बारे में।
paxos1977

20

मान लीजिए कि मैं एक नई फ़ाइल बनाता हूं newFile.txt:

यहां छवि विवरण दर्ज करें

मान लीजिए कि मैं गलती से फ़ाइल जोड़ता हूं git add newFile.txt:

यहां छवि विवरण दर्ज करें

अब मैं प्रतिबद्ध होने से पहले, इस ऐड को पूर्ववत करना चाहता हूं git reset newFile.txt:

यहां छवि विवरण दर्ज करें


मान लीजिए मैं 1 चित्र पर हूं जिसका अर्थ है कि मैंने "git.add" भी नहीं किया है। इसके अलावा, मैं बिल्कुल नहीं चाहता कि यह सब बदलाव हो। मेरा मतलब है कि जब मैं git स्टेटस करता हूं, तो उसे कोई लाल फाइल नहीं दिखानी चाहिए। मेरा मतलब है कि यह सिंक में होना चाहिए जैसे कि पिछले गिट पुश के बाद एक भी फाइल नहीं बदली गई थी। उसे कैसे प्राप्त किया जा सकता है।
अटूट

तो मान लीजिए कि आप पहले कदम पर हैं। और आप अपने द्वारा किए गए सभी परिवर्तनों से छुटकारा पाना चाहते हैं जो लाल के रूप में आने के लिए "newFile.txt" बना रहा है।
अटूट

जब मैं git स्टेटस करता हूँ। मुझे बिल्कुल भी बदलाव नहीं देखना चाहिए। सभी लाल फ़ाइलों को वापस लौटना चाहिए।
अटूट

नमस्ते, मुझे लगता है कि आपका सवाल है कि वर्तमान पेड़ से अनट्रैक फ़ाइलों को कैसे हटाया जाए। उसके लिए, आप "git clean -f -d" का उपयोग कर सकते हैं। यह अप्रमाणित निर्देशिकाओं को भी हटा देगा।
विदुर मुदलगे

यदि आप अनट्रैक की गई फ़ाइलों को हटाना नहीं चाहते हैं, तो बस "-f" ध्वज को अनदेखा करें।
विदुर मुदलगे

19

एक विशिष्ट फ़ाइल के लिए:

  • git ने my_file.txt को रीसेट किया
  • git checkout my_file.txt

सभी जोड़ी गई फ़ाइलों के लिए:

  • गिट रीसेट।
  • गिट चेकआउट।

नोट: चेकआउट फ़ाइलों में कोड को बदलता है और अंतिम अद्यतन (प्रतिबद्ध) स्थिति में ले जाता है। रीसेट कोड नहीं बदलता है; यह सिर्फ हेडर को रीसेट करता है।


3
कृपया git reset <file>और के बीच का अंतर स्पष्ट करें git checkout <file>
ट्रेंट

1
रीसेट फ़ाइल को परिवर्तित नहीं करता है, बस इसे चरण से दूर रखें (= इंडेक्स, जहां इसे गिट ऐड द्वारा डाला गया था)
फ्रैंक

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

1
रीसेट = फ़ाइल को मंच से हटा दें हालांकि परिवर्तन अभी भी होगा। चेकआउट = रिपॉजिटरी से अपडेट की गई फ़ाइल को प्राप्त करता है और वर्तमान फ़ाइल को ओवरराइड कर देगा
इमाम बक्स

14

यह आदेश आपके परिवर्तनों को समाप्त कर देगा:

git reset HEAD filename.txt

आप भी उपयोग कर सकते हैं

git add -p 

फ़ाइलों के कुछ हिस्सों को जोड़ने के लिए।


14

इंटरैक्टिव मोड भी है:

git add -i

फ़ाइलों को जोड़ने के लिए विकल्प 3 चुनें। मेरे मामले में मैं अक्सर एक से अधिक फ़ाइल जोड़ना चाहता हूं, और इंटरैक्टिव मोड के साथ आप फ़ाइलों को जोड़ने के लिए इस तरह की संख्याओं का उपयोग कर सकते हैं। यह सब लेगा, लेकिन 4: 1, 2, 3 और 5

एक अनुक्रम चुनने के लिए, 1-5 को सभी 1 से 5 तक लेने के लिए टाइप करें।

मचान फ़ाइलें


"मुझे आश्चर्य है कि किसी ने भी इंटरेक्टिव मोड का उल्लेख नहीं किया " - उन्होंने किया: stackoverflow.com/a/10209776/1709587
मार्क एमी


10
git reset filename.txt

मौजूदा इंडेक्स, "प्रतिबद्ध होने के बारे में" क्षेत्र से फ़ाइलनाम नामक एक फ़ाइल को हटा देगा, बिना कुछ और बदले।


10

git add myfile.txt # यह आपकी फ़ाइल को प्रति-प्रतिबद्ध सूची में जोड़ देगा

इस आदेश के विपरीत काफी है,

git reset HEAD myfile.txt  # This will undo it.

तो, आप पिछले स्थिति में होंगे। निर्दिष्ट फिर से अनट्रैक सूची (पिछली स्थिति) में होगी।

यह आपके सिर को उस निर्दिष्ट फ़ाइल के साथ रीसेट कर देगा। इसलिए, यदि आपके सिर में इसका मतलब नहीं है, तो यह बस इसे रीसेट कर देगा।


9

Sourcetree में आप GUI के माध्यम से इसे आसानी से कर सकते हैं। आप देख सकते हैं कि कौन सी कमांड सॉरसेट्री किसी फ़ाइल को अनस्टेज करने के लिए उपयोग करती है।

मैंने एक नई फ़ाइल बनाई और इसे Git में जोड़ा। तब मैंने सॉर्सेट्री जीयूआई का उपयोग करके इसे अस्थिर कर दिया। यह परिणाम है:

अस्थिर फाइलें [08/12/15 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q - path / to / file / filename.java

Sourcetree resetनई फ़ाइलों को अस्थिर करने के लिए उपयोग करता है।


हां, सामान्य उपयोग के मामलों के लिए Git कमांड प्राप्त करने के लिए उसी तकनीक का उपयोग TortoiseGit के साथ किया जा सकता है ।
पीटर मोर्टेंसन

8
git reset filename.txt  

मौजूदा इंडेक्स, "प्रतिबद्ध होने के बारे में" क्षेत्र से फ़ाइलनाम नामक एक फ़ाइल को हटा देगा, बिना कुछ और बदले।


git रीसेट [फ़ाइल का नाम] पूर्व: git रीसेट src / main / java / com / dao / ImportCsvDataDaoImpl.java
रोहित चौरसिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.