Git: मर्ज कमिट के संदेश को कैसे संपादित करें / पुन: बनाएँ?


148

मैं एक मर्ज कमिट के संदेश को कैसे संपादित या पुन: बनाता हूँ?

git commit --amendकाम करता है अगर यह अंतिम प्रतिबद्ध है ( HEAD), लेकिन क्या होगा अगर यह पहले आता है HEAD?

git rebase -i HEAD~5 मर्ज कमिट्स को सूचीबद्ध नहीं करता है।

जवाबों:


207

यदि आप --preserve-mergesविकल्प (या इसके पर्यायवाची -p) को git rebase -iकमांड में जोड़ते हैं , तो गिट इतिहास को रेखीय करने के बजाय पुनर्जागरण करते समय मर्ज को संरक्षित करने का प्रयास करेगा, और आपको मर्ज के कमिट में भी संशोधन करने में सक्षम होना चाहिए:

git rebase -i -p HEAD~5

1
मैं इस किया है, लेकिन मेरे परिवर्तन करने के बाद और मैं कोशिश करते हैं और अपने परिवर्तनों को धक्का मैं इस मिल! [rejected] HEAD -> master (non-fast-forward)error: failed to push some refs to
मार्क

1
git पुश -f और फिर आपकी मूल शाखा को चलाने का प्रयास करें। यह काम करना चाहिए। मुझे एक ही समस्या थी, किसी कारण से यह रिबासिंग की एक कलाकृति है क्योंकि मूल रूप से क्या हुआ है कि रिबासिंग के बाद आप एक अलग हेज के साथ समाप्त हो गए, इसलिए -फोर्स को ठीक करना चाहिए और सब कुछ धक्का देना चाहिए।
राडु कोमनेसी

11
@Marc ऐसा इसलिए होता है क्योंकि आपने संशोधित किया है कि आपने पहले ही भेजा है। यह एक सर्वर को पुश करने के लिए मजबूर करने के लिए बुरा अभ्यास माना जाता है क्योंकि यह आपको और आपके सहकर्मियों को पूरी तरह से अक्षम कर सकता है। ठीक है, अगर आप अकेले हैं तो यह समस्या नहीं होनी चाहिए।
ibizaman

HEAD~5आप जिस प्रतिबद्धता को संशोधित करना चाहते हैं, उसके माता-पिता कहां हैं (आमतौर पर sha1 ^)।
गेब्रियल डेविलर्स

2
--preserve-mergesअब है--rebase-merges
ऑरेंजडॉग

32

ध्यान दें कि, git1.7.9.6 (और git1.7.10 +) को शुरू करते हुए , git mergeआप हमेशा एक मर्ज में विवरण जोड़ने के लिए, संपादक को ट्रिगर करेंगे

" git merge $tag" एक एनोटेट टैग को मर्ज करने के लिए हमेशा एक इंटरैक्टिव एडिट सत्र के दौरान संपादक को खोलता है। v1.7.10 श्रृंखला ने पुराने स्क्रिप्ट को इस व्यवहार को कम करने में मदद करने के लिए एक पर्यावरण चर GIT_MERGE_AUTOEDIT पेश किया, लेकिन रखरखाव ट्रैक को भी इसका समर्थन करना चाहिए।

यह GIT_MERGE_AUTOEDITपुराने स्क्रिप्ट को इस व्यवहार को कम करने में मदद करने के लिए एक पर्यावरण चर का भी परिचय देता है।

" एंटी-गेटिंग 1.7.10 देखें" :

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

लिनस ने कहा:

लेकिन मैं वास्तव में गहराई से परवाह नहीं करता हूं कि यह वास्तव में कैसे काम करता है - मेरा मुख्य मुद्दा यह है कि git इस तरह से मर्ज मैसेज करना बहुत आसान बना देता है।
मुझे लगता है कि इसका एक और भी सरल मुहावरा है: हम कभी भी संपादक को "git मर्ज" के लिए डिफ़ॉल्ट रूप से फायर नहीं करते हैं, लेकिन हम एक " git commit" करते हैं।
यह एक डिजाइन गलती थी, और इसका मतलब है कि यदि आप वास्तव में एक मर्ज में एक नोट जोड़ना चाहते हैं, तो आपको अतिरिक्त काम करना होगा। तो लोग नहीं करते


ध्यान दें कि, Git 2.17 (Q2 2018) से पहले, " git rebase -p" मर्ज किए गए लॉग मैसेज को कमिट कर देता है, जो अब तय हो गया है।

ग्रेगरी हेरेरो (``) द्वारा प्रतिबद्ध ed5144d (08 फरवरी 2018) देखें । सुझाया गया: वेजर्ड नोसुम ( ) , और क्वेंटिन कैसानोवस ( )(द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध 8b49408 , 27 फ़र 2018)
vegardcasasnovas
gitster

rebase -p: कॉल करते समय गलत कमिट मैसेज को ठीक करें git merge

