किसी मिस्ड फ़ाइल को शामिल करने के लिए पिछले प्रतिबद्ध को कैसे बदलें?


98

मैंने एक परिवर्तन किया है और परिवर्तन सेट में एक फ़ाइल जोड़ना भूल गया हूँ। अन्य कमिट के बाद, मुझे एहसास हुआ कि फाइल अब एक HEAD^4कमिट से गायब है ।

लापता फ़ाइल को शामिल करने के लिए मैं पिछली प्रतिबद्धता को कैसे फिर से लिखूंगा?


क्या आपने इन 4 कमिटों को आगे बढ़ाया?
एमवीपी

@ mvp नहीं, वे केवल मेरे स्थानीय गिट रिपॉजिटरी पर हैं।
कोली

जवाबों:


54

जिस संशोधन के लिए आप संशोधन करना चाहते हैं, उसके लिए विकल्प का उपयोग करें git rebase --interactive HEAD~4और सेट करें edit

याद रखें कि आपको इस तरह से दूरस्थ रिपॉजिटरी में धकेल दिए गए कमिट को संशोधित नहीं करना चाहिए । उस मामले में लापता फ़ाइल के साथ एक नई प्रतिबद्धता जोड़ना बेहतर है।


धन्यवाद। अगर मैं रिमोट रेपो का एकमात्र उपयोगकर्ता हूं तो भी क्या यह मामला है? क्या मुझे यह करने की अनुमति नहीं होगी git push -fयदि मुझे यकीन है कि अपस्ट्रीम में बदलाव नहीं हुआ है?
कोली

1
यदि आप रिमोट रेपो के एकमात्र उपयोगकर्ता हैं तो जबरन धक्का देना ठीक है।
राफेल रॉकी

7
मुझे लगता है कि ये निर्देश पर्याप्त विस्तृत नहीं हैं। इसे पहली बार आजमाने पर मुझे बताया गया "रिजेक्ट नहीं किया जा सकता: आपके इंडेक्स में अनकैप्ड बदलाव होते हैं।" मेरे पास पहले से ही addगायब फाइलें हैं, इसलिए मैंने संदेश के रूप में "xxx" के साथ एक कमिट किया। फिर मैंने रिबास कमांड किया, और "xxx" कमिटमेंट को "पिक" से "एडिट" में बदल दिया। फिर मैंने "गिट रिबेस - कॉन्टिन्यू" किया। अब जब मैं इतिहास को देखता हूं तो मेरे पास नवीनतम कमिट के रूप में "xxx" है, और पहले वाली कमिटमेंट मैं उन्हें जोड़ना चाहता हूं जो अपरिवर्तित है! मुझे आश्चर्य है कि मेरी गलती कहाँ थी?
डैरेन कुक

2
अंतिम प्रतिबद्ध को स्क्वीज करने से फ़ाइल को HEAD ~ 4 में नहीं रखा जाएगा।
जस्टिन

1
git एड संपादित करें; git प्रतिबद्ध -m "ब्लाह"; git rebase -i HEAD ~ 5; // के रूप में अब नई प्रतिबद्ध जोड़ा गया है, इसलिए हमें 4 के बजाय 5 के साथ रिबास करने की आवश्यकता थी। अब "ब्लाह" को दूसरी पंक्ति में ले जाएं और इसे "पिक" से "एस" (स्क्वैश) में बदल दें, जो एचएएडी ~ के साथ प्रतिबद्ध होगा 5 के रूप में आदेशों को ऊपर से नीचे तक निष्पादित किया जाता है
zstring

274

मुझे पता है कि लोग Google और यहां आकर एक सरल उत्तर पा सकते हैं: अगर यह अंतिम प्रतिबद्धता थी तो क्या होगा? (ओपी का सवाल इतिहास में 4 वीं प्रतिबद्धता को ठीक करने के लिए है)

आपके द्वारा किए गए मामले में और आपको एहसास है कि आप तुरंत कुछ फ़ाइल जोड़ना भूल गए हैं , बस:

# edited file-that-i-remember.txt
git add file-that-i-remember.txt
git commit

# realize you forgot a file
git add file-that-i-forgot.txt
git commit --amend --no-edit

--no-editवही कमिट मैसेज कहां रखेगा।

बहुत आसान!


21
यह उत्तर है।
एडम बिट्टलिंगमेयर

5
अगर कमिट्स को रिमोट से पुश नहीं किया जाता है, तो उल्लेख करना बेहतर होगा।
राम पात्रा

1
हां, टिप्पणियों में यहां ध्यान देने योग्य है: यह पुश से पहले उपयोग करने के लिए है । इशारा करने के लिए धन्यवाद।
डॉ। बीईओ

2
एक सूचना यह है कि पहले और बाद --amendमें अलग-अलग हैश
कमलेक्सएक्स

6
धन्यवाद, लेकिन यह नहीं हो सकता: ओपी ने पूछा HEAD^4। यह ठीक है जिस तरह से यह है, बस संदर्भ के लिए एक परिशिष्ट के रूप में। ;)
डॉ। बिको

11

यदि आपने इन 4 कमिटों को नहीं धकेला है, तो आप इसे निम्न प्रकार से कर सकते हैं:

इन सभी हिट के लिए पैच फाइल बनाएं:

git format-patch -4

4 कमिट द्वारा वापस जाएं:

