49

I have been working in straight line:

A---B---C---D---E---F (master:HEAD)

Now I want to move backward:

git checkout C

and move few last commits to a new branch:

Option 1:

          D---E---F (new:HEAD)
         /
A---B---C (master)

Option 2:

          F (new:HEAD)
         /
A---B---C (master)

How to rebase to Option 1 and how to Option 2?

Phil Miller
  • 36,389
  • 13
  • 67
  • 90
takeshin
  • 49,108
  • 32
  • 120
  • 164

1 Answers1

81

To get from your first diagram (master = HEAD = F) to option 1:

git branch new        # Make a 'new' branch pointing at HEAD, which is F
git reset --hard C    # Move master back to point at C
git checkout new      # Make HEAD follow new, and get F in the working tree

And from option 1 to option 2 (picking up where the above left off),

git rebase -i master  # Start the process of re-jiggering this branch
# edit the commit list that opens up to only include F
# save and exit
# resolve potential conflicts from missing changes in D and E

To go directly from your starting point to option 2:

git checkout -b new C  # Start the 'new' branch at C
git cherry-pick F      # Include F on it
git checkout master    # Switch back to master
git reset --hard C     # Rewind master to the earlier commit
Phil Miller
  • 36,389
  • 13
  • 67
  • 90
  • 2
    Thanks :) Also, +1 for "re-jiggering"! – dokkaebi Dec 21 '12 at 22:54
  • 3
    If you get an error "Updates were rejected because the tip of your current branch is behind its remote counterpart" when trying to push master, you need to use the --force option: `git push --force origin master` – Tamlyn Feb 27 '13 at 11:18