I have a branch A and a branch B (and some other branches).
Lets say A's commit history looks like:
- commit 5
- commit 4
- commit 3
- ...
And B's commit history:
- some other commit
- commit 4
- merge of other stuff from branch C (into branch B)
- commit 3
- ...
Basically what I want is to "delete" all changes made by the commits some other commit and merge of other stuff from branch C to branch B.
I want the working tree of branch B to be exactly the same like branch A's working tree.
How do I achieve this?
One way to achieve this is through git reset
. While on branch B
execute
git reset --hard A
Thereafter, branch B
points to the head-commit of A
. The --hard
option resets the index and working tree so that all tracked files are reset to the version in branch A
. The old HEAD commit-ID of A
is stored in .git/ORIG_HEAD
in order to allow undoing the change.
Alternatively - while not on branch B
- you can delete branch B
and re-created it like this:
git branch -d B # delete branch B
git branch B A # re-create branch B and let it point to the commit of branch A
Other than the first suggestion, this will leave the index and working tree untouched.
If you want your branch B
to look exactly like branch A
. You could just do a reset --hard
git checkout branch-B
git reset --hard branch-A
Be careful you will lose commits in this case. Your branch-B will look exactly like branch-A, whatever commits were made to branch-B, that were not present in branch-A, will be lost. Also if branch-B is shared with other people, its not recommended to perform this operation.
In that case you could try reverting the commits you don't want in branch-B
git revert <sha-of-"some other commit">
git revert <sha-of-"merge of other stuff from branch C (into branch B)">
The second commit looks like a merge commit so you might have to pass the parent as well.
git revert <sha-of-"merge of other stuff from branch C (into branch B)"> -m1
For completion, let's add this very simple way to achieve it :
git branch -f branchB branchA
It takes advantage of the fact that branches in git are mere pointers. This command just replaces the ref to the tip commit of one branch with another. No need to go into complex structure changes to build something you already have.
来源:https://stackoverflow.com/questions/28774194/reset-revert-a-whole-branch-to-another-branches-state