चूंकि dd6fb00 (" rebase -p: कॉल करते समय फिक्सिंग को ठीक करें git merge", जनवरी 2018, Git 2.16.0-rc2), मर्ज किए गए कमिट के मैसेज को रीबिज किया जा रहा है और इसे 'सबस्क्रिप्शन एक्जीक्यूट' का उपयोग करके मर्ज कमांड को पास किया जाता है git rev-parse --sq-quote

इस सबमिशन के आसपास डबल कोट्स की जरूरत होती है, ताकि git mergeकमांड के लिए नए सिरे रखे जाएं ।

इस पैच से पहले, मर्ज संदेश का अनुसरण करें:

"Merge mybranch into mynewbranch

Awesome commit."

हो जाता है:

"Merge mybranch into mynewbranch Awesome commit."

एक के बाद rebase -p


Git 2.23 (Q2 2019) के साथ, " merge -c" के दौरान " " निर्देश " git rebase --rebase-mergesउपयोगकर्ता को लॉग संदेश को संपादित करने का मौका देना चाहिए, भले ही अन्यथा एक नया मर्ज बनाने और मौजूदा एक को बदलने की आवश्यकता न हो (अर्थात इसके बजाय फास्ट-फॉरवर्ड करें) ), लेकिन नहीं किया।
जिसे सुधारा गया।

फिलिप वुड ( ) द्वारा प्रतिबद्ध 6df8df0 (02 मई 2019) देखें । (द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध c510261 , 13 जून 2019)phillipwood
gitster


16

केवल आदिम आदेशों का उपयोग करके एक और अच्छा जवाब - knittl https://stackoverflow.com/a/7599522/94687 द्वारा :

git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch

या एक बेहतर (अधिक सही) अंतिम रिबेस कमांड:

git rebase <sha of merge> previous_branch --onto HEAD

BTW, आदिम आदेशों का उपयोग करने के लिए बहुत अधिक सीपीयू का उपभोग नहीं करने का अच्छा "फीचर" हो सकता है और आपको अनजान समय का इंतजार करना होगा जब तक कि गिट को कमिट की सूची के बारे में सोचने की ज़रूरत न हो git rebase -p -i HEAD^^^^(इस तरह के एक कमांड जो इस में परिणाम होगा केवल 4 अंतिम की सूची मर्ज के साथ शुरू होती है, क्योंकि मेरे मामले में पिछले मामले में लगभग 50 सेकंड लगे थे!)।


2
यह वास्तव में उपयोगी है, मुझे काफी समय बचाएं। मेरी कंपनी रिपॉजिटरी में कुछ कमिट मैसेज को ब्लॉक करती है, जोकि --amend के साथ या रीबेज कमांड्स के साथ आसान है लेकिन: बड़ी समस्या है अगर हम कुछ ब्रांच को आपके में मर्ज करते हैं, कुछ कमिट करते हैं और पुश करने की कोशिश करते हैं, तो git का डिफॉल्ट मर्ज मैसेज ब्लॉक हो जाता है ( यह तय होना चाहिए, मुझे पता है) जो हमें उस संदेश को बदलने के लिए मजबूर करता है। इस उत्तर तक, मैंने सफलता के साथ कमिट के इतिहास के बीच एक मर्ज संदेश को बदलने की कई कोशिश की है।
जियोवानी सिल्वा

2

git merge --edit
आपको गैर-संवादात्मक मर्ज के मामले में भी टिप्पणी देने की अनुमति देता है।

git merge --edit --no-ff उपयोगी हो सकता है यदि आप विकास शाखा पर रीपासिंग के साथ गिट फ्लो का पालन करते हैं और इसमें तेजी से आगे नहीं बढ़ते हैं।


2

वर्तमान गिट संस्करणों के लिए (माई 2020):

git rebase -i -r <parent>,

उसके बाद संपादक के merge -C ...साथ बदलें merge -c ...

यह पुन: शुरू करने के दौरान संपादक में प्रतिबद्ध संदेश को खोलेगा, जहां आप इसे बदल सकते हैं।

(के लिए धन्यवाद VonC के लिए संकेत ।)


0

git rebase -i HEAD~5आदेश संपादक दिखाई नहीं देता। यह निर्दिष्ट कमिट्स को सूचीबद्ध करता है (इस मामले में उनमें से पांच)। पहले कॉलम में pickहर कमिटमेंट होता है। बस उस संपादक के pickसाथ बदलें rewordऔर संपादक को + बंद करें सहेजें। तब Git संपादक पॉप अप होगा हर प्रतिबद्ध के लिए जहाँ आप बदल pickकरने के लिए rewordऔर आप संदेश के लिए प्रतिबद्ध संपादित करने देगा।


6
यह एक मर्ज के लिए काम नहीं करता है प्रतिबद्ध जब तक आप भी जोड़ -pको git rebaseआदेश।
पॉल प्राइस

4
बहुत अच्छा जवाब अगर यह एक अलग सवाल था
१३87४ if
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.