2010-12-14 17 views
16

"पूर्ववत करें" करने के लिए स्थिति: A में मास्टर के साथ शुरू मैं शाखाओं और बनाया B में कुछ बदलाव तो उस शाखा वापस विलय कर दिया (C) में। कुछ और बदलाव करने के बाद मैं D पर था लेकिन पाया कि मुझे शाखा में हुए बदलावों के बिना कोड को तैनात करने की आवश्यकता है। अगर मैं इसे विलय नहीं करता तो यह ठीक होता।Git: कैसे किसी मर्ज

A_______C___D 
\ /
    \_B_/ 

सबसे पहले मैं पता है कि मैं के रूप में अगर मर्ज कभी नहीं हुआ कोड तैनात करने के लिए यहां से किया जाना चाहिए चाहते हैं। नोट: शाखा में संपादित की गई फ़ाइलों में से कोई भी मास्टर में संपादित नहीं किया गया है।

दूसरे

...

मैं इस से निपटने के लिए सबसे अच्छा तरीका बाहर काम करने के लिए समय नहीं था, इसलिए मैं फ़ाइलों जो शाखा जोड़ा नष्ट कर दिया, और मैन्युअल रूप से वापस लाया गया तो शाखा में किए गए कुछ संपादन तैनाती के लिए परिणाम के लिए प्रतिबद्ध (F)

A_______C___D___F 
\ /
    \_B_/ 

मैं शाखा के विकास रखने के लिए और में यह तारीख तक रखने के लिए गुरु से कोई भी परिवर्तन मर्ज करने के लिए सक्षम होना चाहते हैं, लेकिन अगर मैं ऐसा है कि सामान मैंने किया F बनाने के लिए विलय हो जाएगा और फ़ाइलों को हटाया जाएगा और संपादन को वापस लाया जाएगा। इससे निपटने का सबसे अच्छा तरीका क्या है?

उत्तर

16

आप ऐसा करने के लिए कि एक ही चरण में rebase उपयोग कर सकते हैं:

git rebase --onto A C D 

मैं सिर्फ यह परीक्षण किया है, उचित परिणाम के साथ। तब:

$ git rebase --onto <SHA1-for-A> <SHA1-for-C> master 

rebases में महारत हासिल करने, ए पर मैं के बाद से मैं बी और डी में एक ही स्थानों पर संशोधित कुछ मतभेद को ठीक करने के लिए आवश्यक सी (छोड़कर) से करता है, लेकिन मुझे लगता है आप नहीं होगा।

_D' 
/
/
A_______C___D 
\ /
    \_B_/ 

डॉक्टर के बारे में git rebase --onto है, जो कम या ज्यादा अपनी स्थिति है: http://git-scm.com/docs/git-rebase


यदि आप था:

A_______C___D___F 
\ /
    \_B_/ 

, तो आप अब है:

_D'___F'_(master) 
/
/
A_______C___D___F 
\ /
    \_B_/(the_branch) 

यहां से, शाखा में मास्टर में परिवर्तन विलय करना आसान है। प्रतिबद्धता F' पूरी तरह से छोड़ दें।

$ git checkout master # if you were not here already 
$ git branch old_fix # if you want to be able to return to F' later 
$ git reset --hard <SHA1-to-D'> 

आप ऊपर बताए गए आदेशों के बाद है:

 (master) 
    /
    _D'___F'_(old_fix) 
/
/
A_______C___D___F 
\ /
    \_B_/(the_branch) 

the_branch में गुरु के अपडेट मर्ज करने के लिए:

$ git checkout the_branch 
$ git merge master 

... और संघर्ष को ठीक।

+0

बहुत बढ़िया, धन्यवाद! मैं भविष्य में इसका उपयोग करूंगा (अगर मेरे विलय के साथ अधिक सावधान रहना काम करने में विफल रहता है)। मैंने जो किया उसके लिए @ टर्मिनस का उत्तर देखें। मुझे लगता है कि यह आपके उत्तर के समान परिणाम प्राप्त हुआ है। – Jake

6

स्पष्ट समाधान A पर रीसेट करना है, सभी पैच मैन्युअल रूप से दोबारा लागू करें और विवादों को हल करें (जो आपके पास नहीं होगा)।

वैकल्पिक रूप से आप केवल git revert पैच B कर सकते हैं लेकिन यह एक नई प्रतिबद्धता बनाएगा।

हालांकि गौथियर का उत्तर बेहतर है। आप इस स्थिति को आप वर्णित है यहाँ से

$ edit test.txt 
$ git add . 
$ git commit -mA 
$ git checkout -b the_branch 
$ edit test.txt 
$ git commit -a -mB 
$ git checkout master 
$ git merge master the_branch --no-ff 
$ edit test.txt 
$ git commit -a -mD 

:

+0

धन्यवाद, इसे पढ़ने के बाद मैंने पैच में देखा और यहां समाप्त हो गया: http://www.gitready.com/intermediate/2009/03/04/pick-out-individual-commits.html तो मैंने ए को ब्रांच किया और चेरी द्वारा उठाए गए डी और एफ, फिर परिणाम को मूल शाखा में लाने के लिए इसे अद्यतित कर दिया। – Jake

+0

क्या आप वास्तव में चेरी चुनते थे? मैंने सोचा कि एफ केवल बी और सी को पीछे हटाना था, इसलिए सी के बाद इसका कोई लेना-देना नहीं था? – Gauthier

+0

क्षमा करें, अब मुझे यकीन नहीं है। शायद मैंने किया लेकिन वास्तव में जरूरत नहीं थी। – Jake

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