Git पर पुराने कमिट मैसेज बदलें


136

मैं यहां बताए अनुसार एक पुराने प्रतिबद्ध संदेश को संपादित करने की कोशिश कर रहा था ।

बात यह है कि अब, जब मैं rebase -i HEAD~5इसे चलाने की कोशिश करता हूं तो यह कहता है interactive rebase already started

तो फिर मैं कोशिश करता हूं: git rebase --continueलेकिन यह त्रुटि मिली:

error: Ref refs/heads/master is at 7c1645b447a8ea86ee143dd08400710c419b945b but expected c7577b53d05c91026b9906b6d29c1cf44117d6ba
fatal: Cannot lock the ref 'refs/heads/master'.

कोई विचार?

जवाबों:


125

इसे कहते हैं:

जब आप संपादक से बचते हैं और बाहर निकलते हैं, तो यह आपको उस सूची में अंतिम बार वापस भेज देगा और आपको निम्नलिखित लिंक के साथ कमांड लाइन पर छोड़ देगा:

$ git rebase -i HEAD~3
Stopped at 7482e0d... updated the gemspec to hopefully work better
You can amend the commit now, with

इसका मतलब यह नहीं है:

फिर से टाइप करो git rebase -i HEAD~3

करने की कोशिश करो नहीं टाइपिंग git rebase -i HEAD~3जब संपादक से बाहर निकल रहा है, और यह ठीक काम करना चाहिए।
(अन्यथा, आपकी विशेष स्थिति में, git rebase -i --abortसब कुछ रीसेट करने और आपको फिर से प्रयास करने की अनुमति देने की आवश्यकता हो सकती है)


जैसा कि डेव वोग्ट ने टिप्पणी में उल्लेख किया है, पहली बार संशोधन करने के बादgit rebase --continue , आप रिबासिंग प्रक्रिया में अगले कार्य पर जाने के लिए हैं

इसके अलावा, ग्रेग Lind में उल्लेख है उसके जवाब rewordकी कमानgit rebase :

कमांड "पिक" को कमांड "एडिट" के साथ बदलकर, आप git rebaseउस कमिट को लागू करने के बाद बंद करने के लिए कह सकते हैं , ताकि आप फाइलों को संपादित कर सकें और / या कमिट मैसेज कर सकें, कमिट में संशोधन कर सकें और रिबासिंग जारी रख सकें।

यदि आप कमिट के लिए प्रतिबद्ध संदेश को संपादित करना चाहते हैंpickreword , तो Git1.6.6 (जनवरी 2010) के बाद से कमांड को " " कमांड के साथ " " बदलें

यह एक ही काम editकरता है ' ' एक इंटरैक्टिव रिबास के दौरान करता है, सिवाय इसके कि आप केवल शेल पर नियंत्रण वापस किए बिना प्रतिबद्ध संदेश को संपादित कर सकते हैं । यह अत्यंत उपयोगी है।
वर्तमान में यदि आप अपने प्रतिबद्ध संदेशों को साफ करना चाहते हैं:

$ git rebase -i next

फिर सभी कमिट्स को 'एडिट' के लिए सेट करें। फिर हर एक पर:

# Change the message in your editor.
$ git commit --amend
$ git rebase --continue

' reword' के बजाय ' ' का उपयोग editकरने से आप कॉल git-commitऔर git-rebaseकॉल छोड़ सकते हैं


2
इसके अलावा, git rebase --continueरिबेसिंग प्रक्रिया में अगला कार्य करने के लिए चला जाता है, के बाद आप पहली बार के लिए प्रतिबद्ध संशोधन किया है।
डेव वोग्ट

1
एक कमिट मैसेज बदलने के लिए github wiki लेख का लिंक जोड़ना
Joy

60

जैसा कि ग्रेग लिंड ने सुझाव दिया था, आप केवल उपयोग किए जाने वाले संदेश को बदलने के लिए संकेत दिए जाने के लिए reword का उपयोग कर सकते हैं (और कमिट को अन्यथा छोड़ दें):

