मौजूदा, अप्रकाशित प्रतिबद्ध संदेशों को कैसे संशोधित करें?


7664

मैंने एक गलत संदेश में गलत बात लिखी।

मैं संदेश कैसे बदल सकता हूं? अभी तक कमिटमेंट को आगे नहीं बढ़ाया गया है।


868
उन लोगों के लिए कुछ नया करने के लिए: लॉरी के बारे में अभी तक धक्का नहीं दिया है महत्वपूर्ण है। रिबासिंग की तरह, यह इतिहास बदल रहा है। यदि किसी ने मूल और पुनर्लेखन के इतिहास के बीच अपने रेपो से क्लोन / खींच लिया है तो वे फिर से लिखने के बाद (उस शाखा के लिए) खींचने में सक्षम नहीं होंगे।
पैट नोट्ज़

जवाबों:


16120

सबसे हालिया संदेश भेजना

git commit --amend

आपके संपादक को खोल देगा, जिससे आप सबसे हालिया प्रतिबद्ध संदेश को बदल सकते हैं। इसके अतिरिक्त, आप कमांड लाइन में सीधे संदेश भेज सकते हैं:

git commit --amend -m "New commit message"

… हालाँकि, यह बहु-पंक्ति प्रतिबद्ध संदेश या छोटे सुधार को अधिक बोझिल बना सकता है।

सुनिश्चित करें कि आप किसी भी कार्य की नकल परिवर्तन की जरूरत नहीं है का मंचन किया ऐसा करने से पहले या वे बहुत प्रतिबद्ध हो जाएगा। ( बिना परिवर्तन किए हुए परिवर्तन प्रतिबद्ध नहीं होंगे।)

एक ऐसे संदेश का संदेश बदलना जो आपने पहले ही अपनी दूरस्थ शाखा में धकेल दिया है

यदि आपने पहले ही अपनी प्रतिबद्ध शाखा को अपनी दूरस्थ शाखा में धकेल दिया है, तो - स्थानीय रूप से अपनी प्रतिबद्धता में संशोधन करने के बाद (जैसा कि ऊपर बताया गया है) - आपको कमिट को बल देने की भी आवश्यकता होगी :

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

चेतावनी: बल-धक्का आपके स्थानीय एक की स्थिति के साथ दूरस्थ शाखा को अधिलेखित कर देगा । यदि आपके स्थानीय शाखा में आपके पास दूरस्थ शाखा नहीं है, तो आप उन आवागमन को खो देंगे।

चेतावनी: संशोधन के बारे में सतर्क रहें कि आप पहले से ही अन्य लोगों के साथ साझा कर चुके हैं। संशोधित करना अनिवार्य रूप से उन्हें अलग-अलग SHA ID करने के लिए फिर से लिखता है , जो एक समस्या बनती है अगर अन्य लोगों की पुरानी प्रतिबद्धताओं की प्रतियां हैं जिन्हें आपने फिर से लिखा है। जिस किसी के पास पुरानी कमेटी की कॉपी है, उसे आपके नए री-लिखित कमिटमेंट के साथ अपने काम को सिंक्रोनाइज़ करना होगा, जो कभी-कभी मुश्किल हो सकता है, इसलिए यह सुनिश्चित करें कि जब आप साझा कमिट हिस्ट्री को दोबारा लिखने की कोशिश कर रहे हों, या फिर साझा किए गए रिट्वीट्स को लिखने से बचें। कुल मिलाकर।


एक इंटरैक्टिव रिबेस करें

एक अन्य विकल्प इंटरैक्टिव रिबेस का उपयोग करना है। यह आपको किसी भी संदेश को संपादित करने की अनुमति देता है, भले ही वह नवीनतम संदेश न हो।

गिट स्क्वैश करने के लिए, इन चरणों का पालन करें:

// n is the number of commits up to the last commit you want to be able to edit
git rebase -i HEAD~n

एक बार जब आप अपना कमिट स्क्वैश करते हैं - e/rसंदेश संपादित करने के लिए चुनें :

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

इंटरैक्टिव रिबेस के बारे में महत्वपूर्ण नोट

जब आप उपयोग करते हैं तो n कमिट से अधिकgit rebase -i HEAD~n हो सकते हैं । Git अंतिम n कमिट्स में सभी कमिट्स को "कलेक्ट" करेगा, और अगर उस रेंज के बीच में कहीं मर्ज था तो आप सभी कमिट्स को भी देखेंगे, इसलिए परिणाम n + होगा।

अच्छा सुझाव:

यदि आपको इसे एक से अधिक शाखा के लिए करना है और सामग्री में संशोधन करते समय आपको संघर्षों का सामना करना पड़ सकता है, तो सेट करें git rerereऔर Git को आपके लिए स्वचालित रूप से उन विरोधों को हल करने दें।


प्रलेखन


257
हालांकि के git commit --amendरूप में के रूप में शक्तिशाली नहीं है git rebase -i
जेफरी जोस

76
@ जेफजोस, यह निश्चित रूप से होने की आवश्यकता नहीं है। इसके अलावा, git commit --amend(ए?) मास्टर कमिट को ठीक कर सकते हैं।
स्ट्रगलर

116
यदि आपने पहले ही धक्का दे दिया है, तो बस फिर से जोर git push -f origin branchname
लगाएं

177
git push -fयदि अन्य लोग उसी रिपॉजिटरी का उपयोग कर रहे हैं तो @hughes थोड़ा खतरनाक नहीं है?
आर्मंड

91
यदि आप संपूर्ण प्रतिबद्ध संदेश को फिर से लिखना नहीं चाहते हैं, तो जाएं git commit --amend -c HEAD। यह संपादक को आपके पुराने प्रतिबद्ध संदेश के साथ पूर्व-आबादी वाला खोल देगा, ताकि आप इसे बदल सकें।
सैम

2506
git commit --amend -m "your new message"

7
मैंने कमिट किया --amend -m "New message", लेकिन Github पर जोर देने से "पुश करने से पहले रिमोट में बदलाव को मर्ज" किया। खींचने के बाद, कमिट करें, और फिर से पुश करें, नया संदेश प्रकट नहीं होता है। इसके बजाय मेरे पास github.com: "डाइमरेपो] की" मर्ज ब्रांच 'है। "
डेव एवरिट

