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





5 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 का उपयोग करके आपने मास्टर पॉइंटर को दो कामों में वापस ले जाया। लेकिन चूंकि आपने नए ब्रांच को नहीं स्थानांतरित किया है , फिर भी यह मूल रूप से किए गए प्रतिबद्धता को इंगित करता है।

git git-branch branching-and-merging

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

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

master A - B - C - D - E

इसके लिए?

newbranch     C - D - E
             /
master A - B 



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

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

पुराना संस्करण - इससे पहले कि मैंने git branch -f बारे में सीखा

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

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




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

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)



इतिहास को फिर से लिखने के बिना ऐसा करने के लिए (यानी यदि आपने पहले से ही काम किया है):

git checkout master
git revert <commitID(s)>
git checkout -b new-branch
git cherry-pick <commitID(s)>

तब दोनों शाखाओं को बल के बिना धकेल दिया जा सकता है!




1) एक नई शाखा बनाएं, जो आपके सभी परिवर्तनों को new_branch में ले जाती है।

git checkout -b new_branch

2) फिर पुरानी शाखा में वापस जाओ।

git checkout master

3) गिट रिबेस करें

git rebase -i <short-hash-of-B-commit>

4) फिर खुले संपादक में पिछले 3 प्रतिबद्ध जानकारी शामिल हैं।

...
pick <C's hash> C
pick <D's hash> D
pick <E's hash> E
...

5) उन सभी 3 कामों में drop लिए pick बदलें। फिर संपादक को सहेजें और बंद करें।

...
drop <C's hash> C
drop <D's hash> D
drop <E's hash> E
...

6) अब मौजूदा शाखा ( master ) से पिछले 3 काम हटा दिए गए हैं। शाखा शाखा से पहले + हस्ताक्षर के साथ शाखा को बलपूर्वक धक्का दें।

git push origin +master



Related