मैं git में एक गलत प्रतिबद्ध संदेश कैसे संपादित कर सकता हूं (कि मैंने धक्का दिया है)?


152

मैं इतिहास में एक प्रतिबद्ध संदेश को संशोधित करना चाहता हूं और मैंने कई नए काम किए हैं।

मैं प्रतिबद्ध संदेश कैसे बदल सकता हूँ? क्या यह संभव है?

जवाबों:


125

लिनुस टोरवाल्ड्स का संदेश आपके प्रश्न का उत्तर दे सकता है:

पुराने प्रतिबद्ध संदेशों को संशोधित / संपादित करें

संक्षिप्त उत्तर: आप (यदि धक्का दिया) नहीं जा सकता।


अर्क (लाइनस बीके के रूप में बिटकेर को संदर्भित करता है):

साइड नोट, ऐतिहासिक हित से बाहर: बीके में आप कर सकते थे।

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

मैं गिट के साथ भी ऐसा ही कर सकता था। यह काफी आसान होता कि सिर्फ प्रतिबद्ध संदेश नाम का हिस्सा न हो, और फिर भी गारंटी है कि इतिहास अछूता था, और "बाद में टिप्पणियों को ठीक करें" की अनुमति दें।

लेकिन मैंने नहीं किया।

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

लेकिन आंतरिक स्थिरता वास्तव में अनम्य होने का बहाना नहीं है, और स्पष्ट रूप से यह बहुत लचीला होगा यदि हम गलतियों को ठीक करने के बाद ऐसा कर सकते हैं। तो यह वास्तव में मजबूत तर्क नहीं है।

असली कि जिस तरह से, आप संदेशों पर भरोसा कर सकते हैं: कारण Git आप संदेश समाप्त होता है ऊपर बहुत ही सरल किया जा रहा है प्रतिबद्ध बदलने के लिए अनुमति नहीं है। यदि आपने लोगों को बाद में उन्हें बदलने की अनुमति दी है, तो संदेश स्वाभाविक रूप से बहुत भरोसेमंद नहीं हैं।


पूर्ण होने के लिए, आप अपने स्थानीय प्रतिबद्ध इतिहास को फिर से लिख सकते हैं ताकि आप जो चाहते हैं, जैसा कि सिकोरा द्वारा सुझाया गया है , (कुछ खंडन और रीसेट के साथ, हांडी , हां !)

हालाँकि, एक बार जब आप अपने संशोधित इतिहास को फिर से प्रकाशित करते हैं (एक के साथ git push origin +master:master, +हस्ताक्षर को धक्का होने के लिए मजबूर करता है, भले ही इसका परिणाम "फास्ट-फॉरवर्ड" कमिट में न हो) ... आप कुछ परेशानी में पड़ सकते हैं

इस अन्य SO प्रश्न से निकालें:

मैंने वास्तव में एक बार gforce.it रिपॉजिटरी को --force के साथ धक्का दिया और लिनुस बिग टाइम द्वारा डांटा गया। यह अन्य लोगों के लिए बहुत सारी समस्याएं पैदा करेगा। एक सरल जवाब है "यह मत करो"।


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

@ दाविद वही सिद्धांत रखता है: आप अपने इतिहास को फिर से लिख सकते हैं और एक जोर जबरदस्ती कर सकते हैं।
VonC

2
चीजों को और अधिक विशिष्ट बनाने के लिए, यदि आप संशोधन / रिबेट करते हैं, तो उनके प्रतिबद्ध पहचानकर्ता (git सूचकांक में हेक्साडेसिमल हैश) अनिवार्य रूप से बदल जाते हैं; इसका मतलब यह है कि संपादित कमिट्स को उनके पुराने कमिट्स से गिट वीसीएस इतिहास में अलग तरीके से व्यवहार किया जाता है। ऐसा कहा जाता है, यदि आपकी देव टीम के सदस्यों ने दुर्भाग्यवश पहले से ही पुराने कमिटों को खींच लिया है, तो वे संपादित, नए कमिट्स को खींचने के लिए बाध्य हैं, और पुराने और नए के बीच अपनी स्थानीय कार्य प्रतियों में एक मर्ज का प्रदर्शन करते हैं।
शिगेरेलो

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

28

वर्तमान में एक गिट की जगह चाल हो सकती है।

विस्तार से: एक अस्थायी कार्य शाखा बनाएँ

git checkout -b temp

बदलने के लिए प्रतिबद्ध करने के लिए रीसेट करें

git reset --hard <sha1>

सही संदेश के साथ प्रतिबद्ध करें

git commit --amend -m "<right message>"

पुराने कमिट को नए के साथ बदलें

git replace <old commit sha1> <new commit sha1>

उस शाखा में वापस जाएं जहां आप थे

git checkout <branch>

अस्थायी शाखा निकालें

git branch -D temp

धक्का दें

guess

किया हुआ।


11
@ जोनाह: जब मुझे दूरस्थ शाखा में धकेलने का प्रयास किया जाता है तो मुझे "सब कुछ अप-टू-डेट" संदेश मिल रहा है
सिमोन कागवी

1
जैसा कि एक अन्य उत्तर में उल्लेख किया गया है: पुन: उपयोग करें -i reword के साथ। और यह इतिहास को फिर से लिखेगा।
सिल्वेन

समाधान के लिए धन्यवाद, जिसकी मुझे तलाश थी। तुम मेरा समय बचाओ!
टॉमाज़ कुटर

