Reset/revert a whole branch to another branches state?
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
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.
As others have shown it is true that a git reset --hard
will make branch B look exactly like branch A. However, this will delete B's history. A different approach, which avoids this problem, is to create and apply a patch file:
git checkout A
git diff B > /tmp/AtoB.patch # Generate changes needed to make B match the current branch A
git checkout B
git apply /tmp/AtoB.patch # Update files to match the state of A
git add -A # Track any deleted or newly created files
git commit -a -m "Make B match A" # Commit the changes
Now we're not "rewriting history" so there will be no controversy when you push to origin. This approach has the benefit that the syncing is a discrete commit in B's history that could be reverted at any time. NOTE however that the commit history from branch A is lost in the translation.
BTW: If you get an error about binary files, add the --binary flag to your diff command like this
git diff --binary B > /tmp/AtoB.patch