सवाल मौजूदा, अप्रचलित कामों को कैसे संशोधित करें?


मैंने एक प्रतिबद्ध संदेश में गलत बात लिखा है। वैकल्पिक रूप से, मैं कुछ फाइलों को शामिल करना भूल गया हूं।

मैं प्रतिबद्ध संदेश / फ़ाइलों को कैसे बदल सकता हूं? प्रतिबद्धता अभी तक धक्का नहीं दी गई है।


7680
2017-10-07 15:44


मूल


उन लोगों के लिए कुछ नया गिट करने के लिए: लॉरी के बिंदु को अभी तक धक्का देने के बारे में महत्वपूर्ण नहीं है। पुनर्जन्म की तरह, यह इतिहास बदल रहा है। अगर किसी ने मूल और पुनर्लेखित इतिहास के बीच अपने रेपो से क्लोन / खींचा है तो वे फिर से लिखने के बाद खींच नहीं पाएंगे (उस शाखा के लिए)। - Pat Notz


जवाब:


सबसे हालिया प्रतिबद्ध संदेश में संशोधन

git commit --amend

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

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

... हालांकि, यह बहु-लाइन प्रतिबद्ध संदेश या छोटे सुधारों को दर्ज करने के लिए अधिक बोझिल बना सकता है।

सुनिश्चित करें कि आपके पास कोई काम करने की प्रतिलिपि नहीं है मंचन ऐसा करने से पहले या वे भी प्रतिबद्ध हो जाएंगे। (unstaged परिवर्तन प्रतिबद्ध नहीं होंगे।)

उस प्रतिबद्धता के संदेश को बदलना जिसे आपने पहले ही अपनी दूरस्थ शाखा में धक्का दिया है

यदि आप पहले से ही अपनी रिमोट शाखा में अपनी प्रतिबद्धता को धक्का दे चुके हैं, तो आप करेंगे प्रतिबद्धता को धक्का देने की आवश्यकता है साथ में:

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

चेतावनी: बल-धक्का आपके स्थानीय एक की स्थिति के साथ रिमोट शाखा को ओवरराइट करेगा। यदि रिमोट शाखा पर ऐसा लगता है जो आपके पास आपकी स्थानीय शाखा में नहीं है, तो आप मर्जी उनको खो देता है।

चेतावनी: उन कार्यों में संशोधन के बारे में सावधान रहें जिन्हें आपने पहले ही अन्य लोगों के साथ साझा किया है। संशोधन अनिवार्य रूप से काम करता है पुनर्लेखन उन्हें अलग होना है SHA आईडी, जो किसी समस्या का सामना करती है यदि अन्य लोगों की पुरानी प्रतिबद्धता की प्रतियां हैं जिन्हें आपने फिर से लिखा है। जिनके पास पुरानी प्रतिबद्धता की एक प्रति है, उन्हें अपने नए पुन: लिखित प्रतिबद्धता के साथ अपने काम को सिंक्रनाइज़ करने की आवश्यकता होगी, जो कभी-कभी मुश्किल हो सकती है, इसलिए सुनिश्चित करें कि आप साझा प्रतिबद्ध इतिहास को फिर से लिखने का प्रयास करते समय दूसरों के साथ समन्वय करते हैं, या केवल साझा प्रतिबद्धताओं को फिर से लिखने से बचें कुल मिलाकर।


इंटरैक्टिव रीबेस का प्रयोग करें

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

गिट स्क्वैश करने के लिए, इन चरणों का पालन करें:

// X is the number of commits to the last commit you want to be able to edit
git rebase -i HEAD~X

एक बार जब आप अपनी प्रतिबद्धता को स्क्वैश करते हैं - तो चुनें e/r संदेश संपादित करने के लिए

enter image description here

इंटरेक्टिव रीबेस के बारे में महत्वपूर्ण नोट

जब आप इसका उपयोग करते हैं git rebase -i HEAD~X वहाँ हो सकता है अधिक से X करता है। गिट आखिरी में सभी कामों को "इकट्ठा" करेगा X काम करता है और यदि उस सीमा के बीच कहीं विलय हुआ तो आप सभी कामों को भी देखेंगे, इसलिए परिणाम एक्स + होगा।

अच्छा सुझाव:

यदि आपको इसे एक से अधिक शाखाओं के लिए करना है और सामग्री में संशोधन करते समय आपको संघर्ष का सामना करना पड़ सकता है, तो सेट अप करें git rerere और गिट को आपके लिए स्वचालित रूप से उन संघर्षों को हल करने दें।


