आप अंतिम गिट जोड़ को पूर्ववत कैसे कर सकते हैं?


193

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

git add -- .

...के बजाय:

git checkout -- .

क्या यह प्रोग्रामर अब कुछ जादुई गिट कमांड के साथ अपने अंतिम बदलावों को अस्थिर कर सकता है ? या पहली बार प्रयोग करने से पहले उसे प्रतिबद्ध होना चाहिए था?


हे। हमें इससे एक उपयोगी प्रश्न और उत्तर मिला।
चरणवेद


मेरा मानना ​​है कि यह नकल नहीं है। अन्य प्रश्न में ओपी इसे पूर्ववत करने या इन फाइलों को कमिट से हटाने का तरीका पूछ रहा है। मैं चाहता हूं (ed) ठीक है और केवल पिछले git addकमांड के साथ जोड़े गए परिवर्तनों को पूर्ववत करने के लिए, विशेष रूप से उन फ़ाइलों के लिए जो पहले से ही परिवर्तन का मंचन किया था, और कुछ परिवर्तन थे जिन्हें पूर्ववत किया जाना था, मंचन नहीं किया गया। यह नहीं कह सकता कि अन्य प्रश्न हालांकि संबंधित नहीं है।
सेप्टाग्राम

1
शायद वह पहली जगह में प्रयोग करने से पहले / किया जाना चाहिए था।
Android.weasel

@ android.weasel हाँ, वह कई साल पहले की बात है ...
सेप्टाग्राम

जवाबों:


299

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

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

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


3
कितने उदास हैं। मुझे लगता है कि मेरी कमिटिंग प्रथाओं में कुछ गलत है। इस उत्तर को स्वीकार करना, क्योंकि आपने -pस्विच का उल्लेख किया है । धन्यवाद! :)
सेप्टाग्राम

उत्पन्न (मेरे लिए) त्रुटि: घातक: एक वैध रेफरी के रूप में 'हेड' को हल करने में विफल। मैंने अभी तक (नया रेपो) कुछ भी नहीं किया है। और इसे पछतावा हुआ। मैं संपूर्ण ऐड को रीसेट नहीं करना चाहता, सिर्फ एक निर्देशिका। git रीसेट - dir /*.* ऊपर त्रुटि उत्पन्न करता है।
फ्रांसिस डेवी

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

42

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

git reset

2
"आप नवीनतम गिट ऐड को पूर्ववत् नहीं कर सकते हैं": वाह, यह आश्चर्यजनक और संभावित रूप से दर्दनाक है। क्या इसके लिए कोई निश्चित स्रोत है? इसके अलावा, वहाँ एक अच्छा कारण यह होना चाहिए है? धन्यवाद!
एंड्रयू मॉयलन

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

15

तो असली जवाब है

क्या यह प्रोग्रामर अब कुछ जादुई गिट कमांड के साथ अपने अंतिम बदलावों को अस्थिर कर सकता है?

वास्तव में है: नहीं, आप केवल अंतिम नहीं जोड़ सकते हैं git add

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

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

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मदद नहीं करेगा, क्योंकि इसकी सबसे छोटी ग्रैन्युलैरिटी लाइनें हैं। gitपता नहीं है कि मध्यवर्ती राज्य के बारे में:

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

main() {
    foo(1337);
}

और भी।


मैंने एक नए git उपयोगकर्ता के रूप में वकालत की, यह वास्तव में एक महत्वपूर्ण अंतर है जो बताता है कि मेरे दोस्त "अच्छा चेकिन हाइजीन" होने के रूप में क्या वर्णन करते हैं ... मेरे व्यक्तिगत अनुभव - इसे "कारपूलिंग" (खराब!) के रूप में वर्णित किया गया था।
बेन


3

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

  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 --cached <file>
    
  • <file>पूरी तरह से काम की प्रतिलिपि और संस्करण से निकालें :

    git rm <file>
    

2

यदि आप कमिट के लिए सभी जोड़े गए फ़ाइलों को हटा देना चाहते हैं

git reset

यदि आप एक अलग फाइल को हटाना चाहते हैं

git rm <file>

1

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

git reset

हाल ही में जोड़ी गई स्थानीय फ़ाइलों को पूर्ववत करने के लिए

 git reset file_name

किसी विशिष्ट फ़ाइल के परिवर्तनों को पूर्ववत करने के लिए


0

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

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

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

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