git reset --hard HEAD~4

अनुपलब्ध फ़ाइल जोड़ें:

git add missing-file

इसके साथ करें --amend:

git commit --amend

सभी सहेजे गए पैच वापस लागू करें:

git am *.patch

यदि आपने धक्का दिया है, तो आपको इस विधि का उपयोग नहीं करना चाहिए। इसके बजाय, बस अपने दोष को स्वीकार करें और HEAD के शीर्ष पर एक और प्रतिबद्ध बनाएं जो इस समस्या को ठीक करता है।


यदि आप इस चरण-दर-चरण करना चाहते हैं, तो संशोधित करने के बाद चेरी-पिक करना आसान है, उन्हें पैच के रूप में निर्यात करना।
राफेल रॉकी

1
यह स्वाद का मामला है। मुझे पसंद है git format-patch/ git amबहुत बेहतर। सबसे महत्वपूर्ण बात यह है कि अगर आप किसी चीज को खराब करते हैं तो यह आपको अधिक आत्मविश्वास देता है - भौतिक फ़ाइल में पैच के रूप में सहेजा गया आपका सबसे अच्छा सुरक्षा जाल है।
एमवीपी

वास्तविक आत्मविश्वास वास्तव में निहित है, कि जब आप एक रिपॉजिटरी पर काम करते हैं तो आप कभी भी किसी चीज को नहीं हटाते हैं। जब तक आप दौड़ते हैं, तब तक पुराने उपलब्ध हैं git gc:)
राफेल रॉकी

यह आपके और मेरे लिए तुच्छ और स्पष्ट है। लेकिन, उपयोगकर्ता के लिए जो अभी शुरू हो रहा है और शायद गिट के बारे में कुछ भी नहीं समझता है - यह तथ्य बिल्कुल स्पष्ट नहीं है।
एमवीपी

2
ये निर्देश लंबे समय से घुमावदार थे, लेकिन काफी सरल और पालन करने में आसान थे। धन्यवाद। : (मैं सिर्फ एक अंतिम कदम जोड़ना होगा rm *.patch)
डैरेन कुक

9

यद्यपि स्वीकृत उत्तर सही है, फिर भी यह विस्तृत निर्देश का अभाव है कि एक रिबेस प्रक्रिया के दौरान किसी संपादन को कैसे निष्पादित किया जाए।

  • सबसे पहले, एक रिबास प्रक्रिया शुरू करें:

    git rebase --interactive HEAD~4
    
  • कमिट की एक सूची प्रस्तुत की जाएगी, एक प्रतिबद्ध चुनें जिसे आप शब्द pickको editफ़ाइल में बदलकर संपादित करना चाहते हैं ।

  • अपने कोड में आवश्यक संशोधन करें ( git addनई फाइलों के लिए आह्वान करना याद रखें )

  • सभी संशोधन किए जाने के बाद, मुद्दा git commit --amend- यह एक प्रतिबद्ध के रूप में चिह्नित संशोधन करेगाedit

  • आह्वान करें git rebase --continueकि प्रक्रिया समाप्त हो जाएगी (यदि इसके रूप में चिह्नित अधिक हिट हैं edit, तो उपरोक्त चरणों को दोहराया जाना चाहिए)

महत्वपूर्ण लेख:

  • उन पंक्तियों को न हटाएं pickजिन्हें आप संपादित नहीं करना चाहते हैं - उन्हें वैसे ही छोड़ दें। इन लाइनों को हटाने से संबंधित कमिट्स को हटा दिया जाएगा

  • stashयदि आपकी वर्किंग डाइरेक्टरी साफ़ नहीं है, तो GIT आपको रिबास करने से पहले मजबूर करता है ; हालांकि git stash pop / git stash apply, इन परिवर्तनों को संशोधित करने के लिए आप रिबेस के दौरान कर सकते हैं (जैसे कि रिबेस प्रक्रिया शुरू करने से पहले स्टैक्ड हो गए) एक कमिट के रूप में चिह्नित किए गएedit

  • अगर कुछ गलत हो गया है और आप रिबास प्रक्रिया के दौरान किए गए बदलावों को वापस करना चाहते हैं, तो इसे समाप्त करने से पहले (यानी आप रिबास शुरू करने से पहले बिंदु पर वापस लौटना चाहते हैं), का उपयोग करें git rebase --abort- यह भी पढ़ें: एक इंटरैक्टिव रिबेट को रद्द कैसे करें यदि --abort doesn ' टी काम?

  • जैसा कि स्वीकृत उत्तर में कहा गया है:

    याद रखें कि आपको इस तरह से दूरस्थ रिपॉजिटरी में धकेल दिए गए कमिट को संशोधित नहीं करना चाहिए। उस मामले में लापता फ़ाइल के साथ एक नई प्रतिबद्धता जोड़ना बेहतर है।

    क्यों, इसका उत्तर Git Book में है (पैराग्राफ " रिबासिंग का शीर्षक "):

    अपने रिपॉजिटरी के बाहर मौजूद कमिट्स को दोबारा न करें।

    यदि आप उस दिशानिर्देश का पालन करते हैं, तो आप ठीक हो जाएंगे। यदि आप नहीं करते हैं, तो लोग आपसे घृणा करेंगे, और आप दोस्तों और परिवार के लोगों से घृणा करेंगे।

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

    [...]

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