2010-09-21 8 views
26

उदाहरण के लिए, मेरे पास dev शाखा और stable शाखा है।गिट चेरी पिकिंग के लिए ट्रैकिंग मर्ज करें?

यदि मैंने चेरी को dev से stable पर कई प्रतिबद्धताओं को चुना है।

वहाँ Git चेरी उठाया प्रतिबद्ध के बारे में पता करते हैं और इसकी दोगुना-विलय अगर मैं बाद में विलय से बचने के लिए कोई तरीका है, rebase या एक ओवरलैप रेंज, dev से वापस stable लिए चेरी लेने?

+0

जबकि आपके पास ऐसा करने का एक अच्छा कारण है, तो आमतौर पर चेरी को शाखा में बहुत से काम करने के लिए यह एक बुरा विचार है। –

उत्तर

5

वहाँ वास्तव में एक आदेश Git cherry नामित प्रिंट है कि हर प्रतिबद्ध है कि दो शाखाओं के बीच विलय नहीं किया जाता है।

प्रत्येक मुद्रित प्रतिबद्धता के लिए, "+" संकेत का अर्थ है कि आप इसे विलय कर सकते हैं, "-" संकेत का अर्थ है कि आप पहले से ही चेरी चुनते हैं।

आउटपुट सुंदर होने से बहुत दूर है।

जो लोग SVN से आया है और svnmerge.py किया जाता है के लिए, मैं Git के लिए "-l svnmerge लाभ" बराबर बैश स्क्रिप्ट एक बना दिया है कि मैं gitavail कहा जाता है,:,

#!/bin/bash 

# get current branch 
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) 

# get tracked branch (1st argument), if no arg or arguments are only options, assume master 
if test -z $1 || grep -q '^-' <<< $1; 
then TRACKED_BRANCH=master 
else TRACKED_BRANCH=$1; shift 
fi 

# Log commits available for merge from tracked branch 
LOG_OPTIONS=$* 
for i in $(git cherry $CURRENT_BRANCH $TRACKED_BRANCH | egrep '^\+' | awk '{print $2}'); do git --no-pager log -n1 $i ${LOG_OPTIONS}; echo; done 

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

gitavail --name-status 

और तुम बहुत समान करने के लिए "svnmerge लाभ -l" एक निर्गम होगा।

मुझे लगता है कि चेरी-पिक कामों को मैन्युअल रूप से संशोधित नहीं किया जाना चाहिए (संघर्षों के बारे में क्या?), अगर patch id परिवर्तन, गिट चेरी को यह नहीं पता होगा कि प्रतिबद्धता पहले से ही चेरी-चुने गए हैं।

+0

हालांकि मुझे यह कोशिश करने का मौका नहीं मिला है, लेकिन ऐसा लगता है कि यह वही करता है जो मैं चाहता हूं। :) +1 और स्वीकृत उत्तर आपको जाता है :) –

9

git cherry-pick एक अजीब बजाय git mergegit rebase का मामला है (जिसके लिए एक बुनियादी मर्ज SVN में ट्रैकिंग सुविधा है), तो यह वास्तव में प्रतिबद्ध पुनर्लेखन आप चेरी उठाया तो यह शाखा के शीर्ष करने के लिए एक ही परिवर्तन लागू होंगे आप चेरी में उठाया। चूंकि गिट की प्रतिबद्धता आईडी प्रतिबद्धता की सामग्री पर आधारित होती है, इसलिए नई प्रतिबद्धता में एक अलग आईडी होती है और इसलिए इसे गिट द्वारा पूरी तरह से अलग प्रतिबद्ध माना जाता है।

git merge, दूसरी ओर, एक विलय प्रतिबद्ध बनाता है; यह वह माध्यम है जिसके द्वारा गिट ट्रैकिंग मर्ज ट्रैकिंग लागू करता है। एक विलय प्रतिबद्धता एक बिंदु को चिह्नित करती है जिस पर दो (या अधिक) अलग-अलग इतिहास एकत्रित होते हैं। स्पष्ट रूप से विलय प्रतिबद्धता बनाने के लिए git cherry-pick [commit-id] के बजाय git merge [commit-id] पर कॉल करना स्वीकार्य है, लेकिन यह न केवल चेरी द्वारा उठाए गए प्रतिबद्धताओं के प्रभाव को भी लाता है बल्कि उस शाखा के अलग-अलग इतिहास में परिवर्तनों का पूरा सेट भी लाता है।

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

+1

बस निष्कर्ष निकालना: चेरी द्वारा उठाए गए कामों को ट्रैक करने का कोई तरीका नहीं है। हालांकि डबल-विलय आमतौर पर जीआईटी में कोई समस्या नहीं है, क्या यह सही है? मैं बाद के बयान के बारे में थोड़ा अनिश्चित महसूस करता हूं। मुझे जीआईटी के डिजाइन में कुछ विशेष नहीं दिखता है जो डबल वर्जन को अन्य संस्करण नियंत्रण प्रणाली (जैसे, एसवीएन) –

+0

@ एड्रियन के रूप में कम परेशानी बनाता है: डबल-मेर्गिन के लिए सहमत हैं। एक संभावित समस्या है यदि दो (समान) विलय लक्ष्य में कुछ बदल जाता है। – schoetbi

12

यह भी उल्लेखनीय है कि -xcherry-pick के लिए ध्वज प्रतिबद्ध संदेश के अंत तक मूल प्रतिबद्धता का एसएचए जोड़ता है।

मैं प्रतिबद्ध सारांश के अंत में संक्षेप में एसएचए जोड़ना चाहता हूं, ताकि लॉग को देखते समय चेरी-उठाए गए प्रतिबद्ध को मूल के साथ जोड़ना आसान हो। -s साइनऑफ ध्वज के साथ, चेरी पिक किसने किया था, यह भी संकेत दे सकता है।

उदाहरण:

> git cherry-pick -sex 27d4985

#333: fixes all the things (27d4985) 

- how it fixes all the things 

(cherry picked from commit 27d49855238364d0184ad344884a366b5b16e) 

Signed-off-by: Chuck Norris <[email protected]> 
+1

+1 उत्कृष्ट अंक। –

संबंधित मुद्दे