पुश के बाद git कमिट मेसेज बदलना (यह दिया कि रिमोट से किसी को नहीं खींचा गया)


981

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

क्या इसे करने का कोई तरीका है?


आपने क्या प्रयास किया है? यह मानते हुए कि आप पहले से ही प्रतिबद्ध संदेश को बदलना जानते हैं, और फिर कोशिश करें और धक्का दें, Git आपको बताएगा कि ऐसा करने के लिए आपको क्या करने की आवश्यकता है।
एंड्रयू मार्शल

1
प्रश्न का उत्तर देखें "मैं git में एक गलत प्रतिबद्ध संदेश कैसे संपादित करूं (मैंने धक्का दिया है)?" stackoverflow.com/a/457396/444639
माइक रायलैंडर

4
इसकी घोषणा - git प्रतिबद्ध रैंक का Google प्रश्न क्रमांक 1!
मनीष श्रीवास्तव


यदि आप HEAD कमिट में संशोधन करते हैं और आमतौर पर (--force के बिना) पुश करते हैं तो आश्चर्यजनक रूप से यह विफल नहीं होता है। HEAD कमिट मैसेज को बदली हुई ईद के साथ अपडेट किया जाता है। इसका मतलब है कि HEAD को छोड़कर अन्य प्रतिबद्ध आईडी बरकरार है। मैंने इस व्यवहार को 2.8.1 संस्करण के साथ देखा।
irsis

जवाबों:


1370

इतिहास बदल रहा है

यदि यह सबसे हाल की प्रतिबद्धता है, तो आप बस यह कर सकते हैं:

git commit --amend

यह अंतिम प्रतिबद्ध संदेश के साथ संपादक को लाता है और आपको संदेश को संपादित करने देता है। (आप -mपुराने संदेश को मिटा देना चाहते हैं और नया प्रयोग कर सकते हैं।)

धक्का

और फिर जब आप धक्का देते हैं, तो यह करें:

git push --force-with-lease <repository> <branch>

या आप "+" का उपयोग कर सकते हैं:

git push <repository> +<branch>

या आप उपयोग कर सकते हैं --force:

git push --force <repository> <branch>

