2012-03-18 14 views
28

मैं दो Git शाखाओं, "ए" और "बी", है और गिने करता है 1 8. के ​​माध्यम से मेरे इतिहास इसGit: चलती शाखा सिर

1 -> 2 -> 3 -> 4[A] -> 5 -> 6 -> 7 -> 8[B] 

मैं तो अपने इतिहास दिखता है इसे बदलना चाहते तरह लग रहा है इस तरह:

1 -> 2 -> 3 -> 4 -> 5 -> 6[A] -> 7 -> 8[B] 

यही है, मैं शाखा एक के सिर को स्थानांतरित करने के लिए प्रतिबद्ध से 4 चाहते प्रतिबद्ध करने के लिए 6.

क्या आदेशों मैं यह करने के लिए उपयोग करते हैं?

उत्तर

41

आप चला सकते हैं:

git branch -f A 6 
+1

यह इस स्थिति में काम करता है क्योंकि वास्तव में कुछ भी नहीं है; यह सिर्फ शाखा बिंदु को इंगित करता है और इसलिए हम कुछ भी खोए बिना कहीं और सूचक को स्थानांतरित करते हैं। मान लीजिए ए ने कुछ काम किया है? फिर आपको काम करने के लिए 'गिट रिबेस' करना होगा। यह अधिक सामान्य है और इसे "खाली शाखा" मामूली मामला भी संभालना चाहिए। – Kaz

+4

@ काज़, गिट में हल्के शाखाएं हैं, इसलिए वे कभी भी "शामिल" नहीं होते हैं। वे एक प्रतिबद्धता से जुड़े एक चलती चिपचिपा नोट हैं। मेरा जवाब इस परिदृश्य के लिए है, एक रैखिक शाखा इतिहास।यदि यह रैखिक नहीं था, तो मैं देखता हूं कि ओपी वास्तव में क्या चाहता था और समाधान के साथ आया। –

+0

आप तब भी सीवीएस के बारे में कह सकते हैं। एक शाखा में कुछ भी शामिल नहीं है। यह सिर्फ एक शाखा टैग ("चिपचिपा नोट") है जो 1.2.0.2 जैसे शाखा संख्या को दर्शाता है। क्या सीवीएस में हल्के वजन की शाखा है? :) – Kaz

13
git checkout A 
git reset --hard 6 
+6

यह काम करता है [एक] 4 से सूचक चलती है, लेकिन "मुश्किल तरीके से" है। इसका कारण यह है कि यदि आप "शाखा में" हैं (गिट शर्तों में), 'गिट रीसेट - ' आपके लिए शाखा को ले जाता है। लेकिन 'गिट शाखा-एफ 'एक चरण में शाखा को फिर से इंगित करता है। एक सीमा है: 'गिट शाखा-एफ' आपको अपनी वर्तमान शाखा को स्थानांतरित नहीं करने देगी। तो यदि आप पहले से ही "शाखा ए पर" हैं (जैसा कि 'गिट शाखा' आउटपुट द्वारा दिखाया गया है) तो आपको इस 'गिट रीसेट - हार्ड' विधि का उपयोग करने की आवश्यकता है। (या शाखा ए से निकल जाओ, लेकिन यह मूर्खतापूर्ण हो रहा है। :-)) – torek

7

यह रिबेस के एक विशेष मामला है सिर्फ इतना है कि शाखा खाली है:

git checkout A 
git rebase B 

rebase अधिक सामान्य है; यह इस मामले में भी संभालता है:

से पहले:

    A1 -> A2 -> [A] 
       /
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8[B] 

के बाद:

         A1' -> A2' -> [A] 
            /
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8[B] 

A1 'और A2 की मूल शाखा पर 4 और 8 के बीच का अंतर के लिए खाते विलय कर रहे हैं।

गिट रिबेस बिना किसी परेशानी के इस मामूली मामले को संभालता है। मैंने master पर दो प्रतिबद्धताओं के साथ एक रेपो बनाया और पहली प्रतिबद्धता की ओर इशारा करते हुए एक शाखा br शाखा बनाई।

$ git checkout br 
Switched to branch 'br' 
$ git rebase master 
First, rewinding head to replay your work on top of it... 
Fast-forwarded br to master. 

Poof, किया गया। लॉग अब दूसरी प्रतिबद्धता की ओर इशारा करते हुए शाखा दिखाता है।

हम भी हासिल कर सकते हैं इस "के बाद": [इस ओर इशारा करते हुए के लिए एम Flaschen करने के लिए धन्यवाद याद आ रही थी]:

      A1'' -> A2'' -> [A] 
         /
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8[B] 

शाखा बी में रिबेसिंग के बजाय, हम विशिष्ट नाम हैं 6 प्रतिबद्ध है, जैसे

git checkout A 
git rebase 6 # rather than rebase B 

कोई A1 देखते हैं और A2 करता है, तो यह मूल प्रश्न को कम कर देता है: 6.

+0

पहले मामला प्रश्न से मेल नहीं खाता है। प्रश्न में, कोई काम केवल ए –

+0

पर नहीं है, इससे पहले मामला प्रश्न का सामान्यीकरण है। ए 1 और ए 2 मौजूद नहीं है। एक खाली सूची एक सूची है। – Kaz

+1

आपका केस भी मेल नहीं खाता है। [ए] 6 की बजाय 8 की ओर इशारा कर रहा है। साथ ही, मुझे यकीन नहीं है कि यह सामान्यीकरण मूल प्रश्न का उत्तर देने में मदद करता है। –

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