git rebase -i HEAD~n

यहाँ, nअंतिम n कमिट की सूची है।

उदाहरण के लिए, यदि आप उपयोग करते हैं, तो आप git rebase -i HEAD~4कुछ इस तरह देख सकते हैं:

pick e459d80 Do xyz
pick 0459045 Do something
pick 90fdeab Do something else
pick facecaf Do abc

अब की जगह लेने के साथ reword करता आप संपादित करना चाहते हैं के संदेशों के लिए:

pick e459d80 Do xyz
reword 0459045 Do something
reword 90fdeab Do something else
pick facecaf Do abc

फ़ाइल को सहेजने के बाद संपादक से बाहर निकलें, और उसके बाद आपको उन संदेशों के लिए संदेशों को संपादित करने के लिए प्रेरित किया जाएगा जिन्हें आपने प्रति संदेश एक फ़ाइल में, पुन: चिह्नित किया था । ध्यान दें कि यह बहुत बस संपादित संदेशों प्रतिबद्ध करने के लिए सरल किया गया है होगा जब आप की जगह pickके साथ reword, लेकिन वह कर रही है कोई प्रभाव नहीं है।

कमिट मैसेज बदलने के लिए GitHub के पेज पर और जानें ।


बहुत अच्छी तरह से समझाया गया। साभार: D
शुभम जैन

धन्यवाद @ ShubhamJain खुश है कि मेरा जवाब उपयोगी था
पुनीत

मैंने ऐसा किया, और फिर मेरी शाखा में अन्य शाखाओं से दिखाई देता है
रेजा

@ रेज़ा आपने कुछ गड़बड़ कर दिया होगा। कुछ अन्य रेपो में यह प्रयास करें। यह समाधान पूरी तरह से काम करता है
पुनीत वारा

54

FWIW, git rebase इंटरैक्टिव में अब एक "reword" विकल्प है, जो इसे बहुत कम दर्दनाक बनाता है!


3
उपयोग करते समय reword, आप कमिट की सूची के साथ उस फ़ाइल में प्रतिबद्ध संदेशों को संपादित करने की अनुमति क्यों नहीं देते? इसके बजाय यह संपादक को प्रति rewordपंक्ति एक प्रतिबद्ध संदेश फ़ाइल के साथ लॉन्च करेगा । यह सिर्फ अनावश्यक है। यहां तक ​​कि अगर बाहरी कार्यों को शुरू करने pickया rewordकरने की आवश्यकता होती है, तो अन्य कार्यों की आवश्यकता rewordनहीं होगी।
डेन डैस्कलेस्कु

9

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

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

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

नवीनतम मास्टर से:

git checkout -b new-branch

फिर

git merge --squash problem-branch
git commit -m "new message" 

रेफरी: https://github.com/rotati/wiki/wiki/Git:-Combine-all-messy-commits-into-one-commit-before-merging-to-Master-branch


1
आपके जवाब ने वास्तव में मेरा दिन बचा लिया :)। मैं rebase -iलगभग 2 घंटे तक साथ रहा और कोई सफलता नहीं मिली। मेरी प्रतिबद्धता 18 कमिट्स के पीछे थी, इसलिए आप कल्पना कर सकते हैं। यह सरल और आसान तरीका था जो मुझे रिबास का उपयोग करने की आवश्यकता के बिना मिल सकता था। धन्यवाद दोस्त!
कार्लोस पारा

6

यहाँ एक बहुत अच्छा जिस्ट है जो सभी संभावित मामलों को कवर करता है: https://gist.github.com/nepsilon/156387acf9e1e72d48fa35c4fabef0b4

अवलोकन:

git rebase -i HEAD~X
# X is the number of commits to go back
# Move to the line of your commit, change pick into edit,
# then change your commit message:
git commit --amend
# Finish the rebase with:
git rebase --continue
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.