2011-02-17 15 views
63

मेरे स्थानीय रेपो में मेरे पास एक गलत प्रतिबद्ध संदेश के साथ एक प्रतिबद्ध है।आकस्मिक रूप से प्रेरित प्रतिबद्ध: गिट प्रतिबद्ध संदेश बदलें

मैंने पहले से ही git push के साथ गलत प्रतिबद्ध संदेश प्रकाशित कर दिया है।

अब रिमोट रेपो (जो कि गिटहब-होस्टेड है) में गलत प्रतिबद्ध संदेश भी है।

मैंने पहले से ही git commit --amend को आजमाया है, लेकिन पाया कि यह इस स्थिति में मेरे लिए काम नहीं करेगा क्योंकि मैंने गलत के बाद से अतिरिक्त काम किया है।

आप इस स्थिति को कैसे ठीक करेंगे?

+0

जटिलता (?): 'खराब' (मेरे द्वारा प्रकाशित) के बाद कुछ अन्य काम हैं – jonny

+0

क्या यह एक डुप्लिकेट नहीं है [मैं रिमोट गिट रेपो में संशोधित प्रतिबद्धता कैसे बढ़ा सकता हूं?] (Http: // stackoverflow .com/प्रश्न/253,055/कैसे करते हैं-ए-धक्का-संशोधन-लिखें करने वाली-रिमोट Git-रेपो)? –

उत्तर

89

सबसे आसान समाधान (लेकिन कृपया इस करने से पहले इस पूरे जवाब पढ़ें):

  1. git rebase -i <hash-of-commit-preceding-the-incorrect-one>
  2. संपादक खुलती में, गलत प्रतिबद्ध के लिए लाइन पर reword को pick बदल जाते हैं।
  3. फ़ाइल को सहेजें और संपादक को बंद करें।
  4. संपादक गलत प्रतिबद्ध संदेश के साथ फिर से खुल जाएगा। इसे ठीक करो।
  5. फ़ाइल को सहेजें और संपादक को बंद करें। गिटहब को अपडेट करने के लिए
  6. git push --force

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

+0

चूंकि यह मेरा घर प्रोजेक्ट है यह एक अच्छा समाधान होगा। धन्यवाद! – jonny

+0

मैं असहमत हूं कि यह _easiest_ विधि है। – Abizern

+0

आह। ओपी की टिप्पणी में दी गई अतिरिक्त जानकारी नहीं देखी गई। – Abizern

33

के बजाय एक के लिए पूरे रिबेस मार्ग जाना प्रतिबद्ध:

git reset --soft head~ 
git commit -m "The message you wanted to use" 
git push -f 

आप git-reset मैनपेज में विकल्प देख सकते हैं।

एक परियोजना के लिए जो आप केवल काम कर रहे हैं, बदले गए इतिहास को कोई समस्या नहीं होनी चाहिए।

+5

ऐसा करने से "खराब" प्रतिबद्धता के बाद किए गए कार्यों की सभी प्रतिबद्ध जानकारी (लेकिन सामग्री नहीं) खो जाएगी। उन सभी आगामी कार्यों को एक बड़ी प्रतिबद्धता में एक साथ लाया जाएगा। –

+10

हालांकि यह केवल एक प्रतिबद्धता के लिए आसान है। – jonny

+2

सहमत हुए। सवाल के लिए एक अच्छा समाधान नहीं है, लेकिन जब आप तुरंत महसूस करते हैं कि आपको अपनी आखिरी प्रतिबद्धता को समायोजित करने की आवश्यकता है तो बेहद उपयोगी है। चेतावनी का एक शब्द, इस तरह '-f' के साथ धक्का देते समय सुनिश्चित करें कि आप या तो लक्ष्य शाखा का स्पष्ट रूप से संदर्भित करते हैं या आपके पास अन्य शाखाएं नहीं हैं जो अपस्ट्रीम को तोड़ देंगी। –

5

आप

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

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

गिट पुन: लिखने के लिए एक अस्थायी निर्देशिका तैयार करेगा और अतिरिक्त रूप से रीफ/मूल/में पुराने संदर्भों का बैकअप देगा।

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

-- संशोधन विकल्पों

--all से फिल्टर शाखा विकल्पों को अलग करती है सुनिश्चित करेंगे कि सभी शाखाओं और टैग फिर से लिखा जाता है।

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

कहो, आप old_master शाखा में अपने गुरु और यह फिर से पहुँच प्राप्त करना चाहते हैं:

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

आप संतुष्ट अपने परिवर्तनों -f Git धक्का का उपयोग के साथ अपने सार्वजनिक रेपो में परिवर्तन पुश करने के लिए कर रहे हैं के बाद।

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

2

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

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 

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

संबंधित मुद्दे