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?
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.