2012-09-27 25 views
50

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

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 
error: Commit a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 is a merge but no -m option was given. 
fatal: cherry-pick failed 

यह गलत लग रहा है ....... यह होना चाहिए:

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 

के बाद जब मैं एक -m समारोह की आपूर्ति करने के लिए है?

उत्तर

64

यदि प्रतिबद्धता मर्ज करें, तो एक से अधिक माता-पिता के साथ एक प्रतिबद्धता है, तो आपको -m की आपूर्ति करनी होगी।

आम तौर पर, करता है के रूप में वर्णित किया जा सकता है क्या git cherry-pick REV:

  1. के बीच फिरना और उसकी मूल परिवर्तन करता है।

  2. इन परिवर्तनों को वर्तमान HEAD में लागू करें और परिणाम rev के प्रतिबद्ध संदेश के साथ परिणाम दें।

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

अब चेरी-पिक प्रक्रिया के चरण # 1 पर विचार करें: गिट अनुमान लगा सकता है कि आप अव्यवस्था को हटाना चाहते हैं या विजेट को कार्यान्वित करना चाहते हैं। न ही आप दोनों कर सकते हैं, क्योंकि दोनों को कैसे करना है, इस बारे में जानकारी एक विलय प्रतिबद्धता के भीतर निहित नहीं है, केवल परिणामी विलय वाले पेड़ की सामग्री ही है।

-m विकल्प आपको आगे बढ़ने के लिए गिट बताने की अनुमति देता है। उदाहरण के लिए, अगर master पर अव्यवस्था निष्कासन हुआ और मर्ज प्रतिबद्धता git merge WIDGET का उपयोग करके बनाई गई थी, तो git cherry-pick -m 1 merged-commit नए विजेट को चेरी-पिक करेगा क्योंकि मर्ज किए गए पेड़ और अभिभावक के बीच अंतर (अंतिम अव्यवस्था-निकालना करने वाला काम) वास्तव में होगा विजेट अतिरिक्तदूसरी तरफ, git cherry-pick -m 2 merge-commit अव्यवस्था को हटा देगा, क्योंकि पैरेंट 2 (विजेट-एडिटिंग का अंतिम भाग) और विलय-प्रतिबद्ध के बीच का अंतर विजेट शाखा से बिल्कुल अव्यवस्था-हटाने वाला है।

+2

'गिट चेरी-पिक' को सत्यापित करने के लिए आप क्या करना चाहते थे, 'गिट' चलाएं धक्का देने से पहले दिखाओ; यह आपको धक्का देने के बारे में क्या दिखाता है इसका अंतर दिखाएगा। – Jimothy

+1

इसके लायक होने के लिए, विलय प्रतिबद्धता को वापस करने के लिए बिल्कुल वही विचार और कमांड लाइन तर्क सफल होने की आवश्यकता है। – ErikE

+2

क्या होगा यदि मैं विजेट-एडिशन और क्लटर-डिलीशन दोनों में होना चाहता हूं? वह चेरी का मुद्दा है- विलय प्रतिबद्धता को सही चुनना? अन्यथा, मैं विजेट-एडिशन की आखिरी प्रतिबद्धता या अव्यवस्था के अंतिम प्रतिबद्धता को – Zennichimaro

2

आदमी पृष्ठों से वाक्य रचना इस प्रकार है:

git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] <commit>... 

अभिभावक संख्या दर्शाता है:

-m अभिभावक संख्या, --mainline अभिभावक संख्या, आमतौर पर आप नहीं कर सकते चेरी-मर्ज चुनें क्योंकि आप नहीं जानते कि मर्ज के किनारे को मुख्य रेखा माना जाना चाहिए। यह विकल्प मुख्य रेखा के मूल संख्या (1 से शुरू) निर्दिष्ट करता है और निर्दिष्ट माता-पिता के सापेक्ष परिवर्तन को फिर से चलाने के लिए चेरी-पिक को अनुमति देता है।

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

3

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

0

प्रयास करें:

git cherry-pick .... 
git mergetool 
git cherry-pick --continue 
14

Git आप माता-पिता संख्या निर्दिष्ट करने (-m) अनुरोध कर रहा है, क्योंकि अपने मर्ज के लिए प्रतिबद्ध है दो माता-पिता और Git मर्ज के किस ओर होना चाहिए पता नहीं है मुख्य रेखा माना जाता है। तो इस विकल्प का उपयोग करके आप निर्दिष्ट माता-पिता के सापेक्ष परिवर्तन को फिर से चलाने के लिए मुख्य रेखा के चेतना संख्या (1 से शुरू) और चेरी-पिक निर्दिष्ट कर सकते हैं।

git show --pretty=raw <merge_commit> 

या:

पता लगाने के लिए अपने प्रतिबद्ध माता-पिता, कोशिश या तो

git cat-file -p <merge_commit> 

या और भी बेहतर जीयूआई दृश्यता के लिए, कोशिश:

gitk <merge_commit> 

परिणामस्वरूप, आप कुछ ऐसा प्राप्त करना चाहिए:

commit fc70b1e9f940a6b511cbf86fe20293b181fb7821 
tree 8d2ed6b21f074725db4f90e6aca1ebda6bc5d050 
parent 54d59bedb9228fbbb9d645b977173009647a08a9 = <parent1_commit> 
parent 80f1016b327cd8482a3855ade89a41ffab64a792 = <parent2_commit> 

फिर इसके द्वारा अपने हर माता-पिता विवरण देखें:

git show <parent1_or_2_commit> 

--stat जोड़े संशोधित फ़ाइलों की सूची देखने के लिए।

या परिवर्तन (ऊपर माता-पिता के आधार पर) की तुलना करने के लिए निम्न आदेश का उपयोग करें:

git diff <parent1_or_2_commit>..<commit> 

--stat जोड़े संशोधित फ़ाइलों की सूची देखने के लिए।

या द्वारा दो माता-पिता की तुलना करने के लिए संयुक्त diff का उपयोग करें:

git diff --cc <parent1_commit> 
git diff --cc <parent2_commit> 

फिर अपने चेरी ले, उदा 1 से शुरू माता पिता संख्या निर्दिष्ट

git cherry-pick -m 1 <merge_commit> 

फिर git status चलाएं कि क्या हो रहा है यह देखने के लिए। यदि आप अभी तक परिवर्तन नहीं करना चाहते हैं, तो यह देखने के लिए -n विकल्प जोड़ें। फिर जब आप खुश नहीं होते हैं, तो HEAD (git reset HEAD --hard) पर रीसेट करें।यदि आपको गिट टकराव मिलेगा, तो आपको शायद उन्हें मैन्युअल रूप से हल करना होगा या मर्ज रणनीति निर्दिष्ट करना होगा (-X), देखें: How to resolve merge conflicts in Git?