जब यह आवागमन की एक सीमा की बात आती है, तो चेरी-पिकिंग है व्यावहारिक नहीं था ।
जैसा कि कीथ किम द्वारा नीचे उल्लेख किया गया है , Git 1.7.2+ ने कमिट की एक श्रृंखला को चेरी-पिक करने की क्षमता पेश की (लेकिन आपको अभी भी भविष्य के विलय के लिए चेरी-पिकिंग के परिणाम के बारे में पता होना चाहिए )
git चेरी-पिक "ने कई प्रकार के कमिट
(जैसे" cherry-pick A..B"और" cherry-pick --stdin") को चुनना सीखा , इसलिए" git revert"; ये nicer अनुक्रमण नियंत्रण का समर्थन नहीं करते" rebase [-i]"है, हालाँकि।
डेमियन टिप्पणियाँ और हमें चेतावनी देता है:
" cherry-pick A..B" रूप में, Aसे पुराना होना चाहिएB ।
यदि वे गलत आदेश हैं तो कमांड चुपचाप विफल हो जाएगी ।
यदि आप (समावेशी) के माध्यम से सीमाBD को चुनना चाहते हैं जो होगा B^..D। एक उदाहरण के रूप में " पिछले कमिट की सीमा से शाखा बनाएं
" देखें ।
जैसा कि जुबब्स ने टिप्पणियों में उल्लेख किया है :
यह मानता है कि Bजड़ नहीं है; unknown revisionअन्यथा आपको " " त्रुटि मिलेगी ।
नोट: Git 2.9.x / 2.10 (Q3 2016) के रूप में, आप एक अनाथ शाखा (खाली सिर) पर सीधे प्रतिबद्ध की एक श्रृंखला को चुन सकते हैं: " मौजूदा शाखा को git में एक अनाथ कैसे बनाएं " देखें।
मूल उत्तर (जनवरी 2010)
एक rebase --ontoबेहतर होगा, जहाँ आप अपने एकीकरण शाखा के शीर्ष पर प्रतिबद्ध की दी गई श्रेणी को पुन: चलाने, के रूप में चार्ल्स बेली यहाँ वर्णित ।
(यह भी देखें, "यहाँ आप एक शाखा के आधार पर एक विषय शाखा को दूसरे शाखा में कैसे रोपित करेंगे " git rebase man पेज में , व्यावहारिक उदाहरण देखें git rebase --onto)
यदि आपकी वर्तमान शाखा एकीकरण है:
# Checkout a new temporary branch at the current location
git checkout -b tmp
# Move the integration branch to the head of the new patchset
git branch -f integration last_SHA-1_of_working_branch_range
# Rebase the patchset onto tmp, the old location of integration
git rebase --onto tmp first_SHA-1_of_working_branch_range~1 integration
के बीच सब कुछ फिर से खेलना होगा:
first_SHA-1_of_working_branch_range(इसलिए ~1) के माता-पिता के बाद : पहली बार आप फिर से खेलना चाहते हैं
- "
integration" तक (जो कि अंतिम बार आपको workingशाखा से फिर से खेलना चाहते हैं ) की ओर इशारा करता है।
को " tmp" (जो integrationइंगित करता है कि पहले कहां इंगित किया गया था)
यदि कोई संघर्ष तब होता है, जब उनमें से एक फिर से शुरू होता है:
- या तो इसे हल करें और "
git rebase --continue" चलाएँ ।
- या इस पैच को छोड़ें, और इसके बजाय "
git rebase --skip" चलाएँ
- या "
git rebase --abort" के साथ सभी चीज़ों को रद्द करें (और integrationशाखा को शाखा में वापस रखें tmp)
उसके बाद rebase --onto, integrationएकीकरण शाखा के अंतिम प्रतिबद्ध पर वापस आ जाएगा (यह " tmp" शाखा + सभी पुनरावृत्त कमिट है)
चेरी-पिकिंग के साथ या rebase --onto, यह मत भूलो कि बाद के मर्ज पर इसके परिणाम हैं, जैसा कि यहां वर्णित है ।
एक शुद्ध " cherry-pick" समाधान पर यहां चर्चा की गई है , और इसमें कुछ शामिल होगा:
यदि आप एक पैच दृष्टिकोण का उपयोग करना चाहते हैं तो "git format-पैच | git am" और "git cherry" आपके विकल्प हैं।
वर्तमान में, git cherry-pickकेवल एक ही प्रतिबद्ध स्वीकार करता है, लेकिन आप रेंज लेने के लिए चाहते हैं, तो Bके माध्यम से Dहै कि हो सकता है B^..DGit शब्दावली में ऐसा है,
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
लेकिन वैसे भी, जब आपको कई प्रकार के कमानों को "रीप्ले" करने की आवश्यकता होती है, तो "रीप्ले" शब्द को आपको rebaseगिट की " " सुविधा का उपयोग करने के लिए धक्का देना चाहिए ।