प्रलेखन


14802
2018-02-08 04:26



तथापि git commit --amend के रूप में शक्तिशाली नहीं है git rebase -i। - Jeffrey Jose
@jeffjose, यह निश्चित रूप से होने की जरूरत नहीं है। इसके अलावा, git commit --amend (ए?) मास्टर प्रतिबद्धता को ठीक कर सकते हैं। - strager
यदि आप पहले ही धक्का दे चुके हैं, तो बस फिर से पुश करें: git push -f origin branchname - hughes
@ ह्यूजेस नहीं है git push -f थोड़ा खतरनाक अगर अन्य लोग एक ही भंडार का उपयोग कर रहे हैं? - Armand
यदि आप पूरे प्रतिबद्ध संदेश को फिर से लिखना नहीं चाहते हैं, तो इसके लिए जाएं git commit --amend -c HEAD। यह आपके पुराने प्रतिबद्ध संदेश के साथ प्री-पॉप्युलेट संपादक को खोल देगा, ताकि आप इसे बदल सकें। - Sam


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

2415
2017-10-07 19:52



मैंने गिट प्रतिबद्ध किया - mend -m "नया संदेश", लेकिन गीथब को दबाकर "फिर से धक्का देने से पहले दूरस्थ परिवर्तनों को मर्ज करें" उत्पन्न हुआ। खींचने के बाद, प्रतिबद्ध करें - फिर से दबाएं, और फिर धक्का दें, नया संदेश प्रकट नहीं होता है। इसके बजाय मेरे पास github.com का "शाखा मर्ज करें" मास्टर है :[myrepo] " - Dave Everitt
@DaveEveritt आपको इसे ठीक करने की कोशिश करने से पहले अपने प्रतिबद्धता को ऊपर की ओर धक्का दिया। - Thorbjørn Ravn Andersen
@ Kyralessa सच नहीं है। बैश में आप आसानी से उद्धरण को बंद न करके मल्टीलाइन प्रतिबद्ध संदेशों को आसानी से लिख सकते हैं (उद्धरण के भीतर प्रत्येक पंक्ति के अंत में वापसी को मारना)। - hobs
मुझे यह नहीं पता कि एक जवाब जो दो साल पहले लिखे गए उत्तर के मुख्य विचार की तरह दिखता है और स्वीकार्य उत्तर भी इतने सारे वोट प्राप्त करता है। अजीब। (हालांकि उत्तर के साथ कुछ भी गलत नहीं है) - happy coder
@ अमलमुरली, ठीक है। मेरा मुद्दा प्रश्न की लोकप्रियता, न ही उत्तर की उपयोगिता के बारे में बहुत कुछ नहीं था। लेकिन यह विशेष उत्तर सबसे पुराना जवाब नहीं है, और न ही यह स्वीकार किए गए उत्तर में और अंतर्दृष्टि प्रदान करता है। यह स्वीकार्य उत्तर के एक खंड की एक प्रति प्रतीत होता है। वह मेरा मुद्दा था। चीयर्स! - happy coder


यदि आप जिस प्रतिबद्धता को ठीक करना चाहते हैं वह सबसे हालिया नहीं है:

  1. git rebase --interactive $parent_of_flawed_commit

    यदि आप कई त्रुटिपूर्ण कामों को ठीक करना चाहते हैं, तो उनमें से सबसे पुराने माता-पिता को पास करें।

  2. एक संपादक आपके द्वारा दिए गए सभी कामों की एक सूची के साथ आएगा।

    1. परिवर्तन pick सेवा मेरे reword (या गिट के पुराने संस्करणों पर, करने के लिए edit) किसी भी काम के सामने आप ठीक करना चाहते हैं।
    2. एक बार सहेजने के बाद, गिट सूचीबद्ध कामों को फिर से चलाएगा।
       

  3. आप जो भी प्रतिबद्ध करना चाहते हैं उसके लिए reword, गिट आपको वापस अपने संपादक में छोड़ देगा। आप जो भी प्रतिबद्ध करना चाहते हैं उसके लिए संपादित करें, गिट आपको खोल में छोड़ देता है। यदि आप खोल में हैं:

    1. किसी भी तरह से प्रतिबद्धता को बदलें।
    2. git commit --amend
    3. git rebase --continue

जब आप जाते हैं तो विभिन्न आदेशों के आउटपुट द्वारा इस अनुक्रम का अधिकांश आपको समझाया जाएगा। यह बहुत आसान है, आपको इसे याद रखने की आवश्यकता नहीं है - बस याद रखें git rebase --interactive इससे आपको कोई फर्क नहीं पड़ता कि कितने समय पहले वे काम करते थे।


