2012-08-26 11 views
154

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

git add -- . 

... के बजाय:

git checkout -- . 

इस प्रोग्रामर अब कुछ जादुई Git आदेश के साथ उनका अंतिम परिवर्तन unstage कर सकते हैं? या क्या वह पहले स्थान पर प्रयोग करने से पहले किया जाना चाहिए?

+14

हटाने "उह, * मुझे * यदि आप समझ में नहीं आता। यह एक और दोस्त था। कुछ मूर्ख प्रोग्रामर। हाँ, वह टिकट है। दूसरा आदमी। उसे। हे, हे। "[गले को साफ़ करता है] – Rap

+0

हे। हमें एक उपयोगी सवाल मिला और इसके जवाब में जवाब दिया गया। – steveha

+2

संभव डुप्लिकेट [पूर्ववत 'गिट एड' प्रतिबद्ध करने से पहले] (http://stackoverflow.com/questions/348170/undo-git-add-before-commit) –

उत्तर

260

। यह आपकी पिछली प्रतिबद्धता के बाद आपके द्वारा जोड़े गए सभी फ़ाइलों को 'अस्थिर' कर देगा।

यदि आप केवल कुछ फ़ाइलों को अस्थिर करना चाहते हैं, तो git reset -- <file 1> <file 2> <file n> का उपयोग करें।

git reset -p का उपयोग करके फ़ाइलों में कुछ बदलावों को अस्थिर करना संभव है।

+2

कितना दुखद है। मुझे लगता है कि मेरे कामकाजी प्रथाओं में कुछ गड़बड़ है। इस उत्तर को स्वीकार करते हुए, क्योंकि आपने '-p' स्विच का उल्लेख किया था। धन्यवाद! :) – Septagram

+0

उत्पन्न करता है (मेरे लिए) त्रुटि: घातक: 'HEAD' को वैध रेफरी के रूप में हल करने में विफल। मैंने अभी तक कुछ भी नहीं किया है (नया रेपो) अभी गिट एड किया है। और खेद है। मैं पूरे जोड़ को रीसेट नहीं करना चाहता, सिर्फ एक निर्देशिका। गिट रीसेट - dir /*.* उपरोक्त त्रुटि उत्पन्न करता है। –

+0

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

35

आप नवीनतम गिट एड को पूर्ववत नहीं कर सकते हैं, लेकिन आप अंतिम प्रतिबद्धता के बाद से सभी add एस पूर्ववत कर सकते हैं। एक तर्क प्रतिबद्ध बिना git reset सूचकांक रीसेट करता है (unstages परिवर्तन का मंचन किया):

git reset 
+2

"आप _latest_ git add को पूर्ववत नहीं कर सकते": वाह, यह आश्चर्यजनक और संभावित है दर्दनाक। क्या इसके लिए कोई निश्चित स्रोत है? इसके अलावा, क्या ऐसा कोई अच्छा कारण होना चाहिए? धन्यवाद! –

+0

@AndrewMoylan: ठीक है, ऐसा करने के लिए कोई _automatic_ तरीका नहीं है।आप हमेशा एक फ़ाइल को रीसेट कर सकते हैं, या एक विशिष्ट हंक को अस्थिर करने के लिए 'reset -p' का उपयोग कर सकते हैं। – knittl

5

आप git reset इस्तेमाल कर सकते हैं आप git reset उपयोग कर सकते हैं (docs देखें)

0

मुश्किल से आकार और पैमाने पर निर्भर करता है, तो आप एक स्क्रैच (अस्थायी) शाखा बना सकते हैं और वर्तमान कार्य को वहां कर सकते हैं।

फिर अपनी मूल शाखा पर स्विच करें और चेकआउट करें, और स्क्रैच प्रतिबद्ध से उपयुक्त फाइलें चुनें।

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

13

तो

Can this programmer now unstage his last changes with some magical git command?

को असली जवाब वास्तव में है: नहीं, आप केवल पिछले git add unstage नहीं कर सकते।

है कि अगर हम निम्नलिखित स्थिति में के रूप में प्रश्न की व्याख्या:

प्रारंभिक फ़ाइल:

void foo() { 

} 

main() { 
    foo(); 
} 

पहले परिवर्तन git add द्वारा पीछा किया:

void foo(int bar) { 
    print("$bar"); 
} 

main() { 
    foo(1337); 
} 

दूसरा परिवर्तन git add द्वारा पीछा किया :

void foo(int bar, String baz) { 
    print("$bar $baz"); 
} 

main() { 
    foo(1337, "h4x0r"); 
} 

इस मामले में, git reset -p मदद नहीं करेगा, क्योंकि इसकी सबसे छोटी ग्रैन्युलरिटी लाइनें हैं।किसी भी

void foo(int bar) { 
    print("$bar"); 
} 

main() { 
    foo(1337); 
} 

अधिक: git कि के मध्यवर्ती स्थिति के बारे में पता नहीं है।

2

तारीख Git पर संकेत देता है:

  1. use "git rm --cached <file>..." to unstage यदि फ़ाइलें रेपो में नहीं थे। यह उन्हें वहां रखने वाली फ़ाइलों को अनदेखा करता है।
  2. use "git reset HEAD <file>..." to unstage यदि फ़ाइलें रेपो में थीं, और आप उन्हें संशोधित के रूप में जोड़ रहे हैं। यह फ़ाइलों को उनके जैसा रखता है, और उन्हें अस्थिर करता है।

मेरे ज्ञान पर आप git add -- पूर्ववत नहीं कर सकते हैं लेकिन आप उपरोक्त वर्णित फ़ाइलों की एक सूची को अस्थिर कर सकते हैं।

2
  • सूचकांक से फ़ाइल निकालें, लेकिन यह संस्करणीकृत और काम के पिछले भाग में अप्रतिबद्ध परिवर्तन के साथ छोड़ दिया रखें:

    git reset head <file> 
    
  • HEAD, नाश परिवर्तन और उन्हें निकालने से पिछले राज्य करने के लिए फ़ाइल रीसेट सूचकांक से:

    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 <file> 
    
1
:

git rm --cached <file> 
  • प्रतिलिपि काम कर रहा है और पूरी तरह वर्ज़निंग से <file> निकालें

    यदि आप को गिट से सभी अतिरिक्त फ़ाइलों को हटाएं

    git reset 
    

    आप चाहते हैं किसी एक फ़ाइल

    git rm <file> 
    
  • संबंधित मुद्दे