8
@DaveEveritt ने इसे ठीक करने का प्रयास करने से पहले आपकी संभावना को अपनी ओर धकेल दिया।
थोरबजोरन राव एंडरसन

12
@Kyralessa सच नहीं है। बैश में आप आसानी से बहुस्तरीय प्रतिबद्ध संदेश लिख सकते हैं जब तक कि आप उद्धरण को पूरा न कर लें (जब तक कि उद्धरण के भीतर प्रत्येक पंक्ति के अंत में वापसी न करें)।
hobs

32
मुझे यह नहीं सूझा कि एक उत्तर जो केवल दो साल पहले लिखे गए उत्तर के मुख्य विचार की तरह दिखता है और स्वीकृत उत्तर को भी कई वोट मिलते हैं। अजीब। (हालांकि जवाब में कुछ भी गलत नहीं है)
खुश कॉडर

7
@ आलमुराली, कु। मेरी बात न तो सवाल की लोकप्रियता के बारे में थी, न ही उत्तर की उपयोगिता के बारे में। लेकिन यह विशेष उत्तर सबसे पुराना उत्तर नहीं है, और न ही यह स्वीकृत उत्तर में कोई और जानकारी देता है। यह स्वीकृत उत्तर के एक भाग की प्रति प्रतीत होती है। वह मेरी बात थी। चीयर्स!
खुश कोडर

2376

यदि आप जिस समस्या को ठीक करना चाहते हैं वह सबसे हाल का नहीं है:

  1. git rebase --interactive $parent_of_flawed_commit

    यदि आप कई त्रुटिपूर्ण आवागमन ठीक करना चाहते हैं, तो उनमें से सबसे पुराने माता-पिता को पास करें।

  2. आपके द्वारा दिए गए सभी कमिट की सूची के साथ एक संपादक सामने आएगा।

    1. बदलें pickकरने के लिए reword(या पुराने के लिए Git के संस्करणों, पर edit) किसी भी करता आप ठीक करना चाहते हैं के सामने।
    2. एक बार जब आप बचत करते हैं, तो Git सूचीबद्ध कमानों को फिर से दिखाएगा।

  3. प्रत्येक कमिट के लिए जिसे आप पुन: लिखना चाहते हैं , Git आपको अपने संपादक में वापस छोड़ देगा। प्रत्येक उस कमिट के लिए जिसे आप संपादित करना चाहते हैं , Git आपको शेल में छोड़ देता है। यदि आप शेल में हैं:

    1. अपनी पसंद के अनुसार किसी भी तरह से कमिट बदलें।
    2. git commit --amend
    3. git rebase --continue

इस क्रम के अधिकांश आपको विभिन्न कमांड के आउटपुट द्वारा समझाया जाएगा जैसे आप जाते हैं। यह बहुत आसान है; आपको इसे याद करने की आवश्यकता नहीं है - बस याद रखें कि git rebase --interactiveआपको सही तरीके से कमिट करने देता है चाहे वे कितने समय पहले थे।


ध्यान दें कि आप उन बदलावों को बदलना नहीं चाहेंगे जिन्हें आपने पहले ही धकेल दिया है। या हो सकता है कि आप करते हों, लेकिन उस स्थिति में आपको उन सभी के साथ संवाद करने में बहुत सावधानी बरतनी होगी, जिन्होंने आपके कमिट को खींचा होगा और उनमें से शीर्ष पर काम किया होगा। किसी को रिबास या किसी प्रकाशित शाखा को रीसेट करने के बाद मैं कैसे पुनर्प्राप्त / पुन: सिंक्रनाइज़ कर सकता हूं?


39
क्या कोई पहली कमिट का संदेश बदल सकता है (जिसके पास माता-पिता नहीं हैं)?
13

27
इसका उल्लेख अन्य उत्तरों में से एक में किया गया है, लेकिन मैं यहां इसका ध्यान रखूंगा। 1.6.6 git के बाद से आप लॉग संदेश को संपादित करने rewordके pickलिए उपयोग कर सकते हैं ।
मितमरो

89
संयोग से, $parent_of_flawed_commitके बराबर है $flawed_commit^
पीजा नं

67
कभी भी ऐसा न करें (या सामान्य रूप से छूट) यदि आपने पहले ही ऊपर की ओर धकेल दिया है!
डेनियल रिंसर

20
उपयोग -p( --preserve-merges) दोषपूर्ण प्रतिबद्ध के बाद एक मर्ज था।
12 को आह्वान किया

778

पिछली प्रतिबद्धताओं में संशोधन करने के लिए, वे परिवर्तन करें जिन्हें आप चाहते हैं और उन परिवर्तनों को चरणबद्ध करें, और फिर चलाएं

git commit --amend

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

पिछली प्रतिबद्धता में संशोधन करने के लिए और एक ही लॉग संदेश रखें, चलाएं

git commit --amend -C HEAD

इसे पूरी तरह से हटाकर पिछले प्रतिबद्ध को ठीक करने के लिए, चलाएं

git reset --hard HEAD^

यदि आप एक से अधिक प्रतिबद्ध संदेश संपादित करना चाहते हैं, तो चलाएं

git rebase -i HEAD~commit_count

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

git commit --amend
git rebase --continue

नोट: आपके द्वारा खोले गए संपादक से "आप जो चाहें बदलाव करें" भी कर सकते हैं git commit --amend


18
git rebase -i HEAD~commit_countहालाँकि, आपको अपने द्वारा चुने गए कई कमिट्स के प्रतिबद्ध संदेशों को बदलने की अनुमति देगा। बस चुने हुए कमिट्स को "पिक" के बजाय "reword" के रूप में चिह्नित करें।
जो

2
क्या होगा अगर आप रिबास नहीं करना चाहते हैं? आप सिर्फ एक पुराने संदेश को बदलना चाहते हैं?
सुपरयूपरड्यूपर

3
git reset --hardअनचाहे परिवर्तनों को मिटा देता है। कृपया के --hardसाथ बदलें --soft
ईल घीज

