Git के साथ कमिटमेंट लेने का क्या मतलब है?


2334

हाल ही में, मुझे cherry-pickएक कमिट करने के लिए कहा गया है।

तो git में चेरी को कमिट करने का क्या मतलब है? आप इसे कैसे करते हो?


13
मर्ज के बजाय, एक शाखा से लक्ष्य शाखा को फिर से कम करने के लिए चेरी-पिकिंग के साथ (पूर्व: मास्टर) आसान है।
लेवेंट दिविलालोगू

जवाबों:


2854

Git में चेरी पिकिंग का अर्थ है एक शाखा से एक कमिट चुनना और दूसरे पर लागू करना।

यह अन्य तरीकों से विपरीत है, जैसे कि mergeऔर rebaseजो आम तौर पर किसी अन्य शाखा पर कई तरीके लागू करते हैं।

  1. सुनिश्चित करें कि आप उस शाखा पर हैं जिसे आप कमिट लागू करना चाहते हैं।

    git checkout master
    
  2. निम्नलिखित को निष्पादित करें:

    git cherry-pick <commit-hash>
    

ध्यान दें:

  1. यदि आप किसी सार्वजनिक शाखा से चेरी-पिक करते हैं, तो आपको उपयोग करने पर विचार करना चाहिए

    git cherry-pick -x <commit-hash>
    

    यह एक मानकीकृत प्रतिबद्ध संदेश उत्पन्न करेगा। इस तरह, आप (और आपके सहकर्मी) अभी भी प्रतिबद्ध की उत्पत्ति पर नज़र रख सकते हैं और भविष्य में विलय के संघर्ष से बच सकते हैं।

  2. यदि आपके पास प्रतिबद्ध से जुड़े नोट हैं तो वे चेरी-पिक का पालन नहीं करते हैं। साथ ही उन्हें लाने के लिए, आपको उपयोग करना होगा:

    git notes copy <from> <to>
    

अतिरिक्त लिंक:


246
यदि आप किसी सार्वजनिक शाखा से चेरी-पिक करते हैं, तो आपको उपयोग करने पर विचार करना चाहिए git cherry-pick -x <commit-hash>। यह एक मानकीकृत प्रतिबद्ध संदेश उत्पन्न करेगा। इस तरह, आप (और आपके सह-कार्यकर्ता) अभी भी प्रतिबद्ध की उत्पत्ति पर नज़र रख सकते हैं और भविष्य में विलय के संघर्ष से बच सकते हैं।
रॉबर्ट'

2
क्या चेरी चुनना वास्तव में आवश्यक है? एक मिश्रित रीसेट या एक नरम रीसेट एक समान काम नहीं करेगा?
नव

10
ध्यान दें कि यदि आपके पास प्रतिबद्ध से जुड़े नोट हैं तो वे चेरी-पिक का अनुसरण नहीं करते हैं। आपको git notes copy <from> <to>उन्हें भी लाने के लिए उपयोग करना होगा।
Zitrax

5
मास्टर पर परिवर्तन लेने के लिए git पुश अंतिम चरण है
अच्छा और प्रोग्रामिंग

58
FYI करें: एक प्रतिबद्ध शब्दार्थ उस पल का काम कर पेड़ के सभी फ़ाइलें हैं (और पुष्टि पिछले के हैश प्रतिबद्ध) है, तो आप आवेदन नहीं कर रहे एक पूरे एक और करने के लिए प्रतिबद्ध के लिए प्रतिबद्ध है, लेकिन एक के लिए प्रतिबद्ध किया पिछले प्रतिबद्ध पर परिवर्तन "cherry-pick commit applies the changes introduced by the named commit on the current branch"अधिकांश ppl परिवर्तन के रूप में प्रतिबद्ध होने के बारे में सोचते हैं (जैसे कि svn iirc था), लेकिन ऐसा नहीं है, प्रत्येक कमिट पूरे काम करने वाले पेड़ को संदर्भित करता है। हालांकि इससे इस मामले में कोई फर्क नहीं पड़ता है, यह समझने में मदद कर सकता है कि git क्यों काम करता है जैसे यह करता है।
एमिल व्रजदग्स

314

इस उद्धरण से लिया गया है; Git के साथ संस्करण नियंत्रण (वास्तव में महान पुस्तक, अगर आप git में रुचि रखते हैं तो मैं आपको इसे खरीदने के लिए प्रोत्साहित करता हूं)

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

Youtube: Git चेरी-पिक का परिचय

