Git: केवल पिछले संदेशों को संपादित करता है


12

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

मैं पिछले कमिट्स के संदेशों को कैसे संपादित कर सकता हूं और (यदि संभव हो तो) कमिट ट्री रखें?


10
सार्वजनिक इतिहास बदलने से सावधान!
डी। बेन नोबल

2
मुझे डर है कि यहाँ उत्तर आपको लगभग पर्याप्त चेतावनी नहीं दे रहे हैं। अगर किसी और ने इस बीच आपका इतिहास खींच लिया है तो यह बहुत बड़ी गड़बड़ी पैदा करेगा - यदि वे इसके ऊपर नया काम करते हैं, तो सभी मोर्सो!
Eevee

मैं इसे कारण के साथ उपयोग करूंगा, मेरे पास यहां सरल मामला है, मैं एकमात्र हूं जो इस रेपो का उपयोग करता हूं।
तुईन फाम

3
जानकारी: स्टैक ओवरफ्लो पर यह पहले से ही (संभवतः कई बार) पूछा गया है ।
user202729

जवाबों:


20

श्रृंखलाओं के प्रतिबद्ध संदेशों को संपादित करने के लिए, मैं दौड़ता हूं

git rebase -i firstsha

जहां firstshaमैं चाहता हूं कि पहली प्रतिबद्ध माता-पिता की पहचान के लिए एक पहचानकर्ता है। (आप यहां किसी भी वैध संदर्भ का उपयोग कर सकते हैं, इसलिए git rebase -i HEAD~4अंतिम चार कमिट दिखाएंगे।)

खुलने वाले संपादक में, सभी "पिक" प्रविष्टियों को "पुनरावर्तक" में बदलें, जो आप संशोधित करना चाहते हैं, उसके बाद संपादक को बंद कर दें; फिर आपके द्वारा चुने गए सभी आवागमन के लिए प्रतिबद्ध संदेश दर्ज करने के लिए कहा जाएगा।

ध्यान दें कि यह प्रतिबद्ध पेड़ को बदल देगा , क्योंकि कमिट्स की राख बदल जाएगी। आपको अपने नए पेड़ को मजबूर करना होगा, या उसे एक नई शाखा में धकेलना होगा। यह मर्ज में गड़बड़ी भी करेगा, इसलिए एडिटिंग मर्ज कमिट से बचें।

केवल अंतिम कमिट को जल्दी से संपादित करने के लिए, रन करें

git commit --amend

(लेकिन कुछ भी प्रतिबद्ध के लिए मंचन से सावधान रहें)


यह प्रतिबद्ध पेड़ को कैसे प्रभावित करेगा, क्या यह प्रतिबद्ध पेड़ में एक मध्यवर्ती ऊर्ध्वाधर रेखा बनाएगा? मेरे पास अब केवल एक ऊर्ध्वाधर रेखा वाला पेड़ था, और 100 से अधिक संदेशों को बदलने की आवश्यकता है।
तुयेन फाम

3
यह आपके प्रतिबद्ध पेड़ में एक नई "लाइन" नहीं बनाएगा, यह सभी कमिटों को बदल देगा। यदि आपका इतिहास वर्तमान में रैखिक है, तो यह रैखिक रहेगा।
स्टीफन किट

निर्भर करता है। क्या आप इसे अपने द्वारा उपयोग कर रहे हैं और सर्वर पर नहीं धकेल रहे हैं? फिर नहीं, केवल एक "लाइन"। लेकिन अन्यथा दो हो सकते हैं, और पहले दो के आपके जवाबों के आधार पर हम आपको पुरानी "लाइन" से छुटकारा पाने में मदद कर सकते हैं।
कप्तान मैन

1
रेबेस के पास मर्ज को संभालने के लिए एक झंडा है (मुझे लगता है कि यह है preserve-merges)
डी। बेन नोबल

6

तुम जो खोज रहे हो, वह है git rebase

यदि आप केवल पिछले git commitसंदेश को बदलना चाहते हैं तो आपको केवल निम्नलिखित का उपयोग करने की आवश्यकता है:

git commit --amend

और उन परिवर्तनों को करें जो आप पिछली प्रतिबद्धताओं की इच्छा रखते हैं और फिर संपादन बचाते हैं।

हालाँकि यदि आपको पुराने कमिट बदलने की आवश्यकता है तो आपको उपयोग करने की आवश्यकता है rebase

git rebase -i HEAD~N 

जहाँ N आपके द्वारा वापस जाने की इच्छा रखने वाले संख्याओं की बराबरी करता है, जैसे 2 या 12 या 6, इत्यादि।

यहां आपको अपने कमिट्स के साथ एक टेक्स्ट एडिटर मिलना चाहिए। विकल्प से बदले pickके लिए rewordसंदेश को बदलने के लिए।

एक बार जब आप उन सभी कमिटों की पहचान कर लेते हैं जिन्हें आप बदलना चाहते हैं और उचित रूप से अपने विकल्पों को बदल दिया है, तो संपादक को सहेजें और बंद करें। फिर प्रत्येक प्रतिबद्ध संदेश में परिवर्तन करें। एक बार जब आप संतुष्ट हो जाते हैं तो आप दौड़ सकते हैं:

git push --force

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

7.6 Git Tools - पुनर्लेखन इतिहास
GitHub सहायता - एक प्रतिबद्ध संदेश बदलना
StackOverflow - पुराने पुराने संदेशों पर प्रश्न


यदि आप "reword" करते हैं, तो आपको " commit --amend" की आवश्यकता नहीं है , जब तक कि आप किसी भी तरह से कमिटिंग प्रक्रिया को गड़बड़ नहीं करते।
स्टीफन किट

धन्यवाद, यहां दिए गए चरणों है कि मैं अपने पद से मेरी समझ के रूप में कार्य करेंगे: 1. do git rebase -i firstshaकि firstshaहै माता पिता के हैश प्रतिबद्ध के लिए प्रतिबद्ध है कि मैं संदेश को बदलना चाहते होता संपादक, परिवर्तन में तो, pickकरने के लिए reword, enterनया संदेश है, तो इस मुद्दे को git rebase --continueऔर क्या git push --force?
तुईन फाम

@StephenKitt, मैंने अभी आपके उत्तर पर ध्यान दिया है, जैसा कि आपने प्रस्तुत किया था, मैं अपना बना रहा था। मैं आपकी सलाह का पालन करूंगा और उन संपादनों को बनाऊंगा। यदि यह अधिक उपयुक्त है, तो मैं आपके जवाबों को आपस में लिंक जोड़कर आप में विलय कर सकता हूं यदि आपको लगता है कि इस प्रश्न को आपके अन्य जवाबों की तुलना में बेहतर होगा।
कीमोटेप

@TuyenPham आपको केवल git rebase -i HEAD~Nएन के साथ करने की आवश्यकता है जो आप जाने की इच्छा रखते हैं। हर विकल्प है कि आप संपादित करने के लिए से के संदेश चाहते प्रतिबद्ध बदलें pickकरने के लिए reword, इस फ़ाइल को बचाने, फ़ाइलों के लिए प्रतिबद्ध हैं और उन बचाने उन में से प्रत्येक में परिवर्तन करें। एक बार जब आप आश्वस्त हो जाते हैं कि आप कर रहे हैं तो आपको केवल जरूरत है git push --force [Name of git branch you are were working on]। आप हमेशा वापस जा सकते हैं और इसे फिर से कर सकते हैं या चरणों में कर सकते हैं।
kemotep
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.