1
सहमत, git reset --hardएक पूरी तरह से वैध आदेश है, लेकिन यह प्रश्न को देखते हुए भ्रामक है। --hardयदि आप उन परिवर्तनों को करते हैं जो आप फेंकना चाहते हैं, तो आप उपयोग करते हैं, न कि यदि आपने प्रतिबद्ध संदेश में टाइपो बनाया है!
सोरेन ब्योर्नस्टैड

398

जैसा कि पहले ही उल्लेख किया गया है, git commit --amendअंतिम प्रतिबद्ध को अधिलेखित करने का तरीका है। एक नोट: यदि आप फ़ाइलों को अधिलेखित करना चाहते हैं , तो कमांड होगी

git commit -a --amend -m "My new commit message"

4
और अगर आप सब कुछ जोड़ने के लिए नहीं करना चाहते हैं, तो आपको पहले कर सकते हैं git add file.extतो बसgit commit --amend
MalcolmOcean

358

आप उसके लिए भी उपयोग कर सकते हैं git filter-branch

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

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

ध्यान दें कि यह हर प्रतिबद्ध HEADऔर त्रुटिपूर्ण प्रतिबद्ध के बीच फिर से लिखने की कोशिश करेगा , इसलिए आपको अपनी msg-filterआज्ञा बहुत बुद्धिमानी से चुननी चाहिए;


4
क्या इस का एक संस्करण है जो अगर रीगेक्स को कुछ भी नहीं मिलता है, तो प्रतिबद्ध को नहीं बदलता है?
sjakubowski

3
AFAIK फ़िल्टर-शाखा --msg- फ़िल्टर किसी भी मामले में नए कमिट उत्पन्न करेगा। हालाँकि, आप संदेश-फ़िल्टर के भीतर जाँच कर सकते हैं, अगर sed सफल हुआ और इस जानकारी का उपयोग तब करें जब फ़िल्टर-शाखा ऑपरेशन आपके पेड़ को refs / मूल में रीसेट कर दे।
मार्क

4
@DavidHogue फ़िल्टर-शाखा पद्धति का उपयोग करते समय यह केवल सत्य है। यदि आप इंटरेक्टिव रीबेस का उपयोग करते हैं तो संशोधित कमिट के बाद कमिट आईडी नहीं बदलती है।
मार्क

6
@ मर्क हाँ वे करते हैं, वे करने के लिए आवश्यक हैं। प्रतिबद्ध आईडी पिछले कमिट पर निर्भर हैं। यदि वे नहीं बदले, तो गिट बेकार हो जाएगा।
मील्स राउत

2
आपको चाहिए $flawed_commit^..HEAD, नहीं $flawed_commit..HEAD। जैसा कि मैन पेज द्वारा कहा गया है: « कमांड कमांड लाइन में उल्लिखित सकारात्मक रीफ्स को फिर से लिखेगी (जैसे कि यदि आप a..b पास करते हैं, तो केवल बी को फिर से लिखा जाएगा)। »
एंजेल

319

मैं इस तरह से पसंद करता हूं:

git commit --amend -c <commit ID>

अन्यथा, एक नई प्रतिबद्ध आईडी के साथ एक नई प्रतिबद्धता होगी।


7
मेरे लिए, ऊपर दिए गए आपके आदेश का उपयोग वास्तव में एक नई प्रतिबद्ध आईडी के साथ एक नई प्रतिबद्ध बनाता है और एक अतिरिक्त प्रतिबद्ध कह रहा है "डिफ़ॉल्ट शाखा के रूप में" विलय शाखा।
Jan

46
संशोधन हमेशा एक नई प्रतिबद्ध आईडी के साथ एक नई प्रतिबद्ध बनाता है। प्रतिबद्ध आईडी प्रतिबद्ध संदेश और लेखक / प्रतिबद्ध टाइमस्टैम्प सहित, सामग्री की SHA हैश है। यह Git की एक विशेषता है, जो हैश टकरावों को रोकती है, यह सुनिश्चित करती है कि एक ही ID के साथ दो कमिट बिल्कुल समान सामग्री, इतिहास और इसी तरह के कमिट हों।
एमिल लुंडबर्ग

7
एमिल से सहमत। इसके अतिरिक्त, डॉक्स को पढ़ते हुए - ऐसा लगता है कि सभी "-सी" करता है, जो कि आपके नए कमिट के लिए डिफ़ॉल्ट / टेम्प्लेट के रूप में उपयोग करने के लिए किस संदेश का संदेश है। , इसलिए इसे निर्दिष्ट करने की आवश्यकता नहीं है।
गैल

2
-cकुछ काम करता है। यह डिफ़ॉल्ट रूप से पुराने संदेश का उपयोग करता है, लेकिन यह लेखक की जानकारी (व्यक्ति और समय) को भी कॉपी करता है। -Cएक ही बात करता है सिवाय इसके कि यह आपको संदेश को संपादित करने के लिए नहीं कहता है।
जोसेफ के। स्ट्रॉस

1
@SantanuDey की तरह, यह मेरे लिए काम नहीं करता था। मुझे मिल गयाfatal: Option -m cannot be combined with -c/-C/-F/--fixup.
एंड्रयू ग्रिम

312

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

या कंसोल / टर्मिनल से इस कमांड का उपयोग करें:

git commit -a --amend -m "My new commit message"

4
यह उत्तर शाब्दिक रूप से इस पुराने के समान है । क्या आपने किसी दूसरे को सप्लाई करने से पहले मौजूदा उत्तरों की जाँच की है?
डेन डैस्कलेस्कु

284

आप गिट रीबासिंग का उपयोग कर सकते हैं । उदाहरण के लिए, यदि आप bbc643cd को वापस करने के लिए संशोधित करना चाहते हैं, तो चलाएं

$ git rebase bbc643cd^ --interactive

डिफ़ॉल्ट संपादक में, लाइन में 'पिक' को 'एडिट' में संशोधित करें, जिसके लिए आप संशोधित करना चाहते हैं। अपने परिवर्तन करें और फिर उनके साथ मंचित करें

$ git add <filepattern>

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

$ git commit --amend

प्रतिबद्ध को संशोधित करने के लिए, और उसके बाद

$ git rebase --continue

वापस पिछले सिर पर वापस जाने के लिए।