1
@ जोनाह - मुझे एक समस्या है ... आपके समाधान ने मेरे कमिट लॉग को स्थानीय रूप से अपडेट किया, लेकिन दूरस्थ रूप से नहीं। उन्हें वहां कैसे धकेलें?
टॉमस कुटेर

1
@TomaszKuter, मुझे आपके समान ही समस्या थी। मेरा प्रतिबद्ध संदेश दूरस्थ रूप से अपडेट नहीं किया गया था। मैंने GitHub से निम्न सहायता का उपयोग करके इसे हल किया: help.github.com/articles/changing-a-commit-message । निम्न का पालन करें: पुराने या कई प्रतिबद्ध संदेश अनुभाग के संदेश को संशोधित करना। यह मूल रूप से उपयोगकर्ता 987419 द्वारा दिए गए नीचे से उत्तर है यदि आपने पहले से ही प्रतिबद्ध संदेश को बदल दिया है, तो आप इसे फिर से बदलने के बिना पिक और सेव कर सकते हैं।
1948 में evaldeslacasa

19

आप git rebase -iइंटरैक्टिव के लिए 'मैं' से शाखा के विरुद्ध) का उपयोग कर सकते हैं ।

pickआप जिस टिप्पणी r(या reword) के साथ बदलना चाहते हैं उसे कमेंट के बगल में बदलें , सहेजें और बाहर निकलें और ऐसा करने पर आप संपादन करने में सक्षम होंगे।

git push एक बार फिर और आप कर रहे हैं!


1
यह मर्ज के कमिट पर संदेशों को संपादित करने की अनुमति नहीं देता है। क्या इस आदेश के कुछ प्रकार के साथ संभव है?
एंड्रयू माओ

1
-pतर्क का प्रयास करें कि rebaseकौन सा pभंडार विलीन हो जाता है।
कैक्टस

3
मुझे यह प्रक्रिया पसंद है, लेकिन पहली बार में इसका उत्तर समझ में नहीं आया। इस मामले में कि किसी को इसके साथ मदद की ज़रूरत है, गितुलब मदद पृष्ठ इसके बारे में अच्छी जानकारी प्रदान करता है: help.github.com/articles/changing-a-commit-message
evaldeslacasa

15

मान लीजिए कि आपके पास एक पेड़ है:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]

सबसे पहले, checkoutएक अस्थायी शाखा:

git checkout -b temp

पर tempशाखा, reset --hardएक प्रतिबद्ध करने के लिए है कि आप (उदाहरण के लिए, कि प्रतिबद्ध है अपने संदेश को बदलना चाहते 946992):

git reset --hard 946992

amendसंदेश बदलने के लिए उपयोग करें :

git commit --amend -m "<new_message>"

उसके बाद पेड़ इस तरह दिखेगा:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
           \
            b886a0 [temp]

फिर, cherry-pickसभी के लिए प्रतिबद्ध है कि इसमें सबसे आगे है 946992से masterकरने के लिए tempऔर उन्हें प्रतिबद्ध, उपयोग amendआप साथ ही उनके संदेशों को बदलना चाहते हैं:

git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>

पेड़ अब इस तरह दिखता है:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
               \
                b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]

अब अस्थायी शाखा को रिमोट से धकेलें:

git push --force origin temp:master

अंतिम चरण, सर्वर से शाखा खींचने के लिए masterस्थानीय पर शाखा को हटा दें , फिर शाखा पर जाएं और शाखा को हटा दें ।git fetch originmastermastertemp

अब आपके स्थानीय और रिमोट दोनों में सभी संदेश अपडेट हो जाएंगे।


5

हमारी दुकान पर, मैंने गलत संदेशों के साथ कमिट किए गए एनोटेट टैग्स को पहचानने के लिए, और एनोटेशन को रिप्लेसमेंट के रूप में इस्तेमाल करने का सम्मेलन पेश किया।

भले ही यह उन लोगों की मदद नहीं करता है जो आकस्मिक "गिट लॉग" कमांड चलाते हैं, यह हमें टिप्पणियों में गलत बग ट्रैकर संदर्भों को ठीक करने का एक तरीका प्रदान करता है, और मेरे सभी निर्माण और रिलीज़ टूल कन्वेंशन को समझते हैं।

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


3
"गिट नोट्स" एक समान उद्देश्य की सेवा कर सकते हैं
ईसाई गोएट्ज़

2

( Http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0 से )

परिवर्तन कैसे इतिहास में गहरा होता है

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

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

या आप ऐसा करने के लिए रिबास का उपयोग कर सकते हैं। नई अस्थायी शाखा बनाएं, इसे उस रीटविंड में वापस लाएं, जिसे आप git reset --hard का उपयोग करके बदलना चाहते हैं, उस कमिट को बदल दें (यह वर्तमान सिर के ऊपर होगा), फिर git rebase --onto का उपयोग करके परिवर्तित प्रतिबद्ध के शीर्ष पर रिबेस शाखा।

या आप git rebase --interactive का उपयोग कर सकते हैं, जो पैच री-ऑर्डर करने, ढहने, जैसे विभिन्न संशोधनों की अनुमति देता है ...

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


सिद्धांत में अच्छा जवाब, अभ्यास में ताकतवर खतरनाक: देखें stackoverflow.com/questions/253055#432518
वॉनक

0

यदि आप Git एक्सटेंशन का उपयोग कर रहे हैं: कमिट स्क्रीन में जाएं, तो एक चेकबॉक्स होना चाहिए जो नीचे "संशोधन" कहता है, जैसा कि नीचे देखा जा सकता है:

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


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