Reputation: 103
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
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