1
यदि आप यह सुनिश्चित करना चाहते हैं कि आपके द्वारा लिए गए परिवर्तन से git commit --amendआप उपयोग कर सकते हैं git showऔर यह नया संदेश दिखाएगा।
स्टीव टाबर

279
  1. यदि आप केवल अपने अंतिम प्रतिबद्ध संदेश को संशोधित करना चाहते हैं, तो करें:

    git commit --amend
    

जो आपको अपने पाठ संपादक में छोड़ देगा और आपको अंतिम प्रतिबद्ध संदेश को बदलने देगा।

  1. यदि आप अंतिम तीन प्रतिबद्ध संदेश या उस बिंदु तक कोई भी प्रतिबद्ध संदेश बदलना चाहते हैं, HEAD~3तो git rebase -iकमांड को आपूर्ति करें :

    git rebase -i HEAD~3
    

6
यह पहले के जवाब पहले से ही कहता है कि आप उपयोग कर सकते हैं git commit --amend, और यह भी कहता है कि आप उपयोग कर सकते हैं git rebase -i HEAD~commit_count, तुम सब किया था में प्लग था 3के लिए commit_count

साथ ही नीचे उतरे। लोग मौजूदा उत्तरों को पढ़ने की जहमत नहीं उठाते ।
डेन डैस्कलेस्क्यू

261

यदि आपको कई शाखाओं पर एक पुराना प्रतिबद्ध संदेश बदलना है (यानी, गलत संदेश के साथ प्रतिबद्ध कई शाखाओं में मौजूद है) जिसका आप उपयोग करना चाहते हैं:

git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all

Git पुनर्लेखन के लिए एक अस्थायी निर्देशिका बनाएगा और इसके अतिरिक्त बैकअप पुराने संदर्भों में आएगा refs/original/

  • -fऑपरेशन के निष्पादन को लागू करेगा। यह आवश्यक है यदि अस्थायी निर्देशिका पहले से मौजूद है या यदि पहले से ही संग्रहीत संदर्भ हैं refs/original। यदि ऐसा नहीं है, तो आप इस ध्वज को गिरा सकते हैं।

  • -- संशोधन विकल्प से फ़िल्टर-शाखा विकल्प अलग करता है।

  • --allयह सुनिश्चित करेगा कि सभी शाखाएँ और टैग पुनः लिखे जाएँ।

अपने पुराने संदर्भों के बैकअप के कारण, आप कमांड निष्पादित करने से पहले आसानी से वापस जा सकते हैं।

कहो, आप अपने स्वामी को पुनर्प्राप्त करना चाहते हैं और उसकी शाखा में पहुँचना चाहते हैं old_master:

git checkout -b old_master refs/original/refs/heads/master

3
यह उत्तर ओपी के प्रश्न को संबोधित नहीं करता है, क्योंकि वे शुद्ध रूप से एक प्रतिबद्ध को ठीक करने में रुचि रखते हैं जो उन्होंने केवल किया है। मैं नियमित रूप से उपयोग git commit --amendकी टिप्पणियां अप को ठीक करने या फ़ाइलों मैं भूल गया जोड़ने के लिए git addहै, लेकिन केवल कभी इससे पहले कि मैं गया है git pushएड। मैं भी उपयोग करता git filter-branchहूं जब मैं पूरी तरह से संस्करण इतिहास के साथ गड़बड़ करना चाहता हूं, लेकिन ओपी यह नहीं चाहता है, इसलिए इस जवाब को एक बड़ी स्वास्थ्य चेतावनी की आवश्यकता है - घर पर इस कोशिश मत करो, झांकना !!
कोबरा

226

उपयोग

git commit --amend

इसे विस्तार से समझने के लिए, एक उत्कृष्ट पोस्ट है 4. रिट्रींग गिट हिस्ट्री । यह भी जब उपयोग नहीं करने के बारे में बात करता है git commit --amend


2
क्या पहले से ही सार्वजनिक रिपॉजिटरी में भेजे गए संदेशों को ठीक करने का एक अच्छा तरीका है? अब तक मैं इस निष्कर्ष पर पहुंचा हूं कि, एक बार धक्का देने पर, मेरे प्रतिबद्ध संदेश टाइपो और थिंकोस को हमेशा के लिए जीना होगा।
स्टिकंडरफ़्लो

2
एक शब्द में, NOPE! आपके द्वारा धक्का दिए गए कुछ को वापस लेने का कोई अच्छा तरीका नहीं है। सभी प्रत्यावर्तन अधिक या कम डिग्री तक BAD हैं। आपको अपनी निजी रिपॉजिटरी में एक शाखा में काम करने के अनुशासन को अपनाने की आवश्यकता है, जैसे ही आप कुछ जोड़ते हैं, थोड़ा सा परीक्षण करते हैं, थोड़ा परीक्षण करते हैं। फिर अपनी पूरी शाखा को एक सिंगल कमिट में मर्ज करें, एक नया प्रतिबद्ध संदेश लिखें जिसमें समग्र परिवर्तन का वर्णन हो, इसे PROOFREAD करें और पुश करें।
कोबरा

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

1
git commit --amendजवाब पहले से ही (कई बार) दिया गया था इससे पहले कि आप तुम्हारा लिखा था। आपने इसे फिर से क्यों पोस्ट किया? यदि आप "रिस्ट्रिटिंग गिट हिस्ट्री" का लिंक जोड़ना चाहते हैं, तो आप मौजूदा उत्तरों में से एक को संपादित कर सकते हैं, या एक टिप्पणी छोड़ सकते हैं।
डेन डैस्कलेस्क्यू

199

संशोधन

आपके पास यहां कुछ विकल्प हैं। तुम कर सकते हो

git commit --amend

जब तक यह आपकी आखिरी प्रतिबद्धता है।

परस्पर विद्रोह

अन्यथा, यदि यह आपकी अंतिम प्रतिबद्धता नहीं है, तो आप एक इंटरैक्टिव रिबेस कर सकते हैं,

git rebase -i [branched_from] [hash before commit]

तब इंटरएक्टिव रिबेस के अंदर आप बस उस कमिट में एडिट कर देते हैं। जब यह आता है, तो एक करें git commit --amendऔर प्रतिबद्ध संदेश को संशोधित करें। यदि आप उस कमिट बिंदु से पहले वापस रोल करना चाहते हैं, तो आप उपयोग भी कर सकते हैं git reflogऔर बस उस कमिट को हटा सकते हैं। तब आप बस git commitफिर से करते हैं।