Git चेरी-पिक का उपयोग करना कमांड git चेरी-पिक कमिट वर्तमान शाखा पर नामित कमिट द्वारा शुरू किए गए परिवर्तनों को लागू करता है। यह एक नई, विशिष्ट प्रतिबद्धता का परिचय देगा। सख्ती से बोलना, git चेरी-पिक का उपयोग करना एक रिपॉजिटरी के भीतर मौजूदा इतिहास को नहीं बदलता है; इसके बजाय, यह इतिहास में जोड़ता है। अन्य गिट ऑपरेशनों के साथ, जो एक अंतर को लागू करने की प्रक्रिया के माध्यम से परिवर्तनों को पेश करते हैं, आपको दिए गए प्रतिबद्ध से परिवर्तनों को पूरी तरह से लागू करने के लिए संघर्षों को हल करने की आवश्यकता हो सकती है । कमांड git चेरी-पिक का उपयोग आम तौर पर एक शाखा से एक विशेष शाखा के भीतर एक विशेष शाखा में एक विशेष शाखा से करने के लिए किया जाता है। एक सामान्य उपयोग एक रखरखाव शाखा से एक विकास शाखा तक अग्रेषित करने के लिए- या बैक-पोर्ट है।

$ git checkout rel_2.3
$ git cherry-pick dev~2 # commit F, above

इससे पहले: इससे पहले

उपरांत: उपरांत


12
जब चेरी से उठाए गए कमिट्स को किसी शाखा (बी 1) पर ले जाया जाता है और बाद में मास्टर में पहुंचा दिया जाता है। और अगर शाखा बी 1 (जिसमें से मूल रूप से उठाया गया था) को भी मास्टर तक पहुंचाने की कोशिश की जाती है। संघर्षों के बारे में कैसे? क्या इसका ध्यान रखा जाता है या यह कैसे काम करता है?
6

3
@ अपरसिश हां, वे आपके पिछले विलय के साथ पहले से ही ध्यान रखे हुए हैं। तो आपने a, b, c, d से (b1) शाखा में परिवर्तन किया। आपने चेरी को केवल "सी" चुना। फिर भविष्य में एक बार जब आप (बी 1) से मास्टर में विलय कर देते हैं, क्योंकि "सी" परिवर्तन समान होते हैं, तो यह केवल ए, बी, डी और मर्ज "सी" परिवर्तन होगा। लेकिन यदि आप अपने मर्ज को रोलबैक करते हैं, तो आप इसमें "सी" के साथ परिवर्तन वापस जाएंगे। आपको उन्हें अलग से रोल करने की आवश्यकता होगी।
तेमन शिपाही

12
इस पर जोर दिया जाना चाहिए: उदाहरण के रूप में, दिए गए केवल अंतर (एफ - ई) को जेड पर लागू किया जाता है। यह एक संकीर्ण मामला है। चेरी-पिक का उपयोग कई गैर-आसन्न कमिट्स के बीच के सभी कमिट्स के अंतर को लागू करने के लिए किया जा सकता है। उदाहरण के लिए, ऊपर से (एफ - ई), (ई - डी), (डी - सी), और (सी - बी)। यह अंतर (एफ - बी) लागू करने के बराबर है।
थॉमस बिटोंटी

2
इसके अलावा, क्या होता है यदि चयनित कमिट (उदाहरण में एफ) में एक से अधिक तत्काल पूर्ववर्ती हैं?
थॉमस बिटोंटी

2
@ j2emanue दूसरे शब्दों में, चेरी-पिक केवल अंतिम-प्रतिबद्ध के परिवर्तन लेगा। यदि आप 3 अलग-अलग समय करते हैं, और यदि आप पिछले एक को उठाते हैं, तो यह पहली और दूसरी प्रतिबद्धताओं में परिवर्तन नहीं करेगा। मर्ज कमांड आपके सभी परिवर्तनों को ले जाएगा और आपके लक्ष्य (मास्टर) शाखा पर लागू होगा।
टेमन शिपही

157

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

इसका उपयोग करने के लिए, आपको बस आवश्यकता है git cherry-pick hash, जहां hashदूसरी शाखा से एक प्रतिबद्ध हैश है।

पूरी प्रक्रिया के लिए देखें: http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html


96

स्थिति का संक्षिप्त उदाहरण, जब आपको चेरी लेने की आवश्यकता होती है

निम्नलिखित परिदृश्य पर विचार करें। आपकी दो शाखाएँ हैं।

a) रिलीज़ 1 - यह शाखा आपके ग्राहक के पास जा रही है, लेकिन अभी भी कुछ कीड़े तय होने बाकी हैं।

बी) मास्टर - क्लासिक मास्टर शाखा, जहां आप उदाहरण के लिए रिलीज़ 2 के लिए कार्यक्षमता जोड़ सकते हैं।

अब : आप कुछ को जारी 1 में ठीक करते हैं । बेशक आपको यह फिक्स मास्टर में भी चाहिए । और यह चेरी चुनने के लिए एक विशिष्ट उपयोग-मामला है। तो इस परिदृश्य में चेरी पिक का मतलब है कि आप रिलीज़ 1 शाखा से एक कमिट लेते हैं और इसे मास्टर शाखा में शामिल करते हैं ।