ध्यान दें कि आप उन कार्यों को बदलना नहीं चाहेंगे जिन्हें आपने पहले ही धक्का दिया है। या शायद आप करते हैं, लेकिन उस स्थिति में आपको उन सभी के साथ संवाद करने के लिए बहुत सावधानी बरतनी होगी जिन्होंने आपके कामों को खींच लिया हो और उनके ऊपर काम किया हो। कोई पुनर्विचार या प्रकाशित शाखा में रीसेट करने के बाद मैं पुनर्प्राप्त / पुन: सिंक्रनाइज़ कैसे करूं?


2297
2017-08-15 21:20



क्या कोई पहली प्रतिबद्धता का संदेश बदल सकता है (जिसमें माता-पिता नहीं हैं)? - 13ren
यह अन्य उत्तरों में से एक में उल्लिखित है लेकिन मैं यहां इसका एक नोट डालूंगा। चूंकि गिट 1.6.6 आप उपयोग कर सकते हैं reword की जगह में pick लॉग संदेश को संपादित करने के लिए। - MitMaro
संयोग से, $parent_of_flawed_commit के बराबर है $flawed_commit^। - Peeja
यदि आप पहले से ही ऊपर की ओर धकेल चुके हैं तो कभी भी ऐसा न करें (या सामान्य रूप से रीबेस करें)! - Daniel Rinser
उपयोग -p (--preserve-merges) अगर त्रुटिपूर्ण प्रतिबद्धता के बाद एक विलय था। - ahven


पिछली प्रतिबद्धता में संशोधन करने के लिए, इच्छित परिवर्तन करें और उन परिवर्तनों को चरणबद्ध करें, और फिर चलाएं

git commit --amend

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

पिछली प्रतिबद्धता में संशोधन करने और एक ही लॉग संदेश रखने के लिए, चलाएं

git commit --amend -C HEAD

इसे पूरी तरह से हटाकर पिछली प्रतिबद्धता को ठीक करने के लिए, चलाएं

git reset --hard HEAD^

यदि आप एक से अधिक प्रतिबद्ध संदेश संपादित करना चाहते हैं, तो चलाएं

git rebase -i HEAD~commit_count

(बदलने के commit_count उन कार्यों की संख्या के साथ जिन्हें आप संपादित करना चाहते हैं।) यह आदेश आपके संपादक को लॉन्च करता है। "पिक" के बजाय "एडिट" के रूप में पहली प्रतिबद्धता (जिसे आप बदलना चाहते हैं) को चिह्नित करें, फिर अपने संपादक को सहेजें और बाहर निकलें। वह परिवर्तन करें जिसे आप प्रतिबद्ध करना चाहते हैं और फिर चलाएं

git commit --amend
git rebase --continue

नोट: आप खोले गए संपादक से "इच्छित परिवर्तन करें" भी कर सकते हैं git commit --amend


750
2018-06-06 21:16



git rebase -i HEAD~commit_count आपके द्वारा चुने गए कई कामों के प्रतिबद्ध संदेश बदलने की भी अनुमति देगा। चुने गए कामों को बस "पिक" के बजाय "रीडवर्ड" के रूप में चिह्नित करें। - Joe
अगर आप रिबेज नहीं करना चाहते हैं तो क्या होगा? आप बस एक पुराना संदेश बदलना चाहते हैं? - SuperUberDuper
git reset --hard अपरिचित परिवर्तन को खत्म कर देता है। कृपया प्रतिस्थापित करें --hard साथ में --soft। - eel ghEEz


जैसा कि पहले ही उल्लेख किया, git commit --amend आखिरी प्रतिबद्धता को ओवरराइट करने का तरीका है। एक नोट: यदि आप भी करना चाहते हैं फ़ाइलों को ओवरराइट करेंआदेश कम होगा

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

381
2017-09-01 20:35



और यदि आप सबकुछ जोड़ना नहीं चाहते हैं, तो आप पहले कर सकते हैं git add file.ext तो बस git commit --amend - MalcolmOcean


आप भी गिट का उपयोग कर सकते हैं filter-branch उसके लिए।

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

यह एक तुच्छ के रूप में आसान नहीं है git commit --amend, लेकिन यह विशेष रूप से उपयोगी है, अगर आपके पास पहले से ही आपके ग़लत प्रतिबद्ध संदेश के बाद कुछ विलय हो।