191

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

git commit --amend -o -m "New commit message"

( यह सुनिश्चित करने के लिए कि आप केवल प्रतिबद्ध संदेश बदलते हैं) -o( --only) ध्वज का उपयोग करना


यदि यह एक दफन प्रतिबद्ध है, तो भयानक इंटरैक्टिव रिबास का उपयोग करें :

git rebase -i @~9   # Show the last 9 commits in a text editor

प्रतिबद्ध आप चाहते हैं, परिवर्तन का पता लगाएं pickकरने के लिए r( reword), और बचाने के लिए और करीब फ़ाइल। किया हुआ!



लघु विम ट्यूटोरियल (या, केवल 8 कीस्ट्रोक्स के साथ रिबेस कैसे करें 3jcwrEscZZ):

  • vimtutorअगर आपके पास समय हो तो चलाएं
  • hjkl आंदोलन कुंजी के अनुरूप
  • सभी कमांड को "रेंज" के साथ उपसर्ग किया जा सकता है, उदाहरण के लिए 3jतीन लाइनें नीचे जाती हैं
  • i डालने के लिए मोड - आपके द्वारा टाइप किया गया पाठ फ़ाइल में दिखाई देगा
  • Escया Ctrlcसम्मिलित मोड से बाहर निकलें और "सामान्य" मोड पर लौटें
  • u पूर्ववत करने के लिए
  • Ctrlr फिर से करना
  • dd, dw, dlएक पंक्ति, शब्द या अक्षर क्रमश: नष्ट करने के लिए
  • cc, cw, clएक पंक्ति, शब्द या अक्षर में क्रमश: (के रूप में ही बदलने के लिएddi )
  • yy, yw, yl( "झटका"), क्रमशः कॉपी करने के लिए एक पंक्ति, शब्द या अक्षर
  • p या P बाद में, या वर्तमान स्थिति से पहले पेस्ट करने के लिए
  • :wEnter एक फ़ाइल को बचाने (लिखने) के लिए
  • :q!Enter बिना बचत के छोड़ना
  • :wqEnter या ZZ बचाने और छोड़ने के लिए

यदि आप पाठ को बहुत संपादित करते हैं, तो ड्वोरक कीबोर्ड लेआउट पर जाएं , स्पर्श-प्रकार सीखें, और विम सीखें। क्या यह प्रयास के लायक है? हाँ।



ProTip ™: इतिहास को फिर से लिखने वाले "खतरनाक" आदेशों के साथ प्रयोग करने से डरो मत; - Git डिफ़ॉल्ट रूप से 90 दिनों के लिए आपके कमिट को नहीं हटाता है; आप उन्हें रिफ्लॉग में पा सकते हैं:

$ git reset @~3   # Go back three commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started

* जैसे विकल्पों के लिए बाहर देखो --hardऔर --forceयद्यपि - वे डेटा को त्याग सकते हैं। * इसके अलावा, आप जिन भी शाखाओं में सहयोग कर रहे हैं, उन पर इतिहास को फिर से न लिखें।


3
विम भाग पूरी तरह से विषय है, और उपयोगकर्ताओं को आर्कन संपादक का उपयोग करने के लिए सीखने में समय बिताने के लिए प्रोत्साहित करने के बजाय, उन्हें कुछ और विषय पर क्यों नहीं पढ़ाया जाता है, जैसे कुछ उपयोगकर्ता के अनुकूल होने के लिए डिफ़ॉल्ट गिट संपादक को कैसे सेट करना है, जैसे nano? हम उन तुच्छ संशोधनों के बारे में बात कर रहे हैं, जिन्हें टेक्स्ट फ़ाइल में किए जाने की आवश्यकता है, न कि हार्डकोर कोडिंग की, जो "सर्वश्रेष्ठ" टेक्स्ट एडिटर के बारे में एक लौ युद्ध उत्पन्न करेगा।
डैन डैस्कलेस्क्यू

1
@DanDascalescu: क्योंकि यह ऊपर दिए गए निर्देशों का उपयोग करके Vim सीखने के लिए नैनो के उपयोग से कई विद्रोह करने की तुलना में तेज है। संपूर्ण कारण गिट एक पाठ संपादक को खोलता है और रिबासिंग के लिए अपना स्वयं का इंटरफ़ेस नहीं है क्योंकि विम मौजूद है: यह हल्का है, अधिकांश सिस्टम पर डिफ़ॉल्ट रूप से स्थापित है, और आसानी से छूट के साथ पर्याप्त प्रदर्शन करने के लिए सीखने के लिए बहुत आसान है: उदाहरण के लिए ddjjpZZएक प्रतिबद्ध 2 नीचे ले जाता है। बुनियादी विम ज्ञान के बारे में कुछ भी नहीं है; नैनो की तुलना में विम के साथ अधिक सहज होने में 10 मिनट लगते हैं।
ज़ाज़

185

यदि आप Git GUI का उपयोग कर रहे हैं, तो आप अंतिम प्रतिबद्ध में संशोधन कर सकते हैं, जिसके साथ धक्का नहीं दिया गया है:

Commit/Amend Last Commit

168

मैं जितने जीआईटी जीआईआई का उपयोग करता हूं, और वह आपको अंतिम प्रतिबद्ध संशोधन का विकल्प देता है:

उस बॉक्स पर टिक करें

इसके अलावा, git rebase -i origin/masterएक अच्छा मंत्र है जो आपको हमेशा आपके द्वारा मास्टर के ऊपर किए गए कमिट के साथ पेश करेगा, और आपको संशोधन, हटाने, पुन: क्रम या स्क्वैश करने का विकल्प देगा। पहले उस हैश को पकड़ने की जरूरत नहीं है।


4
मैं उस स्क्रीन पर कैसे पहुँच सकता हूँ जिसे आपने अपने उदाहरण में प्रदर्शित किया है?
मारवान مروان

2
यह Windows Git Gui का निचला दायां भाग है। बस 'अमेंड लास्ट कमेटी' टॉगल का चयन करें, और यह सबसे हालिया कमिट जानकारी के साथ आबाद हो जाएगा।
wbdarby