इन आदेशों का उपयोग करते समय सावधान रहें।

  • यदि किसी अन्य व्यक्ति ने उसी शाखा में परिवर्तन किए हैं, तो आप शायद उन परिवर्तनों को नष्ट करने से बचना चाहते हैं। --force-with-leaseअगर कोई नदी के ऊपर परिवर्तन कर रहे हैं, क्योंकि यह रद्द कर देगा (विकल्प, सबसे सुरक्षित है

  • यदि आप शाखा को स्पष्ट रूप से निर्दिष्ट नहीं करते हैं, तो Git डिफ़ॉल्ट पुश सेटिंग्स का उपयोग करेगा। यदि आपकी डिफ़ॉल्ट पुश सेटिंग "मिलान" है, तो आप एक ही समय में कई शाखाओं पर परिवर्तनों को नष्ट कर सकते हैं।

बाद में खींचना / लाना

जो कोई पहले से ही खींच चुका है, उसे अब एक त्रुटि संदेश मिलेगा, और उन्हें अपडेट करने की आवश्यकता होगी (यह मानते हुए कि वे स्वयं कोई बदलाव नहीं कर रहे हैं)

git fetch origin
git reset --hard origin/master # Loses local commits

उपयोग करते समय सावधान रहें reset --hard। यदि आपके पास शाखा में परिवर्तन हैं, तो वे परिवर्तन नष्ट हो जाएंगे।

इतिहास को संशोधित करने के बारे में एक नोट

नष्ट किया गया डेटा वास्तव में सिर्फ पुराना प्रतिबद्ध संदेश है, लेकिन --forceयह नहीं जानता कि, और खुशी से अन्य डेटा भी हटा देगा। इसलिए सोचें --forceकि "मैं डेटा को नष्ट करना चाहता हूं, और मुझे पता है कि डेटा को नष्ट किया जा रहा है।" लेकिन जब नष्ट किए गए डेटा को कमिट किया जाता है, तो आप अक्सर पुराने कमिट्स को रिफ्लॉग से रिकवर कर सकते हैं- डेटा वास्तव में नष्ट होने के बजाय अनाथ हो जाता है (हालाँकि अनाथ किए गए समय-समय पर डिलीट हो जाते हैं)।

अगर आपको नहीं लगता कि आप डेटा नष्ट कर रहे हैं, तो इससे दूर रहें --force... बुरी चीजें हो सकती हैं

यही कारण है कि --force-with-leaseकुछ हद तक सुरक्षित है।


13
कि "ठीक" से सावधान रहें, जैसे कि वे किसी भी स्थानीय, unpushed प्रतिबद्ध वे "खो" किया जाएगा ( खो सही मायने में अर्थ अनाथ , लेकिन उन्हें ठीक हो गैर स्पष्ट है)।
एंड्रयू मार्शल 2

1
जब आप पुश -फोर्स लगाते हैं, तो आप शायद शाखा का नाम बताना चाहते हैं, अन्यथा आप अपनी अपेक्षा से अधिक धक्का दे सकते हैं।
user693960

1
@ user693960: Git केवल पुश करेगा जिसे आप पुश करने के लिए कॉन्फ़िगर करते हैं।
डिट्रिच एप्प

10
बस के git push --forceबिना <रिपोजिटरी> और <शाखा> विकल्प भी काम करता है, अगर आपके पास अपना अपस्ट्रीम सेट अप है।
एहनबीकैड

2
क्या आप इसका उदाहरण दे सकते हैं <repository>? क्या यह है origin? org/repo? या बस repo?
माइकश्चिंकल

439

सिर्फ कहे :

git commit --amend -m "New commit message"

और फिर

git push --force

8
मेरे मामले में git push origin <BRANCH-NAME>काम नहीं किया, मुझे git push --forceस्वीकृत उत्तर में बताए अनुसार उपयोग करना था ।
गैब्रियल

1
यह मेरे लिए काम नहीं करता है। हमें मिल जाएगा git push --force, या फिर धक्का के माध्यम से जाना नहीं है।
एहनबेकद

4
@ahnbizcad, यह काम करना चाहिए। बस यह सुनिश्चित कर लें कि शाखा का नाम सही है।
विलियम

3
मैं आपके स्पष्टीकरण में सादगी के लिए जयकार करता हूं! मैं इसे अक्सर उपयोग करता हूं
वासिकोस

3
मैंने अपनी शाखा को अस्थायी रूप से "असुरक्षित" करने के बाद ही इन आदेशों को सफलतापूर्वक लागू किया, जो कि मेरे गीताब-होस्टेड प्रोजेक्ट पर हुआ था। यदि आपके पास यह समस्या है, तो इन आदेशों को लागू करने से पहले, कृपया इस स्टैकओवरफ्लो को देखें। एक शाखा को "अनप्रोटेक्ट" करने के लिए / 32267118/1423345 पर जाएं और आप प्रतिबद्ध संदेश में संशोधन करने के बाद इसे फिर से "सुरक्षित" कर सकते हैं:
जॉन

261

सबसे हाल के अलावा किसी अन्य को संपादित करने के लिए:

Step1 : प्रभावित git rebase -i HEAD~nहोने वाले आखिरी nकमिट्स के लिए इंटरेक्टिव रीबेस करना । (यानी यदि आप एक प्रतिबद्ध संदेश बदलना चाहते हैं तो 3 वापस आ जाते हैं, करें git rebase -i HEAD~3)

git उन कमिट को संभालने के लिए एक एडिटर को पॉप अप करेगा, इस कमांड को देखे:

#  r, reword = use commit, but edit the commit message

ठीक यही हमें चाहिए!

चरण 2 : बदलें pickकरने के लिए rउन करता है कि आप संदेश अपडेट करना चाहते हैं। यहां प्रतिबद्ध संदेश को बदलने की जहमत न करें, इसे नजरअंदाज कर दिया जाएगा। अगले कदम पर आप ऐसा करेंगे। संपादक को सहेजें और बंद करें।

ध्यान दें कि यदि आप अपना रिबास 'प्लान' संपादित करते हैं, तो यह आपको फ़ाइलों का नाम बदलने की प्रक्रिया शुरू नहीं करता है, चलाएं:

git rebase --continue

यदि आप संवादात्मक सत्र के लिए उपयोग किए गए पाठ संपादक को बदलना चाहते हैं (उदाहरण के लिए डिफ़ॉल्ट vi से नैनो तक), चलाएं:

GIT_EDITOR=nano git rebase -i HEAD~n

Step3 : Git आपके द्वारा rपहले रखे गए प्रत्येक संशोधन के लिए एक और संपादक को पॉप अप करेगा । आप जैसा चाहें वैसा ही मेसेंजर अपडेट करें, फिर एडिटर को सेव और बंद करें।

Step4 : सभी commits के बाद msg अपडेट होते है। आप git push -fदूरस्थ को अद्यतन करने के लिए करना चाह सकते हैं ।


21
यह स्वीकृत उत्तर होना चाहिए क्योंकि यह स्वीकृत उत्तर के विपरीत अन्य हालिया प्रतिबद्धों की तुलना में अन्य कमिट को बदलने की संभावना देता है। आपने मेरा दिन बचाया। धन्यवाद!
xZero

1
पिछले 3 कमिट्स के लिए n = 3 चुनें:git rebase -i HEAD~3
HeikoS

यदि आप अपना रिबास 'प्लान' संपादित करते हैं, तो यह आपको फ़ाइलों का नाम बदलने की प्रक्रिया शुरू नहीं करता है, चलाएं git rebase --continue। और यदि आप इंटरैक्टिव सत्र (उदाहरण के लिए डिफ़ॉल्ट viसे nano) के लिए उपयोग किए गए पाठ संपादक को बदलना चाहते हैं , तो चलाएं GIT_EDITOR=nano git rebase -i HEAD~n
जेमी बर्च

मैंने इसे थोड़ा और जानकारी जोड़ने के लिए संपादित किया। कृपया देख लीजिये। यह वह जवाब था जो मैं करना चाहता था, लेकिन मैंने इसे स्क्रॉल किया क्योंकि इसमें हेडर नहीं था।
किप

मैंने उत्तर में @JamieBirch से उपयोगी टिप्पणी डालने के लिए एक सुझाव संपादित किया है, जिसकी समीक्षा करना चाहते हैं।
नॉट्स 90 मोनिका

44

कंसोल में इन दो चरणों का उपयोग करें:

git commit --amend -m "new commit message"

और फिर

git push -f

किया हुआ :)


