[git] गिट के साथ एक नई शाखा में सबसे हालिया प्रतिबद्धताओं को ले जाएं


Answers

उन लोगों के लिए सोच रहा है कि यह क्यों काम करता है (जैसा कि मैं पहले था):

आप सी पर वापस जाना चाहते हैं, और डी और ई को नई शाखा में ले जाना चाहते हैं। यह पहले जैसा दिखता है:

A-B-C-D-E (HEAD)
        ↑
      master

git branch newBranch बाद git branch newBranch :

    newBranch
        ↓
A-B-C-D-E (HEAD)
        ↑
      master

git reset --hard HEAD~2 बाद - git reset --hard HEAD~2 :

    newBranch
        ↓
A-B-C-D-E (HEAD)
    ↑
  master

चूंकि एक शाखा सिर्फ एक सूचक है, मास्टर ने आखिरी प्रतिबद्धता की ओर इशारा किया। जब आपने नया ब्रांच बनाया, तो आपने आखिरी प्रतिबद्धता के लिए एक नया सूचक बनाया। फिर git reset का उपयोग करके आपने मास्टर पॉइंटर को दो कामों में वापस ले जाया। लेकिन चूंकि आपने नए ब्रांच को नहीं स्थानांतरित किया है , फिर भी यह मूल रूप से किए गए प्रतिबद्धता को इंगित करता है।

Question

मैं आखिरी कई कामों को स्थानांतरित करना चाहता हूं जो मैंने एक नई शाखा में मास्टर करने के लिए प्रतिबद्ध हैं और उन कामों से पहले मास्टर वापस लेना चाहते हैं। दुर्भाग्य से, मेरा गिट-फू अभी तक पर्याप्त मजबूत नहीं है, कोई मदद?

मैं इस से कैसे जा सकता हूं

master A - B - C - D - E

इसके लिए?

newbranch     C - D - E
             /
master A - B 



यह उन्हें तकनीकी अर्थ में "स्थानांतरित" नहीं करता है लेकिन इसका एक ही प्रभाव है:

A--B--C  (branch-foo)
 \    ^-- I wanted them here!
  \
   D--E--F--G  (branch-bar)
      ^--^--^-- Opps wrong branch!

While on branch-bar:
$ git reset --hard D # remember the SHAs for E, F, G (or E and G for a range)

A--B--C  (branch-foo)
 \
  \
   D-(E--F--G) detached
   ^-- (branch-bar)

Switch to branch-foo
$ git cherry-pick E..G

A--B--C--E'--F'--G' (branch-foo)
 \   E--F--G detached (This can be ignored)
  \ /
   D--H--I (branch-bar)

Now you won't need to worry about the detached branch because it is basically
like they are in the trash can waiting for the day it gets garbage collected.
Eventually some time in the far future it will look like:

A--B--C--E'--F'--G'--L--M--N--... (branch-foo)
 \
  \
   D--H--I--J--K--.... (branch-bar)



अभी तक केवल 2 कमांड का उपयोग करके ऐसा करने का एक और तरीका है। अपने वर्तमान काम कर रहे पेड़ को बरकरार रखता है।

git checkout -b newbranch # switch to a new branch
git push . +HEAD~3:master # make master point to some older commit 

push देने में सक्षम होने के नाते . जानना एक अच्छी चाल है।

देर से संपादित करें: अब मुझे git branch -f बारे में पता git branch -f अगर ऐसा करने का सही तरीका है:

git checkout -b newbranch # switch to a new branch
git branch -f master HEAD~3 # make master point to some older commit 

जो वही है, लेकिन कम "जादू"




बस इस स्थिति में था:

Branch one: A B C D E F     J   L M  
                       \ (Merge)
Branch two:             G I   K     N

मैंने प्रदर्शन किया:

git branch newbranch 
git reset --hard HEAD~8 
git checkout newbranch

मुझे उम्मीद थी कि प्रतिबद्धता मैं सिर होगी, लेकिन प्रतिबद्धता एल अब है ...

इतिहास में सही स्थान पर उतरने के लिए सुनिश्चित करना सुनिश्चित करें कि प्रतिबद्धता के हैश के साथ काम करना आसान हो

git branch newbranch 
git reset --hard #########
git checkout newbranch



Links