2011-08-04 6 views
10

में मध्य में काम करने के लिए परिवर्तन जोड़ें मध्य में आने वाले कार्यों में नए बदलाव कैसे जोड़ें, मेरा मतलब है कि शीर्ष प्रतिबद्धता में शामिल नहीं होना चाहिए।गिट

git log 
commit1 <--- HEAD 
commit2 
commit3 

प्रतिबद्ध 1 और प्रतिबद्ध 2 को हटाए बिना और प्रतिबद्ध 3 में परिवर्तन जोड़ने के बिना सीधे बदलाव 3 में परिवर्तन कैसे जोड़ें।

क्या मुझे स्टैश का उपयोग करने की आवश्यकता है?

यदि संभव हो, तो कृपया लिंक प्रदान करें।

+0

भी देखें http://stackoverflow.com/questions/179123/how-do-i-edit-an-incorrect-commit-message-in-git –

उत्तर

2

एक नई शाखा बनाएं, जो प्रतिबद्ध 3 की एक प्रति है। अपने बदलाव जोड़ें और प्रतिबद्ध करें। फिर, उस शाखा में commit 2 और प्रतिबद्ध 1 मर्ज करें।

12

आपको एक इंटरैक्टिव रिबेस करना है। विवरण के लिए गिट रिबेस के लिए सहायता पृष्ठ पढ़ें। संक्षिप्त जवाब यह है कि आप आगे बढ़ेंगे और सामान्य रूप से अपने "मध्य" परिवर्तनों को प्रतिबद्ध करेंगे, फिर git rebase -i HEAD~4 चलाएं। यह टेक्स्ट एडिटर में पिछले 3 कामों की एक सूची लाएगा। बस उन कामों को फिर से व्यवस्थित करें जहां मध्य में नवीनतम प्रतिबद्धता डाली जाती है, और फिर संपादक को सहेजें और बाहर निकलें। फिर गिट नए आदेश में इतिहास का पुनर्निर्माण करने का प्रयास करेगा। यह संघर्ष के साथ बंद हो सकता है। यदि ऐसा है, तो उन्हें ठीक करें जैसे आप विलय विवाद के लिए करेंगे और फिर git rebase --continue चलाएंगे, जब वे सभी ठीक और जोड़े जाएंगे। जब आप कोई संघर्ष करते हैं तो यह आपको यह सब बताता है, इसलिए केवल त्रुटि संदेशों को पढ़ें और आपको ठीक होना चाहिए।

संपादित करें: वास्तव में, ऐसा लगता है कि आप मौजूदा प्रतिबद्धता को संपादित करना चाहते हैं। उस मामले में, जब संपादक ऊपर आता है, ले जाने के लिए अपने नए अस्थायी commit3 के बगल में होना करने के लिए प्रतिबद्ध है और फिर "स्क्वैश" करने के लिए आदेश को बदलने से "लेने":

pick 123456 commit3 
squash 541343 tmpcommit 
pick 654321 commit2 
pick 431523 commit1 

EDIT2: यदि शाखा और commit1, commit2 और commit 3 पहले से ही सार्वजनिक हैं, तो आपको पुन: प्रतिक्रिया नहीं देनी चाहिए। फिर फिर, आपको वैसे भी काम नहीं करना चाहिए, इसलिए पूरा सवाल मंथन होगा। मुझे लगता है कि यह एक निजी शाखा है या एक जिसे दूसरों द्वारा पुनर्जीवित और रिवाउंड करने की उम्मीद है। फ़ाइल पॉप-अप होने में

git rebase -i commit3^ 

, edit commit3 को pick commit3 बदलने के लिए:

5

आप git-rebase के साथ ऐसा कर सकते हैं। सहेजें और छोड़ें, फिर अपने बदलाव करें। उन्हें सामान्य रूप से प्रतिबद्ध करें, फिर git rebase --continue का उपयोग करें। जब आप पूरा कर लेंगे, तो आप प्रतिबद्ध 3 और प्रतिबद्ध 2 के बीच अपने नए बदलाव देखेंगे।

(यह जोएर्ड के जवाब के रूप में ही काम करेंगे, यह सिर्फ इस बारे में सोच का एक अलग तरीका है अपने परिवर्तनों commit2 साथ विरोध है तो आप को संभालने के लिए किसी भी तरह से है कि होगा तो।।)

+0

आपको 'गिट प्रतिबद्ध - कमांड' नहीं करना चाहिए; परिवर्तन जोड़ने के बाद 'गिट रीबेस --continue' पर्याप्त है (जब तक कि आप संदेश को भी संपादित नहीं करना चाहते)। – siride

+0

आप शायद सही हैं। –

+1

यदि यह कार्य पहले से ही कार्य के पेड़ में बैठे हैं तो यह विधि काम नहीं करती है। बेशक, वह परिवर्तनों को छीन सकता है, रिबेस कर सकता है और फिर मेरे जवाब में स्क्वैश करने के बजाय प्रतिबद्ध 3 संपादित करते समय अनस्टैश कर सकता है। – siride