3
आपको बस दूसरे तरीके की आवश्यकता हो सकती है। आपने मास्टर में एक बग तय किया और आपको रिलीज़ करने के लिए चेरी-पिक करना चाहिए। इसके अलावा वे शाखाओं के बजाय रिपोजिटरी हो सकते हैं
कैनबक्स

1
इसके लिए मर्ज का उपयोग क्यों नहीं करते?
फ्री लाइटमैन

मैं: शाखा को विमोचन के लिए तैयार करूंगा, इसे शाखा में तय करूंगा, विमोचन में शाखा का विलय करूंगा, गुरु में विमोचन करूंगा।
जैस्पर-एम

57

चेरी-पिक एक Git फीचर है। यदि कोई एक शाखा में एक लक्ष्य शाखा के लिए विशिष्ट प्रतिबद्ध करना चाहता है, तो चेरी-पिक का उपयोग किया जाता है।
git चेरी-पिक चरण नीचे दिए गए हैं।

  1. चेकआउट (स्विच टू) लक्ष्य शाखा।
  2. git cherry-pick <commit id>
    

    यहाँ प्रतिबद्ध आईडी एक और शाखा की गतिविधि आईडी है।

    git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
    
  3. लक्ष्य शाखा को धक्का

यात्रा https://git-scm.com/docs/git-cherry-pick


43

मैंने चरण-दर-चरण चित्रण तैयार किया कि चेरी-पिक क्या करती है - और इन चित्रों का एक एनीमेशन (अंत के पास)।

  1. इससे पहले कि चेरी पिकिंग
    (हम एक क्या करने जा रहे चेरी लेने के लिए प्रतिबद्ध Lशाखा से feature): यहां छवि विवरण दर्ज करें

  1. कमांड शुरू करना git cherry-pick feature~2
    ( पहले feature~22 nd कमिट है
    feature, यानी कमिट L): यहां छवि विवरण दर्ज करें

  1. कमांड करने के बाद ( git cherry-pick feature~2): यहां छवि विवरण दर्ज करें

वही एनिमेटेड: यहां छवि विवरण दर्ज करें


ध्यान दें:

प्रतिबद्ध L'है (प्रतिबद्ध = स्नैपशॉट) को देखने के उपयोगकर्ता के बिंदु से प्रतिबद्ध की सटीक प्रतिलिपि L

