A. Rebase --onto
The official https://git-scm.com/docs/git-rebase covers exactly this scenario:
Here is how you would transplant a topic branch based on one branch to another, to pretend that you forked the topic branch from the latter branch, using rebase --onto
.
First let’s assume your topic is based on branch next. For example, a feature developed in topic depends on some functionality which is found in next.
o---o---o---o---o master
\
o---o---o---o---o next
\
o---o---o topic
We want to make topic forked from branch master; for example, because the functionality on which topic depends was merged into the more stable master branch. We want our tree to look like this:
o---o---o---o---o master
| \
| o'--o'--o' topic
\
o---o---o---o---o next
We can get this using the following command:
git rebase --onto master next topic
B. No rebase option
The steps below are more manual but their beauty is that they are very very simple to understand.
I. Get commit X to branch 4
> git checkout 4
> git cherry-pick commitX
II. Get rid of commit X from branch 5
Option 1. > git reset HEAD~1 --hard
Option 2. > git revert commitX