To undo a git merge, you need to find the commit ID of your last commit. Then, you need to use the git reset command to reset your repository to its state in that commit. There is no “git revert merge” command.
Using git reset to Undo a Merge This means that any local changes in your Working Copy will be discarded; if you have valuable uncommitted changes, be sure to use git stash before.
Revert a merge request After you select that button, a modal appears where you can choose to revert the changes directly into the selected branch or you can opt to create a new merge request with the revert changes. After the merge request has been reverted, the Revert button is no longer available.
simply run git reset --hard to revert all those changes.
You have to "revert the revert". Depending on you how did the original revert, it may not be as easy as it sounds. Look at the official document on this topic.
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
to allow:
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
But does it all work? Sure it does. You can revert a merge, and from a purely technical angle, git did it very naturally and had no real troubles.
It just considered it a change from "state before merge" to "state after merge", and that was it.
Nothing complicated, nothing odd, nothing really dangerous. Git will do it without even thinking about it.So from a technical angle, there's nothing wrong with reverting a merge, but from a workflow angle it's something that you generally should try to avoid.
If at all possible, for example, if you find a problem that got merged into the main tree, rather than revert the merge, try really hard to:
- bisect the problem down into the branch you merged, and just fix it,
- or try to revert the individual commit that caused it.
Yes, it's more complex, and no, it's not always going to work (sometimes the answer is: "oops, I really shouldn't have merged it, because it wasn't ready yet, and I really need to undo all of the merge"). So then you really should revert the merge, but when you want to re-do the merge, you now need to do it by reverting the revert.
Let's assume you have such history
---o---o---o---M---W---x-------x-------*
/
---A---B
Where A, B failed commits and W - is revert of M
So before I start fixing found problems I do cherry-pick of W commit to my branch
git cherry-pick -x W
Then I revert W commit on my branch
git revert W
After I can continue fixing.
The final history could look like:
---o---o---o---M---W---x-------x-------*
/ /
---A---B---W---W`----------C---D
When I send a PR it will clearly shows that PR is undo revert and adds some new commits.
To revert the revert without screwing up your workflow too much:
Your feature branch should now be able to be merged as normal when you're ready for it. The only downside here is that you'll a have a few extra merge/revert commits in your history.
To revert a revert in GIT:
git revert <commit-hash-of-previous-revert>
Instead of using git-revert
you could have used this command in the devel
branch to throw away (undo) the wrong merge commit (instead of just reverting it).
git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE
This will also adjust the contents of the working directory accordingly. Be careful:
git-reset
. All commits after the one you specify as
the git reset
argument will be gone!I recommend to study the git-reset
man-page carefully before trying this.
Now, after the reset you can re-apply your changes in devel
and then do
git checkout devel
git merge 28s
This will be a real merge from 28s
into devel
like the initial one (which is now
erased from git's history).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With