तकनीकी रूप से (आंतरिक रूप से), यह एक नई, अलग-अलग प्रतिबद्धता है (क्योंकि उदाहरण के लिए Lएक पॉइंटर होता है K(जैसे उसके माता-पिता), जबकि L'एक पॉइंटर होता है E)।


क्या इसका मतलब है, L 'शाखा मास्टर पर N -> M -> L होगा? या यह विशेष रूप से मास्टर शाखा पर प्रतिबद्ध एल लाएगा
प्रियांक ठक्कर

1
@PriyankThakkar, हाँ, विशेष रूप से एल , और कुछ नहीं (जैसा कि आप चित्रों / एनीमेशन से देख सकते हैं)।
मैरियनड

22

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

A rebaseएक ऐसा कमिटमेंट लेता है जिसमें एक पैरेंट X था और कमिट को फिर से बनाता है जैसे कि वास्तव में उसके पास एक Y था, और यह वास्तव में क्या cherry-pickकरता है।

चेरी पिक इस बारे में अधिक है कि आप कमिट का चयन कैसे करते हैं। साथ pull(रिबेस), Git परोक्ष क्या अपनी शाखा को खींच लिया है के शीर्ष पर अपने स्थानीय प्रतिबद्ध पुन: बनाता है, लेकिन साथ cherry-pickआप स्पष्ट रूप से कुछ के लिए प्रतिबद्ध (रों) चुनते हैं, और परोक्ष अपने वर्तमान शाखा के शीर्ष पर (उन्हें) को पुनर्जीवित।

तो जिस तरह से आप इसे करते हैं वह अलग है, लेकिन हुड के तहत वे बहुत समान संचालन हैं - कमिटेशन का उत्थान।


1
मुझे यह चीजों के लिए काफी मददगार लगता है। इसका तात्पर्य यह है कि cherry-pickजब लक्ष्य शाखा को बाद में स्रोत शाखा में वापस विलय कर दिया जाता है तो यह व्यवहार क्यों करता है। धन्यवाद महोदय।
एलुआन हद्दद

3
मैं एक सुविधा के बाद git मर्ज के बजाय चेरी पिक का उपयोग करना चाहूंगा। हर कोई हमेशा एक फीचर पूरा होने पर फीचर_ब्रांच को मर्ज कर देता है। चेरी-कमांड का उपयोग क्यों नहीं करते? क्या आपके पास कोई विचार है? यदि मैं चेरी-पिक को परेशान कर सकता हूं, तो मैं परेशान हो सकता
हूं

11

यह कॉपी की तरह है (कहीं से) और पेस्ट (कहीं से), लेकिन विशिष्ट कमिट के लिए।

यदि आप उदाहरण के लिए, एक हॉट फ़िक्स करना चाहते हैं, तो आप cherry-pickसुविधा का उपयोग कर सकते हैं ।

cherry-pickएक विकास शाखा में अपना काम करें , और mergeवह एक रिलीज शाखा के लिए प्रतिबद्ध है। इसी तरह, cherry-pickरिलीज ब्रांच से लेकर मास्टर तक करें। देखा


11

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

चेरी पिकिंग पर एक शानदार लेख मिला, इसे गहराई से जानकारी के लिए देखें: https://www.prepretnext.com.au/blog/intro-cherry-picking-git


7

यदि आप बिना प्रतिबद्ध आईडी के विलय करना चाहते हैं तो आप इस कमांड का उपयोग कर सकते हैं

git cherry-pick master~2 master~0

उपरोक्त आदेश 1 से 3 तक मास्टर के अंतिम तीन कमिट्स को मर्ज करेगा

यदि आप सिंगल कमिट के लिए ऐसा करना चाहते हैं तो अंतिम विकल्प को हटा दें

git cherry-pick master~2

इस तरह आप मास्टर के अंत से 3 वें प्रतिबद्ध का विलय करेंगे।


यह भ्रामक है। मुझे लगता है कि यहाँ आप मास्टर के अलावा किसी अन्य शाखा में हैं, है ना? और जब आपने दो कमिट्स का उल्लेख किया है तो आप जिस रेंज को चेरी-पिक करना चाहते हैं उसे परिभाषित करने के लिए <से> और <से> का उल्लेख कर रहे हैं। सही बात? यदि परिदृश्य का वर्णन किया जाए तो यह बहुत मदद करेगा। हालांकि इसके अलावा अच्छा है। धन्यवाद।
सौरभ पाटिल

6

यह आपकी वर्तमान शाखा के लिए एक विशेष प्रतिबद्ध लागू करेगा।

इसका मतलब है की :

  • इस कमेटी द्वारा जोड़ी गई सभी फाइलें जोड़ी जाएंगी
  • इस कमेटी द्वारा नष्ट की गई सभी फाइलें हटा दी जाएंगी
  • इस कमेटी द्वारा संशोधित सभी फाइलों को मर्ज कर दिया जाएगा। इसका मतलब है कि कमेटी की ओर से पूरी फाइल ही नहीं, इस कमेटी की ओर से बदलाव भी किए गए हैं।

Ex: प्रतिबद्ध एक पर विचार करें

added newFileA
modified main:
+ import './newFileA'

कमिट बी

added newFileB
modified main:
+ import './newFileB'

यदि आप किसी अन्य शाखा में बी- कॉर्ट करते हैं, तो आप इसके साथ समाप्त होंगे:

/newFileB
/main :
   import './newFileA'
   import './newFileB'

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


0

आधिकारिक डॉक्स से उद्धरण:

एक या अधिक मौजूदा कमिट्स को देखते हुए, हर एक के लिए एक नया कमिटमेंट दर्ज करते हुए, एक-एक बदलाव को लागू करें। इसके लिए आपके वर्किंग ट्री को साफ होना चाहिए (HEAD कमिट से कोई संशोधन नहीं)।

जब यह स्पष्ट नहीं होता कि परिवर्तन कैसे लागू किया जाए, तो निम्नलिखित होता है:

  1. वर्तमान शाखा और HEAD पॉइंटर सफलतापूर्वक बने अंतिम प्रतिबद्ध पर बने रहते हैं।

  2. CHERRY_PICK_HEAD रेफरी उस बिंदु पर इंगित करने के लिए सेट किया गया है जिसने परिवर्तन लागू किया है जो लागू करना मुश्किल है।

  3. वे पथ जिनमें परिवर्तन लागू किए गए हैं, दोनों को अनुक्रमणिका फ़ाइल और आपके कार्यशील ट्री में अपडेट किया गया है।

  4. परस्पर विरोधी रास्तों के लिए, अनुक्रमणिका फ़ाइल तीन संस्करणों तक रिकॉर्ड करती है, जैसा कि गिट-मर्ज के "TRUE MERGE" अनुभाग में वर्णित है। कार्यशील ट्री फ़ाइलों में सामान्य संघर्ष मार्करों <<<<<<<< और >>>>>>> द्वारा ब्रैकेट किए गए संघर्ष का विवरण शामिल होगा।

कोई अन्य संशोधन नहीं किया जाता है।

अधिक पढ़ें...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.