138

वाह, ऐसा करने के लिए बहुत सारे तरीके हैं।

फिर भी ऐसा करने का एक और तरीका यह है कि आप आखिरी कमिट को हटा दें, लेकिन इसके बदलाव को रखें ताकि आप अपना काम न खोएं। फिर आप सही संदेश के साथ एक और कमिट कर सकते हैं। यह कुछ इस तरह दिखेगा:

git reset --soft HEAD~1
git commit -m 'New and corrected commit message'

मैं हमेशा ऐसा करता हूं अगर मैं फ़ाइल जोड़ना या कोई बदलाव करना भूल जाता हूं।

--softइसके बजाय निर्दिष्ट करने के लिए याद रखें--hard , अन्यथा आप पूरी तरह से खो देते हैं।


5
यह ठीक वैसी ही बात करता है, git commit --amendसिवाय इसके कि यह 2-चरणीय प्रक्रिया है।
जोसेफ के। स्ट्रॉस

3
@ JosephK.Strauss का मानना ​​है कि प्रतिबद्ध होने के कारण मूल प्रतिबद्ध लेखक और तारीख की जानकारी भी रहती है, नए कमेंट और तारीख की जानकारी अलग से होती है। मुझे यकीन नहीं है कि यह दृष्टिकोण ऐसा करता है।
एवर्टन

4
@EvertonAgner आप सही हैं। --amendलेखक की जानकारी रखेगा, लेकिन सवाल केवल संदेश को बदलने के लिए कहता है।
जोसेफ के। स्ट्रॉस

131

पुराने संदेशों को संपादित करने में मदद करने के लिए विंडोज / मैक जीयूआई की तलाश करने वाले किसी के लिए (यानी सिर्फ नवीनतम संदेश नहीं), मैं सॉरीकेट्री की सिफारिश करूंगा । अनुसरण करने के चरण नीचे हैं।

Sourcetree इंटरैक्टिव रिबेस

उन कमिटों के लिए जिन्हें अभी तक रिमोट से नहीं धकेला गया है:

  1. सुनिश्चित करें कि आपने सभी वर्तमान परिवर्तन किए (या किए गए हैं, इसलिए "फ़ाइल स्थिति" टैब में सूचीबद्ध कोई फ़ाइलें नहीं हैं) - यह अन्यथा काम नहीं करेगा।
  2. "लॉग / इतिहास" टैब में, नीचे दिए गए ग्राफ़ में एक समीपवर्ती रेखा के साथ प्रविष्टि पर राइट क्लिक करें, जिसे आप संपादित करना चाहते हैं और " प्रतिबद्ध कमेंट> के बच्चों को पुनः चुनें" इंटरएक्टिव ..." का
  3. जिस संदेश को आप बदलना चाहते हैं उसके लिए पूरी पंक्ति चुनें ("संदेश" कॉलम पर क्लिक करें)
  4. "संदेश संपादित करें" बटन पर क्लिक करें।
  5. संदेश को इच्छित संवाद में संपादित करें जो ऊपर आता है और फिर क्लिक करें OK
  6. यदि परिवर्तन करने के लिए अन्य प्रतिबद्ध संदेश हैं, तो 3-4 चरणों को दोहराएं।
  7. क्लिक करें OK: रीबासिंग शुरू होगी यदि सब ठीक है, तो आउटपुट "सफलतापूर्वक पूरा हुआ" समाप्त हो जाएगा। नोट: मैंने कभी-कभी Unable to create 'project_path/.git/index.lock': File exists.एक ही समय में कई प्रतिबद्ध संदेशों को संशोधित करने का प्रयास करते हुए इसे विफल देखा है । निश्चित रूप से यह निश्चित नहीं है कि यह मुद्दा क्या है, या क्या यह सॉर्केट्री के भविष्य के संस्करण में तय किया जाएगा, लेकिन अगर ऐसा होता है, तो उन्हें एक समय में एक को पुन: पेश करने की सिफारिश की जाएगी (धीमी लेकिन अधिक विश्वसनीय लगती है)।

... या ... उन कमिटों के लिए जिन्हें पहले ही धकेल दिया गया है:

इस उत्तर में दिए गए चरणों का पालन करें , जो ऊपर दिए गए समान हैं, लेकिन git push origin <branch> -fशाखा को बल देने के लिए कमांड लाइन ( ) से आगे कमांड चलाने की आवश्यकता है । मैं यह सब पढ़ने और आवश्यक सावधानी बरतने की सलाह देता हूँ!


सभी उत्तरों में से - यह सभी git newbies के लिए सबसे उपयुक्त है ^ ^ ^ (एक निशुल्क प्रोग्राम का उपयोग करें SourceTree और "Rebase children of" को एक कमिट पर जिसे आप एडिट करना चाहते हैं) लागू करें
Revelt

127

यदि आप केवल नवीनतम प्रतिबद्ध को संपादित करना चाहते हैं, तो उपयोग करें:

git commit --amend

या

git commit --amend -m 'one line message'

लेकिन अगर आप कई कमिट्स को एक पंक्ति में संपादित करना चाहते हैं, तो आपको इसके बजाय रिबासिंग का उपयोग करना चाहिए:

git rebase -i <hash of one commit before the wrong commit>

Git rebase संपादन

किसी फ़ाइल में, जैसा ऊपर लिखा है, लिखें edit/e या अन्य विकल्पों में से एक, और हिट सहेजें और बाहर निकलें।

अब आप पहली गलत कमिटमेंट में होंगे। फाइलों में बदलाव करें, और वे आपके लिए अपने आप मंचित हो जाएंगे। प्रकार

git commit --amend

उस प्रकार को सहेजें और बाहर निकलें

git rebase --continue

अपने सभी चयनों के साथ समाप्त होने तक अगले चयन में जाने के लिए।

ध्यान दें कि ये चीजें उस विशेष प्रतिबद्ध के बाद आपके सभी SHA हैश को बदल देती हैं।


2
git rebase -i <गलत काम करने से पहले एक काम का हैश> मेरे लिए काम करता है। धन्यवाद।
विराट

127

