Undo a Git merge that hasn't been pushed yet
Within my master branch, I did a
git merge some-other-branch locally, but never pushed the changes to origin master. I didn't mean to merge, so I'd like to undo it. When doing a
git status after my merge, I was getting this message:
# On branch master # Your branch is ahead of 'origin/master' by 4 commits.
Based upon some instructions I found, I tried running
git revert HEAD -m 1
but now I'm getting this message with
# On branch master # Your branch is ahead of 'origin/master' by 5 commits.
I don't want my branch to be ahead by any number of commits. How do I get back to that point?
git reflog check which commit is one prior the merge (
git reflog will be a better option than
git log). Then you can reset it using:
git reset --hard commit_sha
There's also another way:
git reset --hard HEAD~1
It will get you back 1 commit.
Be aware that any modified and uncommitted/unstashed files will be reset to their unmodified state. To keep them either stash changes away or see
--merge option below.
As @Velmont suggested below in his answer, in this direct case using:
git reset --hard ORIG_HEAD
might yield better results, as it should preserve your changes.
ORIG_HEAD will point to a commit directly before merge has occurred, so you don't have to hunt for it yourself.
A further tip is to use the
--merge switch instead of
--hard since it doesn't reset files unnecessarily:
git reset --merge ORIG_HEAD
Resets the index and updates the files in the working tree that are different between <commit> and HEAD, but keeps those which are different between the index and working tree (i.e. which have changes which have not been added).
Read more... Read less...
Assuming your local master was not ahead of origin/master, you should be able to do
git reset --hard origin/master
Then your local
master branch should look identical to
It is strange that the simplest command was missing. Most answers work, but undoing the merge you just did, this is the easy and safe way:
git reset --merge ORIG_HEAD
ORIG_HEAD will point to the original commit from before the merge.
--merge option has nothing to do with the merge. It's just like
git reset --hard ORIG_HEAD, but safer since it doesn't touch uncommitted changes.)
With newer Git versions, if you have not committed the merge yet and you have a merge conflict, you can simply do:
git merge --abort
man git merge:
[This] can only be run after the merge has resulted in conflicts.
git merge --abortwill abort the merge process and try to reconstruct the pre-merge state.
You should reset to the previous commit. This should work:
git reset --hard HEAD^
HEAD^^ to revert that revert commit. You can always give a full SHA reference if you're not sure how many steps back you should take.
In case when you have problems and your master branch didn't have any local changes, you can reset to