नोट: यह उत्तर SHA1s को बदलता है, इसलिए इसका उपयोग उस शाखा पर करने पर ध्यान दें जिसे पहले ही धकेल दिया गया है। यदि आप केवल एक नाम की वर्तनी को ठीक करना चाहते हैं या एक पुराने ईमेल को अपडेट करना चाहते हैं, तो git आपको इतिहास का उपयोग किए बिना इसे फिर से लिखने की अनुमति देता है .mailmap
। मेरा दूसरा जवाब देखिए ।
इंटरएक्टिव रिबेस का उपयोग करना
तुम यह कर सकते थे
git rebase -i -p <some HEAD before all of your bad commits>
फिर अपने सभी बुरे कमेंट्स को रिबेस फाइल में "एडिट" के रूप में चिह्नित करें। यदि आप अपनी पहली कमिट को बदलना चाहते हैं, तो आपको इसे रिबास फाइल में पहली पंक्ति के रूप में मैन्युअल रूप से जोड़ना होगा (अन्य लाइनों के प्रारूप का पालन करें)। फिर, जब git आपसे प्रत्येक कमिट में संशोधन करने के लिए कहता है, करते हैं
git commit --amend --author "New Author Name <email@address.com>"
संपादन या खुलने वाले संपादक को बंद करें, और फिर करें
git rebase --continue
रिबास जारी रखने के लिए।
आप संपादक को पूरी तरह से यहाँ पर छोड़ कर जोड़ सकते हैं --no-edit
ताकि कमांड होगी:
git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue
सिंगल कमिट
जैसा कि कुछ टिप्पणीकारों ने उल्लेख किया है, यदि आप अभी हाल की प्रतिबद्धताओं को बदलना चाहते हैं, तो रिबेस कमांड आवश्यक नहीं है। बस करो
git commit --amend --author "New Author Name <email@address.com>"
यह नाम निर्दिष्ट करने के लिए लेखक बदल जाएगा, लेकिन committer में अपने कॉन्फ़िगर किए गए उपयोगकर्ता के लिए स्थापित किया जाएगा git config user.name
और git config user.email
। यदि आप कुछ निर्दिष्ट करने के लिए कमिटर सेट करना चाहते हैं, तो यह लेखक और कमिटर दोनों को सेट करेगा:
git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author
मर्ज कमिट्स पर ध्यान दें
मेरी मूल प्रतिक्रिया में थोड़ी खामी थी। यदि करंट HEAD
और आपके बीच कोई मर्ज कमिट करता है <some HEAD before all your bad commits>
, तो git rebase
उन्हें समतल कर देगा (और वैसे, यदि आप गिटहब पुल अनुरोधों का उपयोग करते हैं, तो आपके इतिहास में मर्ज कमिट का एक टन होने जा रहा है)। यह बहुत बार बहुत अलग इतिहास का कारण बन सकता है (जैसा कि डुप्लिकेट परिवर्तन "रिबेड आउट" हो सकता है), और सबसे खराब स्थिति में, यह git rebase
आपको कठिन मर्ज संघर्षों को हल करने के लिए कह सकता है (जो पहले से ही मर्ज कमिट में हल हो गए थे)। समाधान -p
ध्वज का उपयोग करना है git rebase
, जो आपके इतिहास के मर्ज संरचना को संरक्षित करेगा। मानवपृष्ठ git rebase
चेतावनी देता है कि उपयोग करने -p
और -i
मुद्दों को जन्म दे सकता है, लेकिन मेंBUGS
अनुभाग में कहा गया है "संपादन करना और उनके प्रतिबद्ध संदेशों को फिर से लिखना ठीक काम करना चाहिए।"
मैंने -p
उपरोक्त कमांड में जोड़ा है। उस मामले के लिए जहां आप अभी हाल ही में कमिट कर रहे हैं, यह कोई समस्या नहीं है।