प्रमुख उत्तर यह बताते हैं कि किसी विशिष्ट समिति से वर्तमान शाखा में परिवर्तनों को कैसे लागू किया जाए । यदि आप "मर्ज कैसे करें" से इसका मतलब है, तो वे चेरी-पिक का उपयोग करें जैसा कि वे सुझाव देते हैं।
लेकिन अगर आप वास्तव में एक मर्ज चाहते हैं , यानी आप दो माता - पिता के साथ एक नई प्रतिबद्धता चाहते हैं - वर्तमान शाखा पर मौजूदा कमिटमेंट, और जिस कमिटमेंट से आप बदलाव लागू करना चाहते थे - तब एक चेरी-पिक वह पूरा नहीं करेगी।
सही मर्ज का इतिहास होना वांछनीय हो सकता है, उदाहरण के लिए, यदि आपकी निर्माण प्रक्रिया नवीनतम टैग (उपयोग git describe
) के आधार पर स्वचालित रूप से संस्करण स्ट्रिंग सेट करने के लिए गिट वंश का लाभ लेती है ।
चेरी-पिक के बजाय, आप एक वास्तविक कर सकते हैं git merge --no-commit
, और फिर किसी भी परिवर्तन को हटाने के लिए इंडेक्स को मैन्युअल रूप से समायोजित कर सकते हैं जो आप नहीं चाहते हैं।
मान लीजिए कि आप शाखा में हैं A
और आप शाखा की नोक पर कमेट को मर्ज करना चाहते हैं B
:
git checkout A
git merge --no-commit B
अब आप दो अभिभावकों के साथ कमिटमेंट बनाने के लिए तैयार हैं, वर्तमान टिप कमेंट A
और B
। हालाँकि, आप अपनी इच्छा से अधिक परिवर्तन लागू कर सकते हैं, जिसमें B शाखा में पहले से किए गए परिवर्तन शामिल हैं। आपको इन अवांछित परिवर्तनों को पूर्ववत करने की आवश्यकता है, फिर प्रतिबद्ध करें।
(वर्किंग डायरेक्टरी की स्थिति और इंडेक्स को वापस मर्ज करने से पहले सेट करने का एक आसान तरीका हो सकता है, ताकि आपके पास एक क्लीन स्लेट हो, जिस पर आप पहली बार में जो कमिटमेंट चाहते थे उसे चेरी-पिक कर सकें। लेकिन ... मुझे नहीं पता कि उस साफ स्लेट को कैसे हासिल किया जाए git checkout HEAD
और git reset HEAD
दोनों इस विधि के उद्देश्य को हराकर मर्ज की स्थिति को दूर करेंगे।)
इसलिए अवांछित परिवर्तनों को मैन्युअल रूप से पूर्ववत करें। उदाहरण के लिए, आप कर सकते थे
git revert --no-commit 012ea56
प्रत्येक अवांछित प्रतिबद्ध के लिए 012ea56
।
जब आप चीजों को समायोजित करना समाप्त कर लें, तो अपनी प्रतिबद्धता बनाएं:
git commit -m "Merge in commit 823749a from B which tweaked the timeout code"
अब आपके पास केवल वही परिवर्तन है जो आप चाहते थे, और पूर्वजों के पेड़ से पता चलता है कि आप तकनीकी रूप से बी से विलय कर चुके हैं।