आप का उपयोग करना चाहिए आप केवल अपने अंतिम संदेश बदलना चाहते हैं --onlyझंडा या उसके शॉर्टकट -oके साथ commit --amend:

git commit --amend -o -m "New commit message"

यह सुनिश्चित करता है कि आप गलती से मंचन सामग्री के साथ अपनी प्रतिबद्धता नहीं बढ़ाते हैं। बेशक यह उचित $EDITORकॉन्फ़िगरेशन के लिए सबसे अच्छा है । फिर आप -mविकल्प को छोड़ सकते हैं, और Git पुराने संदेश के साथ प्रतिबद्ध संदेश को पूर्व-भर देगा। इस तरह इसे आसानी से संपादित किया जा सकता है।


1
"शीर्ष" उत्तर प्रश्न का उत्तर नहीं देता है। यह सिर्फ एक सामान्य परिचय देता है git commit --amend। प्रश्न बहुत विशिष्ट था, इसलिए अधिक लंबा! = बेहतर। -oध्वज के निर्णायक उल्लेख को संभवतः बाकी जानकारी में दफन किया जाएगा। मैं एक उत्तर को संपादित करने में भी सहज नहीं हूं, जिसमें पहले से ही बहुत सारे वोट हैं।
डेविड ओंगारो

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

1
मैं यह कहने के लिए इतनी दूर नहीं जाऊंगा कि शीर्ष उत्तर "गलत" है और यह "सवाल का जवाब नहीं देता है"। यह निश्चित रूप से काम करता है और सवाल का जवाब देता है, आपको केवल यह सुनिश्चित करने की आवश्यकता है कि जब आप संशोधन करने का प्रयास करते हैं तो आपके पास परिवर्तनों का मंचन नहीं होता है। लेकिन मैं इस बारे में लोगों को आगाह करने के बारे में आपकी बात देखता हूं। यदि मेरे पास समय है तो मैं इसे बाद में संपादित करूंगा।

1
उचित होने के लिए: भले ही --onlyविकल्प --amend1.3.0.3 के बाद से उपलब्ध है, जब तक कि यह 1.7.11.3 ( e2d4ed35902ce1595996565868680802727313117c ) में तय नहीं किया गया था । तो 2008 में वापस सही उत्तर शायद कुछ इस तरह होगा git stash; git commit --amend; git stash pop:।
डेविड ओंगारो

103

अपने अंतिम गलत संदेश को एक पंक्ति में नए प्रतिबद्ध संदेश के साथ अपडेट करें:

git commit --amend -m "your new commit message"

या, नीचे की तरह गेट रीसेट का प्रयास करें:

# You can reset your head to n number of commit
# NOT a good idea for changing last commit message,
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^

# It will reset you last commit. Now, you
# can re-commit it with new commit message.

विभाजित करने के लिए रीसेट का उपयोग कमिट्स में करता है

git reset आपको कई कमिट्स में एक कमिट को तोड़ने में मदद कर सकता है:

# Reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (You can reset multiple commit by doing HEAD~2(no. of commits)

# Now, reset your head for splitting it to multiple commits
git reset HEAD

# Add and commit your files separately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"

git add config/
git commit -m "add all files in config directory"

यहां आपने अपनी पिछली प्रतिबद्धताओं को सफलतापूर्वक दो कमिट में तोड़ दिया है।


3
यदि आप सभी करना चाहते हैं, तो अपने अंतिम वचन के संदेश को संपादित करना है, उस उद्देश्य के लिए एक नरम रीसेट का उपयोग करना अधिक मारना है । बस उपयोग करें git commit --amend, ठीक वैसे ही जैसे कि यह शीर्ष मतदान जवाब में कैसे कहता है । इसके अतिरिक्त, इस पहले के उत्तरgit reset --soft HEAD^ में सॉफ्ट रीसेट के लिए समान रूप से काम करता है , क्योंकि वे दोनों पहले माता-पिता के लिए वापस रीसेट करते हैं।

3
मैं केवल git resetसमाधान करने के लिए एक प्रतिबद्ध संदेश को कई प्रतिबद्ध संदेशों में विभाजित करने के लिए एक विचार देने के लिए जोड़ने के लिए परेशान करता हूं । क्योंकि, मैंने उस समस्या का सामना किया है, जब मैं उपयोग करना शुरू कर रहा था git। कभी-कभी, यह वास्तव में सहायक हो सकता है। :)
przbadu

87

इस सवाल पर बहुत सारे उत्तर हैं, लेकिन उनमें से कोई भी सुपर विस्तार से नहीं बताता है कि विम का उपयोग करके पुराने प्रतिबद्ध संदेशों को कैसे बदलना है । मैं खुद ऐसा करने की कोशिश कर रहा था, इसलिए यहां मैं विस्तार से लिखूंगा कि मैंने विशेष रूप से ऐसे लोगों के लिए कैसे किया, जिन्हें विम का कोई अनुभव नहीं है!

मैं अपने पाँच नवीनतम कमिट बदलना चाहता था जिसे मैंने पहले ही सर्वर पर धकेल दिया था। यह काफी 'खतरनाक' है क्योंकि अगर किसी और को पहले से ही खींच लिया गया है, तो आप प्रतिबद्ध संदेशों को बदलकर चीजों को गड़बड़ कर सकते हैं। हालाँकि, जब आप अपनी छोटी शाखा पर काम कर रहे हों और सुनिश्चित हो कि कोई भी इसे खींच नहीं रहा है तो आप इसे इस तरह बदल सकते हैं:

मान लें कि आप अपने पांच नवीनतम आवागमन बदलना चाहते हैं, और फिर आप इसे टर्मिनल में टाइप करते हैं:

git rebase -i HEAD~5

* जहां 5 ऐसे कमिट मैसेज की संख्या है जिसे आप बदलना चाहते हैं (इसलिए यदि आप 10 वीं को आखिरी कमिट में बदलना चाहते हैं, तो आप 10 में टाइप करें)।

यह कमांड आपको विम में ले जाएगी जहां आप अपना कमिटमेंट हिस्ट्री एडिट कर सकते हैं। आप इस तरह से शीर्ष पर अपने अंतिम पाँच कमिट देखेंगे:

pick <commit hash> commit message