ध्यान दें कि यह प्रत्येक प्रतिबद्धता को फिर से लिखने का प्रयास करेगा HEAD और दोषपूर्ण प्रतिबद्धता, तो आपको अपना चयन करना चाहिए msg-filter आदेश बहुत बुद्धिमान ;-)


346
2018-01-10 14:23



क्या इसका कोई संस्करण है जो रेगेक्स को कुछ भी नहीं मिला है तो प्रतिबद्धता को नहीं बदलेगा? - sjakubowski
AFAIK फ़िल्टर-शाखा - एमएसजी-फिल्टर किसी भी मामले में नई प्रतिबद्धता उत्पन्न करेगा। हालांकि, अगर आप सफल होते हैं और इस जानकारी का उपयोग करते हैं तो फ़िल्टर-शाखा ऑपरेशन आपके पेड़ को रीफ / मूल में रीसेट करने के लिए समाप्त होता है, तो आप msg-filter के भीतर जांच सकते हैं। - Mark
@ डेविडहॉग फ़िल्टर-शाखा विधि का उपयोग करते समय यह केवल सच है। यदि आप इंटरैक्टिव रीबेस का उपयोग करते हैं तो संशोधित प्रतिबद्धता के बाद प्रतिबद्ध आईडी परिवर्तित नहीं होती हैं। - Mark
@ मार्क हाँ वे करते हैं, उन्हें जरूरी है। Commit आईडी पिछले कामों पर निर्भर हैं। अगर वे नहीं बदलते हैं, तो गिट बेकार होगा। - Miles Rout
आप की जरूरत है $flawed_commit^..HEAD, नहीं $flawed_commit..HEAD। जैसा कि मैन पेज द्वारा बताया गया है: «आदेश केवल कमांड लाइन में उल्लिखित सकारात्मक रेफरी को फिर से लिख देगा (उदाहरण के लिए यदि आप एक .. बी पास करते हैं, केवल बी को फिर से लिखा जाएगा)।» - Ángel


मैं इस तरह से पसंद करता हूँ।

git commit --amend -c <commit ID>

अन्यथा, एक नई प्रतिबद्ध आईडी के साथ एक नई प्रतिबद्धता होगी


306
2017-11-08 03:51



मेरे लिए, उपर्युक्त आपके आदेश का उपयोग वास्तव में एक नई प्रतिबद्धता आईडी के साथ एक नई प्रतिबद्धता बनाता है और डिफ़ॉल्ट प्रतिबद्ध संदेश के रूप में "विलय शाखा" कहकर एक अतिरिक्त प्रतिबद्धता बनाता है। - Jan
संशोधनकारी हमेशा एक नई प्रतिबद्ध आईडी के साथ एक नई प्रतिबद्धता बनाता है। प्रतिबद्ध आईडी प्रतिबद्धता की सामग्री का SHA हैश है, जिसमें प्रतिबद्ध संदेश और लेखक / प्रतिबद्ध टाइमस्टैम्प शामिल हैं। यह गिट की एक विशेषता है कि, हैश टकराव को छोड़कर, यह सुनिश्चित करता है कि एक ही आईडी के साथ दो कार्य वास्तव में एक ही सामग्री, इतिहास और इसी तरह के समान प्रतिबद्ध हैं। - Emil Lundberg
एमिल के साथ सहमत हैं। इसके अतिरिक्त, दस्तावेज़ों को पढ़ना - ऐसा लगता है कि सभी "-c" गिट बताते हैं जो आपके नए प्रतिबद्धता के लिए डिफ़ॉल्ट / टेम्पलेट के रूप में उपयोग करने के लिए प्रतिबद्ध संदेश है .. वास्तव में यह पहले से ही "-c <प्रतिबद्ध आईडी>" करने जा रहा है , इसलिए इसे निर्दिष्ट करने की कोई आवश्यकता नहीं है। - Gal
-c कुछ चीजें करता है यह डिफ़ॉल्ट रूप से पुराने संदेश का उपयोग करता है, लेकिन यह लेखक की जानकारी (व्यक्ति और समय) की प्रतिलिपि बनाता है। -C यह वही काम करता है सिवाय इसके कि यह आपको संदेश को संपादित करने के लिए नहीं कहता है। - Joseph K. Strauss
@SantanuDey की तरह, यह मेरे लिए काम नहीं किया। मुझे मिला fatal: Option -m cannot be combined with -c/-C/-F/--fixup. - Andrew Grimm


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

