2008-12-13 16 views
33

कहें कि मेरे पास एक गिट रिपोजिटरी है और मैं मास्टर पर काम कर रहा हूं, क्या मैं एक शाखा बना सकता हूं। उदाहरण के लिए:क्या एक शाखा में काम करने के सेट को पीछे हटाना संभव है?

एक - बी - सी - A1 - डी - ए 2 - ई

मैं इसे इस तरह देखो बनाना चाहते:

A - A1 - A2 
\   \ 
B - C - D - E 

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

अनिवार्य रूप से यह ऐसा कुछ है जो किसी विशेष स्थान या विषय शाखा के रूप में अच्छा होता, लेकिन ऐसा नहीं बनाया गया था।

उत्तर

15

बेशक आप कर सकते हैं। (Git के साथ वहाँ से तुम वैसे भी नहीं कर सकते ज्यादा नहीं है। :)

git checkout -b new-branch hash-of-A 
git cherry-pick hash-of-A1 
git cherry-pick hash-of-A2 

यह एक नई शाखा का निर्माण करेगा से प्रतिबद्ध A शुरू। बाद में आप वापस उसी के पास जाओ फिर से प्रतिबद्ध है, एक और शाखा बनाने:

git checkout -b new-branch2 hash-of-A 
git cherry-pick hash-of-B 
git cherry-pick hash-of-C 
git cherry-pick hash-of-D 
git cherry-pick hash-of-E 
git merge new-branch 

अब आप बस new-branch और new-branch2 विलय करने के लिए संरचना आप चाहते और अपने पुराने शाखा ड्रॉप करने के लिए है।

बेशक डस्टिन ने अभी भी क्या कहा है: प्रतिबद्धताओं के हैंश बदल जाएंगे, इसलिए आपको केवल तब ही करना चाहिए यदि आपने अभी तक अपने परिवर्तन प्रकाशित नहीं किए हैं।

+0

विलय करते हैं तो यदि मैं जिस शाखा पर था, वह मास्टर था, तो मुझे नाम मास्टर को नई शाखा 2 के सिर पर ले जाना चाहिए? समझ में आता है। धन्यवाद। – Otto

+2

रास्ता बहुत अधिक काम है। नीचे मेरा जवाब देखें। –

+1

हां, तब से मेरे इंटरैक्टिव रिबेजिंग कौशल में काफी सुधार हुआ है। :) – Bombe

6

आप पारदर्शी रूप से ऐसा नहीं कर सकते हैं क्योंकि हैश को बदलना होगा, लेकिन मूल रूप से केवल हेड को ब्रांच करना होगा और दोनों शाखाएं संबंधित परिवर्तनों को छोड़ देंगी।

0

आप वास्तव में इतिहास को फिर से लिखना चाहते हैं। प्रतिबद्धताओं के पहचानकर्ता बदल जाएंगे, और कुछ मामलों में प्रतिबद्धताओं द्वारा दिए गए परिवर्तन को बदल दिया जाएगा। तो अगर कोई मौका है कि कोई उस शाखा के पुराने संस्करण पर काम कर सकता है जिसे आप बदलना चाहते हैं, तो ऐसा करने के लिए बेहतर नहीं है। लेकिन अगर आपने इस शाखा को प्रकाशित नहीं किया है, तो नि: शुल्क महसूस करें।

आइए मान लें कि एक शाखा जिसे हम बदलना चाहते हैं उसे 'मास्टर' नाम दिया गया है, और वह बिंदु जहां हम नई शाखा शुरू करना चाहते हैं उसे 'ए' नाम दिया गया है (दिए गए उदाहरण में आप जिन नामों का उपयोग कर सकते हैं उनमें से एक है 'मास्टर ~ 6 ')।

सबसे पहले, 'ए' के ​​लिए प्रतिबद्ध से नई शाखा बनाने के लिए, यह 'फिक्स'

$ git checkout -b fixes A 

यह भी होगा शाखा 'फिक्स' वर्तमान नाम जाने की सुविधा देता है।

$ git cherry-pick A1 
$ git cherry-pick A2 

फिर हम शाखा से प्रतिबद्ध 'ए 1' और 'ए 2' निकालना चाहते: क्योंकि वहाँ केवल कुछ ही करता है कि हम संयुक्त राष्ट्र-चेरी ले करना चाहते हैं, हम चेरी शाखा 'फिक्स' पर उन्हें चुन सकते हैं 'गुरु'। क्योंकि वहाँ केवल कुछ ही प्रतिबद्ध हम निकालना चाहते हैं, और संभवतः कई और अधिक हम रखना चाहते हैं, हम का उपयोग eould कि के लिए 'Git --interactive rebase':

$ git rebase -i fixes master 

एक संपादक के साथ सक्रिय होने का सब 'ए' प्रतिबद्ध करने के बाद 'मास्टर' में काम करता है (जो आम प्रतिबद्धता है अर्थात शाखा 'मास्टर' और शाखा 'फिक्स' का आधार आधार)।सूची इस प्रकार दिखाई देगा:, प्रतिबद्ध 'ए 1' और 'ए 2' के साथ

pick deadbee B 
pick fa1afe1 C 
pick a98d4ba A1 
... 

निकालें लाइनें (या अन्यथा रिबेस inetractive में परिवर्तन भेज) में परिवर्तन, करीब संपादक बचाने के लिए और Git को छोड़कर अन्य सभी प्रतिबद्ध पुन: लागू होता है कि आप हटा दिया है

तो फिर तुम को अंतिम रूप देने के साथ

$ git merge fixes 

(Git-रिबेस फिर से लिखा शाखा 'गुरु' पर हमें छोड़) कर सकते हैं।

84

यदि आप शाखा में होने के बाद XXX के संशोधन के बाद सभी काम करना चाहते हैं, तो मुझे अन्य प्रस्तावित तरीकों से यह बहुत आसान लगता है।

$ git branch fixes  # copies master to new branch 
$ git reset --hard XXX # resets master to XXX 

इस के तहत reset के लिए Git का सहायता पृष्ठ में वर्णित है "एक प्रतिबद्ध पूर्ववत करें, यह एक विषय शाखा कर रही है"।

+0

खुशी है कि मैंने अंतिम जवाब को पढ़ा! - यह अब तक का सबसे आसान समाधान है (कम से कम मेरे विशेष उपयोग मामले के लिए) –

+3

मैं इस सप्ताह दूसरी बार इस उत्तर में वापस आ गया हूं। काश मैं @alltom एक और वोट दे सकता हूँ! –

+5

उस _XXX_ के लिए एक उपयोगी मूल्य केवल 'मूल/मास्टर' है: मान लीजिए कि आप 'मास्टर' शाखा पर थे, सभी अप्रकाशित काम करें और उन्हें इसके बजाय शाखा के रूप में देखें। वास्तव में आप अपनी नई शाखा में वापस स्विच करने के अंत में शायद 'चेकआउट फिक्स' को गिट करना चाहते हैं। –

1

उन सभी चेरी-पिकिंग को भूल जाओ। बस दोबारा दोबारा बदलाव करें, प्रत्येक बार एक नई शाखा बनाते हैं और फिर 2.

+0

ओह .. डस्टिन पहले से ही उसी तरह उत्तर दिया .. –