इसके बजाय pickआपको लिखने की जरूरत है reword। आप इसे टाइप करके विम में कर सकते हैं i। यह आपको इन्सर्ट मोड में जाता है। (आप देखते हैं कि आप नीचे INSERT शब्द के द्वारा इन्सर्ट मोड में हैं ।) उन कमिटों के लिए जिन्हें आप बदलना चाहते हैं, rewordइसके बजाय टाइप करें pick

फिर आपको इस स्क्रीन को सहेजने और छोड़ने की आवश्यकता है। आप Escबटन दबाकर पहले 'कमांड-मोड' में जा रहे हैं (आप जांच सकते हैं कि आप कमांड-मोड में हैं यदि तल पर INSERT शब्द गायब हो गया है)। फिर आप टाइप करके कमांड टाइप कर सकते हैं :। बचाने और छोड़ने की आज्ञा है wq। इसलिए यदि आप :wqसही रास्ते पर हैं।

फिर विम आपके द्वारा किए गए प्रत्येक संदेश पर चला जाएगा, और यहां आप वास्तव में प्रतिबद्ध संदेशों को बदल सकते हैं। आप सम्मिलित रूप से मोड में जाकर, कमिट मैसेज को बदलकर, कमांड-मोड में जाकर, और सेव करके और छोड़ कर करेंगे। यह पांच बार करो और तुम विम से बाहर हो!

फिर, यदि आपने पहले से ही अपने गलत कामों को आगे बढ़ाया है, तो आपको git push --forceउन्हें अधिलेखित करने की आवश्यकता है । याद रखें कि git push --forceयह करने के लिए काफी खतरनाक चीज है, इसलिए सुनिश्चित करें कि जब तक आपने अपना गलत काम नहीं किया है, तब तक किसी ने सर्वर से नहीं खींचा है!

अब आपने अपने प्रतिबद्ध संदेशों को बदल दिया है!

(जैसा कि आप देख रहे हैं, मैं विम में अनुभव नहीं कर रहा हूँ, इसलिए यदि मैंने गलत 'लिंगो' का उपयोग किया, तो यह बताने के लिए कि क्या हो रहा है, मुझे सुधारने के लिए स्वतंत्र महसूस करें!)


4
<nitpick>स्टैक ओवरफ्लो पर कोई "थ्रेड्स" नहीं हैं, क्योंकि यह एक चर्चा मंच नहीं है, केवल "प्रश्न", "उत्तर", और "पोस्ट" हैं। </nitpick>। इसके अलावा, विम के सभी संस्करण समान नहीं हैं, उनमें से सभी आपको सम्मिलन मोड में वर्णों को हटाने नहीं देंगे (एक तरह से समझ में आता है, ठीक है?)। यदि आप हमेशा Vim में वर्णों को हटाने में सक्षम होना चाहते हैं, Xऔर xऐसा करेंगे ( xकर्सर के सामने वर्णों को हटाता है, Xहटा देगा)। यदि आप गलती करते हैं, तो आप uपूर्ववत करने के लिए बार-बार उपयोग कर सकते हैं । अंत में, इंटरएक्टिव रिबेस संपादक में rशॉर्टहैंड है reword

1
शब्द को विम में बदलने के लिए cwइसकी शुरुआत में टाइप किया जाता है (हालांकि सवाल विम के बारे में नहीं है, मैं सहमत हूं)।
यारोस्लाव निकितेंको

आपको उस घृणा का उपयोग करने की आवश्यकता नहीं है । आप अपने गिट संपादक को कुछ समझदार और उपयोगकर्ता के अनुकूल सेट कर सकते हैं , जैसे कि nanoया मिडनाइट कमांडर की मिसिट।
डेन डैस्कलेस्कु

79

आप git-rebase-reword का उपयोग कर सकते हैं

इसे किसी भी तरह से संपादित करने के लिए डिज़ाइन किया गया है (पिछले नहीं) उसी तरह commit --amend

$ git rebase-reword <commit-or-refname>

यह एक प्रतिबद्ध संशोधन करने के लिए रिबेट इंटरएक्टिव पर कार्रवाई के बाद नामित किया गया है: "पुनर्मुद्रण"। देखें यह पोस्ट और मैन -सेंसर इंटरेक्टिव मोड-

उदाहरण:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^

6
इसके लिए बाहरी प्रोग्राम इंस्टॉल करना पड़ता है। मेरी राय में, अंतर्निहित उपकरणों और उपनामों का अधिक प्रभावी ढंग से उपयोग करना सीखना बेहतर होगा। मैं टाइप करेंगे: g c; g rb -i @~9(प्रतिबद्ध और रिबेस), ले जाने के नए जहां मैं यह चाहते करने के लिए प्रतिबद्ध हैं, तो परिवर्तन commitकरने के लिए f( fixup), और बचाने के लिए। यदि आप उससे कुछ तेज चाहते थे, तो आप उर्फ git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
ज़ाज़

79

मैंने उपनाम reciऔर इसके recmलिए जोड़ा recommit (amend)है। अब मैं के साथ यह कर सकते हैं git recmया git recm -m:

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......

57

मुझे एहसास हुआ कि मैंने इसमें एक टाइपो के साथ एक प्रतिबद्ध किया था। पूर्ववत करने के लिए, मैंने निम्नलिखित कार्य किया:

git commit --amend -m "T-1000, advanced prototype"
git push --force

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


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

51

मुझे निम्नलिखित का उपयोग करना पसंद है:

  1. git status
  2. git add --all
  3. git commit -am "message goes here about the change"
  4. git pull <origin master>
  5. git push <origin master>

46

यदि आपने कोड को अपनी दूरस्थ शाखा ( GitHub / Bitbucket ) में नहीं धकेला है तो आप नीचे दिए गए कमांड लाइन पर प्रतिबद्ध संदेश को बदल सकते हैं।

 git commit --amend -m "Your new message"

यदि आप एक विशिष्ट शाखा पर काम कर रहे हैं तो ऐसा करें:

git commit --amend -m "BRANCH-NAME: new message"

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

कृपया इसे करने से पहले मेरा पूरा उत्तर पढ़ें।

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

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

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

यह सबसे अच्छा अभ्यास है जब यह पहले से ही धकेल दिया गया था, तो प्रतिबद्ध संदेश को बदलना।

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