Rollback a Git merge
GitGit Problem Overview
develop branch
--> dashboard (working branch)
I use git merge --no-ff develop
to merge any upstream changes into dashboard
git log:
commit 88113a64a21bf8a51409ee2a1321442fd08db705
Merge: 981bc20 888a557
Author: XXXX <>
Date: Mon Jul 30 08:16:46 2012 -0500
Merge branch 'develop' into dashboard
commit 888a5572428a372f15a52106b8d74ff910493f01
Author: root <root@magneto.giveforward.com>
Date: Sun Jul 29 10:49:21 2012 -0500
fixed end date edit display to have leading 0
commit 167ad941726c876349bfa445873bdcd475eb8cd8
Author: XXXX <>
Date: Sun Jul 29 09:13:24 2012 -0500
The merge had about 50+ commits in it, and I am wondering how to just revert the merge so dashboard goes back to the state pre-merge
The second part of this is, if I dont do merge with --no-ff
, I don't get the commit 'Merge branch 'develop' into dashboard' .. How would I roll that merge back?
Git Solutions
Solution 1 - Git
Reverting a merge commit has been exhaustively covered in other questions. When you do a fast-forward merge, the second one you describe, you can use git reset
to get back to the previous state:
git reset --hard <commit_before_merge>
You can find the <commit_before_merge>
with git reflog
, git log
, or, if you're feeling the moxy (and haven't done anything else): git reset --hard HEAD@{1}
Solution 2 - Git
From here:
http://www.christianengvall.se/undo-pushed-merge-git/
git revert -m 1 <merge commit hash>
Git revert adds a new commit that rolls back the specified commit.
Using -m 1
tells git that this is a merge and we want to roll back to the parent commit on the master branch. You would use -m 2
to specify the develop branch.
Solution 3 - Git
Just reset the merge commit with git reset --hard HEAD^
.
If you use --no-ff git always creates a merge, even if you did not commit anything in between. Without --no-ff git will just do a fast forward, meaning your branches HEAD will be set to HEAD of the merged branch. To resolve this find the commit-id you want to revert to and git reset --hard $COMMITID
.
Solution 4 - Git
git revert -m 1 88113a64a21bf8a51409ee2a1321442fd08db705
But may have unexpected side-effects. See --mainline parent-number
option in git-scm.com/docs/git-revert
Perhaps a brute but effective way would be to check out the left parent of that commit, make a copy of all the files, checkout HEAD
again, and replace all the contents with the old files. Then git will tell you what is being rolled back and you create your own revert commit :) !
Solution 5 - Git
If you merged the branch, then reverted the merge using a pull request and merged that pull request to revert.
The easiest way I felt was to:
- Take out a new branch from develop/master (where you merged)
- Revert the "revert" using
git revert -m 1 xxxxxx
(if the revert was merged using a branch) or usinggit revert xxxxxx
if it was a simple revert - The new branch should now have the changes you want to merge again.
- Make changes or merge this branch to develop/master