Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I move commits from the trunk to a branch in Git?

I made a bunch of commits to the master and realized after the fact that they should have been in a branch.

I've looked at various things about rebasing and merging and resetting the master. But no attempts at manipulation have yielded a history that looks like what I'm trying to do.

My attempts lead me to believe it requires some combination of rebase --onto and reset --hard to move the master back in time. But my understanding of Git's branching leaves something to be desired. Part of doing this is to learn how I can use it.

Should be noted none of the changes that I'm trying to move have been pushed out.

Current

  * remote/trunk
--o--a--b--c--d--e--f     <- master
  |
  o                       <- remote branch foo

Desired Outcome

  * remote/trunk
--o                       <- master
  |
  o--a--b--c--d--e--f     <- remote branch foo
like image 345
Danny Avatar asked Mar 04 '10 01:03

Danny


1 Answers

A variation on Martin's answer that won't necessarily be applicable to your situation, but I wanna post it anyway :)

Suppose you forgot to create the branch at commit o, so you have:

x--y--z--o--a--b--c--d--e--f  master
         |
         +
   [forgot to make a branch here]

And then you realized that what you really wanted was:

x--y--z--o   master
         |
         +--a--b--c--d--e--f  topic

What you can do in this case is create a branch at o using it's hash:

git branch topic # creates new branch 'topic' - will be at commit `f`
git checkout o -b newmaster # creates new branch called newmaster pointing on commit `o` (please replace `o` with the actual hash)
git branch -M newmaster master # force rename newmaster to master (means master points on hash `o`)

You'll be at the master branch (commit o), so as a last step you can:

git checkout topic

The hash of course can be just the first 5 characters ..

EDIT

It shouldn't matter much that you're using git-svn, what really matters is that you haven't published your master branch at any point after o

A branch in git is really nothing but a pointer to a commit. That's why branching is so cheap: you just create a pointer, and you have a branch.

I don't know about tracking remote branches though, you might need to set that up after renaming/moving your branches.

like image 57
hasen Avatar answered Sep 28 '22 09:09

hasen