Git में रूट कमिट संपादित करें?


328

बाद में आने वाले संदेश को बदलने के तरीके हैं:

git commit --amend                    # for the most recent commit
git rebase --interactive master~2     # but requires *parent*

आप बहुत पहले कमिट (जिसके कोई माता-पिता नहीं हैं) का प्रतिबद्ध संदेश कैसे बदल सकते हैं?


यह भी देखें stackoverflow.com/questions/11987914/…
fork0

विशेष रूप से: स्क्रिप्ट में GIT_COMMIT पर्यावरण चर का उपयोगgit filter-branch --msg-filter
fork0

1
यह भी देखना stackoverflow.com/a/2309391/264607
BlackICE

जवाबों:


285

यह मानते हुए कि आपके पास एक साफ काम करने वाला पेड़ है, आप निम्न कार्य कर सकते हैं।

# checkout the root commit
git checkout <sha1-of-root>

# amend the commit
git commit --amend

# rebase all the other commits in master onto the amended root
git rebase --onto HEAD HEAD master

23
मेरा मानना ​​है कि यह होना चाहिए git rebase --onto HEAD <sha1-of-root> master
एंड्रयू

5
सही है, लेकिन आप <upstream> के लिए मूल रूट कमिटमेंट चाहते हैं git rebasegit rebase<शाखा> ( master) में लागू होते हैं जो <upstream> में नहीं हैं; HEADमें नहीं है master, इसलिए आपका संस्करण सभी को लागू करने का प्रयास करता है master
एंड्रयू

7
हां, सुनिश्चित करें कि यह git rebase --onto HEAD <sha1-of-root>मास्टर है, जहां <sha1-of-root>उसी का उपयोग किया जाता है git checkout <sha1-of-root>। अन्यथा, आपके पास 2 हैं first commit
एंडी

2
@Cupcake: क्या आपने कमांड के पुराने संस्करण का परीक्षण किया है? यह ठीक काम करना चाहिए। संशोधन कमिट मैसेज को बदल रहा है इसलिए पुराने और नए रूट कमिट में बिलकुल वही बदलाव पेश करते हैं जिससे पुराने रूट कमिट अपने आप ही खत्म हो जाते हैं। दूसरा HEADयह सुनिश्चित करता है कि सभी कमिटों पर विचार किया जाए और हम मास्टर पर वापस जाने के लिए रिबेस के दो पैरामीटर संस्करण का उपयोग कर सकते हैं। कृपया ध्यान दें कि यह उत्तर --rootविकल्प के अस्तित्व को पूर्ववत करता है।
सीबी बेली

9
नीचे ecdpalma का उत्तर बहुत आसान और सरल है और अधिक वोट हैं, लोगों को नीचे स्क्रॉल करें!
फ्लिम

567

Git संस्करण 1.7.12 के रूप में , अब आप उपयोग कर सकते हैं

git rebase -i --root

प्रलेखन


2
क्या इस आदेश का उपयोग करके सभी शाखाओं की जड़ को फिर से बनाना संभव है? ऐसा लगता है कि नई शाखा पर वर्तमान शाखा अलग हो जाएगी और अन्य सभी शाखाएं पुराने रूट पर
रहेंगी

@ woojoo666 आपको नई रूट पर शाखाओं को फिर से बनाना होगा। हमेशा की तरह।
बर्कस

@ कोई बात नहीं अगर ऊपर की जड़ नहीं है तो काम नहीं करता है
काई

चेतावनी: मैंने गलत तरीके से यह मान लिया था कि यह मेरी जांच की गई शाखा का मूल होगा, लेकिन सभी कमिट्स को लोड करने में थोड़ा समय लगता है, फिर उन सभी को वापस कर दें।
सिंह

2
@ अपनी टिप्पणी का क्या मतलब है? मैं पहले भाग और दूसरे के बीच की कड़ी नहीं देख सकता हूँ - इसके साथ क्या करना है?
लड़का

66

एक्दलपाल के जवाब पर विस्तार करने के लिए , आप अब --rootयह बताने के लिए विकल्प का उपयोग कर सकते हैं rebaseकि आप रूट / पहले कमिट को फिर से लिखना चाहते हैं:

git rebase --interactive --root

फिर रूट कमिट रिबोस TODO सूची में दिखाई देगा, और आप इसे संपादित करने या इसका पुन: निर्माण करने का चयन कर सकते हैं:

reword <root commit sha> <original message>
pick <other commit sha> <message>
...

यह गिट रिबेज डॉक्स (जोर मेरा) --rootसे स्पष्टीकरण है :

रिबेस <branch>को एक के साथ सीमित करने के बजाय, से आने योग्य है <upstream>यह आपको एक शाखा पर रूट कमिट (ओं) को फिर से बनाने की अनुमति देता है


12

केवल उच्च श्रेणी के उत्तर का विकल्प प्रदान करने के लिए:

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

git commit --allow-empty -m "Initial commit"

और उसके बाद ही "असली" करना शुरू करें। फिर आप आसानी से मानक तरीके से उस के शीर्ष पर रिबेस कर सकते हैं, उदाहरण के लिएgit rebase -i HEAD^


4
क्या इसका मतलब यह नहीं है कि इस काम के लिए, आपको अपनी परियोजना की शुरुआत में खाली प्रतिबद्ध बनाने के लिए दूरदर्शिता (या मानसिक) होना चाहिए ? यह मुझे, और आम तौर पर व्यावहारिक नहीं , अत्यंत स्थितिजन्य लगता है । तुम क्या सोचते हो? अगर मैं पहले ही 100 कमिट कर चुका हूं तो क्या होगा, और मुझे अचानक रूट कमिट संपादित करने की जरूरत है। क्या यह अभी भी उस स्थिति में काम करेगा, अगर मैंने शुरू में वह खाली कमिट नहीं की?

2
रूट कमिट का संदेश संपादित करना संभवत: ऐसा कुछ नहीं है जो आप उनमें से 100 में होने के बाद करेंगे। मैं कभी-कभी सिर्फ एक git रेपो करना चाहता हूं, कुछ ट्रैश कमिट करता हूं, यह जानते हुए कि एक बार जब मैं कुछ प्रयोग करने योग्य स्थिति में पहुंचता हूं, तो मैं उन्हें उदाहरण के लिए एक में स्क्वैश करता हूं, और संदेश को पुन: बनाता हूं। वैसे भी, अब मैंने अपना विचार बदल दिया है और मुझे लगता है कि पहली प्रतिबद्ध के लिए सबसे उपयोगी चीज .gitattributesएक खाली कमिट करने के बजाय फ़ाइल डाल रही होगी।
याकूब।

4

आप उपयोग कर सकते हैं git filter-branch:

cd test
git init

touch initial
git add -A
git commit -m "Initial commit"

touch a
git add -A
git commit -m "a"

touch b
git add -A
git commit -m "b"

git log

-->
8e6b49e... b
945e92a... a
72fc158... Initial commit

git filter-branch --msg-filter \
"sed \"s|^Initial commit|New initial commit|g\"" -- --all

git log
-->
c5988ea... b
e0331fd... a
51995f1... New initial commit

मैं फ़िल्टर-शाखा का उपयोग लेखक / कमेंट को बदल रहा हूं, और -- --allविकल्प वास्तव में इस मामले में महत्वपूर्ण है कि रूट कमिट को भी संभालने में सक्षम हो।
sschuberth
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.