जब यह आवागमन की एक सीमा की बात आती है, तो चेरी-पिकिंग है व्यावहारिक नहीं था ।
जैसा कि कीथ किम द्वारा नीचे उल्लेख किया गया है , Git 1.7.2+ ने कमिट की एक श्रृंखला को चेरी-पिक करने की क्षमता पेश की (लेकिन आपको अभी भी भविष्य के विलय के लिए चेरी-पिकिंग के परिणाम के बारे में पता होना चाहिए )
git चेरी-पिक "ने कई प्रकार के कमिट
(जैसे" cherry-pick A..B
"और" cherry-pick --stdin
") को चुनना सीखा , इसलिए" git revert
"; ये nicer अनुक्रमण नियंत्रण का समर्थन नहीं करते" rebase [-i]
"है, हालाँकि।
डेमियन टिप्पणियाँ और हमें चेतावनी देता है:
" cherry-pick A..B
" रूप में, A
से पुराना होना चाहिएB
।
यदि वे गलत आदेश हैं तो कमांड चुपचाप विफल हो जाएगी ।
यदि आप (समावेशी) के माध्यम से सीमाB
D
को चुनना चाहते हैं जो होगा 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^..D
Git शब्दावली में ऐसा है,
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
लेकिन वैसे भी, जब आपको कई प्रकार के कमानों को "रीप्ले" करने की आवश्यकता होती है, तो "रीप्ले" शब्द को आपको rebase
गिट की " " सुविधा का उपयोग करने के लिए धक्का देना चाहिए ।