जवाबों:
लिनुस टोरवाल्ड्स का संदेश आपके प्रश्न का उत्तर दे सकता है:
पुराने प्रतिबद्ध संदेशों को संशोधित / संपादित करें
संक्षिप्त उत्तर: आप (यदि धक्का दिया) नहीं जा सकता।
अर्क (लाइनस बीके के रूप में बिटकेर को संदर्भित करता है):
साइड नोट, ऐतिहासिक हित से बाहर: बीके में आप कर सकते थे।
और अगर आप इसका उपयोग कर रहे हैं (जैसे मैं था) तो यह वास्तव में काफी व्यावहारिक था। मैं एंड्रयू से एक पैच-बम लगाऊंगा, नोटिस कुछ गलत था, और इसे बाहर धकेलने से पहले इसे संपादित करें।
मैं गिट के साथ भी ऐसा ही कर सकता था। यह काफी आसान होता कि सिर्फ प्रतिबद्ध संदेश नाम का हिस्सा न हो, और फिर भी गारंटी है कि इतिहास अछूता था, और "बाद में टिप्पणियों को ठीक करें" की अनुमति दें।
लेकिन मैंने नहीं किया।
इसका एक हिस्सा शुद्ध रूप से "आंतरिक स्थिरता" है। Git बस एक क्लीनर प्रणाली है जो SHA1- संरक्षित, और ऑब्जेक्ट प्रकार की परवाह किए बिना सभी वस्तुओं के समान होने के लिए धन्यवाद। हाँ, चार अलग-अलग प्रकार की वस्तुएं हैं, और वे सभी वास्तव में अलग हैं, और उनका उपयोग उसी तरह से नहीं किया जा सकता है, लेकिन एक ही समय में, भले ही उनकी एन्कोडिंग डिस्क पर अलग हो, संकल्पनात्मक रूप से वे सभी बिल्कुल काम करते हैं वही।
लेकिन आंतरिक स्थिरता वास्तव में अनम्य होने का बहाना नहीं है, और स्पष्ट रूप से यह बहुत लचीला होगा यदि हम गलतियों को ठीक करने के बाद ऐसा कर सकते हैं। तो यह वास्तव में मजबूत तर्क नहीं है।
असली कि जिस तरह से, आप संदेशों पर भरोसा कर सकते हैं: कारण Git आप संदेश समाप्त होता है ऊपर बहुत ही सरल किया जा रहा है प्रतिबद्ध बदलने के लिए अनुमति नहीं है। यदि आपने लोगों को बाद में उन्हें बदलने की अनुमति दी है, तो संदेश स्वाभाविक रूप से बहुत भरोसेमंद नहीं हैं।
पूर्ण होने के लिए, आप अपने स्थानीय प्रतिबद्ध इतिहास को फिर से लिख सकते हैं ताकि आप जो चाहते हैं, जैसा कि सिकोरा द्वारा सुझाया गया है , (कुछ खंडन और रीसेट के साथ, हांडी , हां !)
हालाँकि, एक बार जब आप अपने संशोधित इतिहास को फिर से प्रकाशित करते हैं (एक के साथ git push origin +master:master
, +
हस्ताक्षर को धक्का होने के लिए मजबूर करता है, भले ही इसका परिणाम "फास्ट-फॉरवर्ड" कमिट में न हो) ... आप कुछ परेशानी में पड़ सकते हैं ।
इस अन्य SO प्रश्न से निकालें:
मैंने वास्तव में एक बार gforce.it रिपॉजिटरी को --force के साथ धक्का दिया और लिनुस बिग टाइम द्वारा डांटा गया। यह अन्य लोगों के लिए बहुत सारी समस्याएं पैदा करेगा। एक सरल जवाब है "यह मत करो"।
वर्तमान में एक गिट की जगह चाल हो सकती है।
विस्तार से: एक अस्थायी कार्य शाखा बनाएँ
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
किया हुआ।
आप git rebase -i
इंटरैक्टिव के लिए 'मैं' से शाखा के विरुद्ध) का उपयोग कर सकते हैं ।
pick
आप जिस टिप्पणी r
(या reword
) के साथ बदलना चाहते हैं उसे कमेंट के बगल में बदलें , सहेजें और बाहर निकलें और ऐसा करने पर आप संपादन करने में सक्षम होंगे।
git push
एक बार फिर और आप कर रहे हैं!
-p
तर्क का प्रयास करें कि rebase
कौन सा p
भंडार विलीन हो जाता है।
मान लीजिए कि आपके पास एक पेड़ है:
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 origin
master
master
temp
अब आपके स्थानीय और रिमोट दोनों में सभी संदेश अपडेट हो जाएंगे।
हमारी दुकान पर, मैंने गलत संदेशों के साथ कमिट किए गए एनोटेट टैग्स को पहचानने के लिए, और एनोटेशन को रिप्लेसमेंट के रूप में इस्तेमाल करने का सम्मेलन पेश किया।
भले ही यह उन लोगों की मदद नहीं करता है जो आकस्मिक "गिट लॉग" कमांड चलाते हैं, यह हमें टिप्पणियों में गलत बग ट्रैकर संदर्भों को ठीक करने का एक तरीका प्रदान करता है, और मेरे सभी निर्माण और रिलीज़ टूल कन्वेंशन को समझते हैं।
यह स्पष्ट रूप से एक सामान्य जवाब नहीं है, लेकिन यह कुछ लोग विशिष्ट समुदायों के भीतर अपना सकते हैं। मुझे यकीन है कि अगर यह बड़े पैमाने पर उपयोग किया जाता है, तो इसके लिए कुछ प्रकार के चीनी मिट्टी के बरतन समर्थन, अंततः फसल कर सकते हैं ...
( Http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0 से )
परिवर्तन कैसे इतिहास में गहरा होता है
चूँकि Git में इतिहास अपरिवर्तनीय है, कुछ भी ठीक करना लेकिन सबसे हाल की प्रतिबद्ध (प्रतिबद्ध जो शाखा प्रमुख नहीं है) के लिए आवश्यक है कि इतिहास को परिवर्तित किए गए और आगे से फिर से लिखा जाए।
आप इसके लिए StGIT का उपयोग कर सकते हैं, यदि आवश्यक हो तो शाखा को इनिशियलाइज़ करें, जिस कमिट को आप बदलना चाहते हैं, उसके लिए अनफिट करें, यदि आवश्यक हो, तो एक बदलाव करें, फिर पैच (ताज़ा विकल्प के साथ यदि आप कमिट मैसेज को सही करना चाहते हैं), तो पुश करें सब कुछ और एसटीजी प्रतिबद्ध।
या आप ऐसा करने के लिए रिबास का उपयोग कर सकते हैं। नई अस्थायी शाखा बनाएं, इसे उस रीटविंड में वापस लाएं, जिसे आप git reset --hard का उपयोग करके बदलना चाहते हैं, उस कमिट को बदल दें (यह वर्तमान सिर के ऊपर होगा), फिर git rebase --onto का उपयोग करके परिवर्तित प्रतिबद्ध के शीर्ष पर रिबेस शाखा।
या आप git rebase --interactive का उपयोग कर सकते हैं, जो पैच री-ऑर्डर करने, ढहने, जैसे विभिन्न संशोधनों की अनुमति देता है ...
मुझे लगता है कि आपके सवाल का जवाब देना चाहिए। हालाँकि, ध्यान दें कि यदि आपने कोड को किसी दूरस्थ रिपॉजिटरी में धकेल दिया है और लोगों ने इसे खींच लिया है, तो यह उनके कोड इतिहास को गड़बड़ाने वाला है, साथ ही साथ उन्होंने जो काम किया है। इसलिए इसे ध्यान से करें।