Thx, क्या यह केवल अंतिम टिप्पणी में संशोधन के लिए कदम है या इसे पुरानी टिप्पणियों के लिए भी इस्तेमाल किया जा सकता है?
Jay

@ देर से जवाब के लिए खेद है, ये कदम केवल अंतिम प्रतिबद्ध संदेश में संशोधन के लिए हैं।
अब्दुल रिजवान

19

यह ध्यान दिया जाना चाहिए कि यदि आप push --forceम्यूटेंट रेफ के साथ उपयोग करते हैं, तो वे सभी परिणामस्वरूप संशोधित किए जाएंगे। इस बात पर ध्यान देना सुनिश्चित करें कि आपके git repo को पुश करने के लिए कहाँ कॉन्फ़िगर किया गया है। सौभाग्य से अद्यतन करने के लिए एक शाखा को निर्दिष्ट करके, प्रक्रिया को थोड़ा सुरक्षित करने का एक तरीका है। गिट मैन पृष्ठों से पढ़ें:

ध्यान दें कि --force पुश किए गए सभी रेफ पर लागू होता है, इसलिए इसे पुश.डफल के साथ प्रयोग करके मिलान के लिए सेट करें या रिमोट के साथ कॉन्फ़िगर किए गए कई पुश गंतव्यों के साथ। * पुश वर्तमान शाखा (स्थानीय रीफ़ सहित) के अलावा अन्य रीफ़्रेश को अधिलेखित कर सकता है। उनके दूरस्थ समकक्ष के पीछे कड़ाई से)। केवल एक शाखा के लिए एक पुश को मजबूर करने के लिए, रिफस्पेक के सामने + का उपयोग करके पुश करें (जैसे गिट धक्का उत्पत्ति + मास्टर शाखा को धक्का देने के लिए मजबूर करने के लिए)।


3
बहुत महत्वपूर्ण नोट।
पीटर - मोनिका

