Ricky
Ricky

Reputation: 103

Create Branch and move commits from Main to Branch

I have my 'Main' repository with 8 commits

Main 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 

I would like to create a BranchA and move commits 6, 7, 8 on it:

Main 1 - 2 - 3 - 4 - 5
BranchA                \ 6 - 7 - 8

To then continue in main:

Main 1 - 2 - 3 - 4 - 5 - 9 - 10 - 11
BranchA                \ 6 - 7 - 8

Is there a command to do this directly?

If not, which is the best sequence to obtain it?

Upvotes: 0

Views: 77

Answers (1)

matt
matt

Reputation: 535586

The thing to understand here is that branches in Git are not things. They aren’t places, or collections of commits, or histories. They are just names. A branch is a name that is currently attached to some commit; and it is movable, so it can be attached to some other commit, as desired. To "make a branch" just creates a name and points it — by default to where we are right now.

And HEAD is an even simpler name; it just points (usually) at the branch name where you are working.

So, as already explained in a comment: you have

1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7 -- 8 <- main <- HEAD

So main is pointing at 8, and we are at 8. So now say git branch branchA. Now you have

1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7 -- 8 <- main <- HEAD, branchA

with both branch names pointing to 8. Note that you are still on main; you didn't checkout branchA so HEAD still points to main.

Since branchA now looks exactly the way you want it to, you can now just move main by saying git reset --hard HEAD~3. That simply lifts the main pointer and moves it, and so it gives:

                  main <- HEAD
                    |
                    v
1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7 -- 8 <- branchA

But that is topologically identical to what you want:

1 -- 2 -- 3 -- 4 -- 5 <- main <- HEAD
                     \
                      -- 6 -- 7 -- 8 <- branchA

You are still on main so just keep working: add-and-commit, add-and-commit.

1 -- 2 -- 3 -- 4 -- 5 -- 9 -- 10 <- main <- HEAD
                     \
                      -- 6 -- 7 -- 8 <- branchA

Meanwhile branchA is sitting there holding your old place at 8.

Upvotes: 1

Related Questions