या कंसोल / टर्मिनल से इस कमांड का उपयोग करें:

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

304
2018-01-22 17:23





आप उपयोग कर सकते हैं गिट रिबेसिंग। उदाहरण के लिए, यदि आप bbc643cd को प्रतिबद्ध करने के लिए वापस संशोधित करना चाहते हैं, तो चलाएं

$ git rebase bbc643cd^ --interactive

डिफ़ॉल्ट संपादक में, उस लाइन में 'संपादित करें' को 'संपादित करें' को संशोधित करें जिसका प्रतिबद्धता आप संशोधित करना चाहते हैं। अपने बदलाव करें और फिर उन्हें मंचित करें

$ git add <filepattern>

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

$ git commit --amend

प्रतिबद्धता को संशोधित करने के लिए, और उसके बाद

$ git rebase --continue

पिछले सिर प्रतिबद्धता पर वापस लौटने के लिए।


279
2017-10-22 11:22



यदि आप यह सुनिश्चित करना चाहते हैं कि आपका परिवर्तन से git commit --amend प्रभावित कर सकते हैं आप उपयोग कर सकते हैं git show और यह नया संदेश दिखाएगा। - Steve Tauber


  1. यदि आप केवल अपने अंतिम प्रतिबद्ध संदेश को संशोधित करना चाहते हैं, तो करें:

    git commit --amend
    

    यह आपको आपके टेक्स्ट एक्सिटर में छोड़ देगा और आपको अंतिम प्रतिबद्ध संदेश बदलने देगा।

  2. यदि आप अंतिम 3 प्रतिबद्ध संदेश, या उस बिंदु तक के किसी भी प्रतिबद्ध संदेश को बदलना चाहते हैं, तो आपूर्ति करें HEAD~3 को git rebase -i आदेश:

    git rebase -i HEAD~3
    

270
2017-11-15 09:29



यह पहले जवाब पहले से ही कहता है कि आप इसका उपयोग कर सकते हैं git commit --amend, और यह भी कहता है कि आप इसका उपयोग कर सकते हैं git rebase -i HEAD~commit_count, आपने जो किया वह प्लग इन था 3 के लिये commit_count।


यदि आपको कई शाखाओं पर एक पुराना प्रतिबद्ध संदेश बदलना है (यानी, ग़लत संदेश के साथ प्रतिबद्धता कई शाखाओं में मौजूद है) तो आप इसका उपयोग करना चाहेंगे:

git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all

गिट पुनर्लेखन के लिए एक अस्थायी निर्देशिका तैयार करेगा और इसके अतिरिक्त पुराने संदर्भों का बैकअप लेंगे refs/original/

  • -f ऑपरेशन के निष्पादन को लागू करेगा। यह आवश्यक है यदि अस्थायी निर्देशिका पहले से मौजूद है या यदि पहले से ही संदर्भित संग्रह हैं refs/original। यदि ऐसा नहीं है, तो आप इस ध्वज को छोड़ सकते हैं।

  • -- संशोधन विकल्पों से फिल्टर-शाखा विकल्पों को अलग करता है।

  • --all सुनिश्चित करेंगे, सब कुछ शाखाओं तथा टैग फिर से लिखा गया है।

अपने पुराने संदर्भों के बैकअप के कारण, आप आदेश को निष्पादित करने से पहले आसानी से राज्य में वापस जा सकते हैं।

कहें, आप अपने मास्टर को पुनर्प्राप्त करना चाहते हैं और इसे शाखा में एक्सेस करना चाहते हैं old_master:

git checkout -b old_master refs/original/refs/heads/master

251
2018-03-27 20:43



यह उत्तर ओपी के प्रश्न को संबोधित नहीं करता है, क्योंकि वे पूरी तरह से प्रतिबद्ध प्रतिबद्धता को ठीक करने में पूरी रुचि रखते हैं। मैं नियमित रूप से उपयोग करता हूं git commit --amend टिप्पणियों को ठीक करने या उन फ़ाइलों को जोड़ने के लिए जिन्हें मैं भूल गया था git add, लेकिन सिर्फ कभी मेरे पास है git pushईडी। मैं भी उपयोग करता हूँ git filter-branch जब मैं संस्करण इतिहास के साथ पूरी तरह से गड़बड़ करना चाहता हूं, लेकिन ओपी यह नहीं चाहता है, तो इस जवाब को एक बड़ी स्वास्थ्य चेतावनी की आवश्यकता है - घर पर कोशिश मत करो, peeps !! - kbro