कोई भी बल उत्तर मेरे लिए काम नहीं करता है, क्योंकि मेरे पास सर्वर पर ForcePush अनुमतियां नहीं हैं। इसके बजाय, मैं एक प्रतिबद्ध करना चाहता हूं जो पिछले प्रतिबद्ध संदेश को बदलता है। मैं उस कमेंट सेक्शन में "कमिट मैसेज चेंजेड" लिख सकता था।
nurettin

11

यदि आप किसी पुराने कमिट को संशोधित करना चाहते हैं, तो पिछले एक को नहीं, आपको rebaseयहां बताए अनुसार कमांड का उपयोग करने की आवश्यकता होगी , पुराने या कई प्रतिबद्ध मैसेज सेक्शन के संदेश को संशोधित करने पर , Github हेल्प पेज



8
git commit --amend

फिर वर्तमान विंडो में संदेश को संपादित करें और बदलें। उसके बाद करें

git push --force-with-lease

2

एक अन्य विकल्प एक अतिरिक्त "इरेटा कमिट" (और पुश) बनाना है जो उस कमिट ऑब्जेक्ट को संदर्भित करता है जिसमें त्रुटि है - नया इरेटा कमिट भी सुधार प्रदान करता है। इरेटा कमिट बिना किसी महत्वपूर्ण कोड परिवर्तन के एक प्रतिबद्ध है, लेकिन एक महत्वपूर्ण प्रतिबद्ध संदेश है - उदाहरण के लिए, अपनी रीडमी फ़ाइल में एक स्थान वर्ण जोड़ें और उस परिवर्तन को महत्वपूर्ण प्रतिबद्ध संदेश के साथ करें, या git विकल्प का उपयोग करें--allow-empty । यह निश्चित रूप से आसान है और रिबासिंग से अधिक सुरक्षित है, यह वास्तविक इतिहास को संशोधित नहीं करता है, और यह शाखा के पेड़ को साफ रखता है (उपयोग करते हुएamendयदि आप हाल ही में किए गए कमिट को सही कर रहे हैं, तो भी एक अच्छा विकल्प है, लेकिन इरेटा कमिटमेंट पुराने कमिट के लिए एक अच्छा विकल्प हो सकता है)। इस तरह की बात शायद ही कभी होती है कि बस गलती का दस्तावेजीकरण किया जाए। भविष्य में, यदि आपको किसी फीचर कीवर्ड के लिए गिट लॉग के माध्यम से खोज करने की आवश्यकता है, तो मूल (त्रुटिपूर्ण) कमिट दिखाई नहीं दे सकता है क्योंकि उस मूल कमिट (मूल टाइपो) में गलत कीवर्ड का उपयोग किया गया था - हालांकि, कीवर्ड दिखाई देगा इरेटा कमिट में जो फिर आपको उस मूल कमिट की ओर संकेत करेगा जिसके पास टाइपो था। यहाँ एक उदाहरण है:

$ git लॉग
प्रतिबद्ध 0c28141c68adae276840f17ccd4766542c33cf1d
लेखक: प्रथम अंतिम 
दिनांक: बुध अगस्त 8 15:55:52 2018 -0600

    इरेटा प्रतिबद्ध:
    इस प्रतिबद्ध में कोई ठोस कोड परिवर्तन नहीं है।
    यह प्रतिबद्ध केवल पिछले प्रतिबद्ध संदेश में सुधार के दस्तावेज के लिए प्रदान किया जाता है।
    यह वस्तु e083a7abd8deb5776cb304fa13731a4182a24be1 से संबंधित है
    मूल गलत प्रतिबद्ध संदेश:
        लाल करने के लिए पृष्ठभूमि का रंग बदल गया
    सुधार (* परिवर्तन पर प्रकाश डाला *):
        पृष्ठभूमि का रंग बदलकर * नीला *

प्रतिबद्ध 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
लेखक: प्रथम अंतिम 
दिनांक: बुध अगस्त 8 15:43:16 2018 -0600

    कुछ अंतरिम संदेश

प्रतिबद्ध e083a7abd8deb5776cb304fa13731a4182a24be1
लेखक: प्रथम अंतिम 
दिनांक: बुध अगस्त 8 13:31:32 2018 -0600

    लाल करने के लिए पृष्ठभूमि का रंग बदल गया

लूट, यह आशाजनक लग रहा है। क्या आप "इरेटा कमिट" करने के लिए आवश्यक कमांड दिखा सकते हैं। इन शब्दों पर केवल यह पोस्ट Google में दिखाई देती है।
जिम

1
एक "इरेटा कमिट" सिर्फ एक मैसेज के साथ एक सामान्य कमिट है जो पिछली गलत कमिटमेंट, डॉक्यूमेंटिंग और पिछली गलती के लिए एक सुधार प्रदान करने का संदर्भ देता है। git commit -m “fixed feature A”(मान लेते हैं कि git इसे e3ab7312 की एक कमिट आईडी देता है ... ... (बाद में आपको पता चला कि आपका संदेश गलत था इसलिए अब फ़ाइल में असंगत परिवर्तन करें जैसे कि रीडमी फ़ाइल में कोई स्थान जोड़ना, या —allow-emptyगिट विकल्प का उपयोग करना )। .. git commit -m “Errata commit for previous commit e3ab7312... original message should have been ‘fixed feature *B*’'' '
rob_7cc

1
... यदि आपको बाद में "फीचर B" के संदर्भ के लिए गिट लॉग को खोजना है, तो इरेटा कमिट दिखाई देगा, लेकिन इरेटा कमिट मेसेज में मूल कमिट आईडी का संदर्भ होता है जो पूर्ण ट्रैसेबिलिटी प्रदान करता है। BTW शब्द "इरेटा कमिट" कुछ खास नहीं है (git में कोई "इरेटा" कमांड नहीं है और न ही विकल्प है) ... यह एक सामान्य कमिट के लिए सिर्फ मेरी शब्दावली है जो पिछली कमिट में एक सुधार प्रदान करता है जिसमें कोई त्रुटि / टाइपो था।
रोब_7सीसी 23

लूट, कि महान काम किया। मैं सही विवरण के साथ एक नई खाली कमिट जोड़ने में सक्षम था, जो मूल प्रतिबद्धता के लिए SHA का उपयोग करके इंगित करता है। अब, दोनों को मॉड्यूल के लिए मेरी 'गिट चेन' में दिखाया गया है। धन्यवाद!
जिम

मुझे खुशी है कि आपके लिए काम किया। मैं प्रतिबद्ध संदेशों में गलतियों को सुधारने के लिए उसी तकनीक का उपयोग करता हूं। एक विकल्प के रूप में, मैंने अभी हाल ही में git notes यह खोज की है कि यह "इरेटा कमिट" के रूप में एक ही उद्देश्य पूरा करेगा। बस पिछले संदेश में टिप्पणी करने या प्रतिबद्ध संदेश में किसी भी त्रुटि को ठीक करने के लिए एक नोट जोड़ें: https://git-scm.com/docs/git-notes
rob_7cc

0

यह मेरे लिए बहुत अच्छा काम करता है,

git चेकआउट उत्पत्ति / शाखा

यदि आप पहले से ही शाखा में हैं तो पुल या रिबेस करना बेहतर है

git pull

या

git -c core.quotepath=false fetch origin --progress --prune

बाद में आप बस उपयोग कर सकते हैं

git commit --amend -m "Your message here"

या यदि आप पाठ-संपादक खोलना पसंद करते हैं तो उपयोग करें

git commit --amend

यदि आपके पास कई टिप्पणियाँ हैं, तो मैं पाठ-संपादक का उपयोग करना पसंद करूंगा। आप अपने पसंदीदा टेक्स्ट-एडिटर को कमांड के साथ सेट कर सकते हैं

git config --global core.editor your_preffered_editor_here

वैसे भी, जब आपके द्वारा किए गए प्रतिबद्ध संदेश को बदल दिया जाता है, तो इसे सहेजें और बाहर निकलें

और फिर चला

git push --force

और आपने कल लिया


0

एक ही समस्या के लिए अतिरिक्त जानकारी यदि आप बिटबकैट पाइपलाइन का उपयोग कर रहे हैं

अपना संदेश संपादित करें

git commit --amend

धक्का देना

git push --force <repository> <branch>

फिर पाइप लाइन पर अपने पुश कमांड में जोड़ें - लागू करें

git ftp push --force

यह आपकी पिछली प्रतिबद्धताओं को हटा देगा और आपके वर्तमान को धक्का देगा।

पहले पुश के बाद theforce को हटा दें

मैंने इसे बिटबकैट पाइपलाइन और इसके ठीक काम पर आजमाया

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