I made an accidental merge to master and pushed it, now master has all the commits from dev. I want to revert the commits from master and delete its history without changing dev
The last commit can be removed with: git reset --hard HEAD^
.
Sometimes there might be situations, when you need to remove a commit from the "middle" of branch. Here comes to the rescue interactive rebase: git rebase -i <commit>^
. You just need to drop an unwanted commit (it should appear at the top of the list).
If the changes you undone were available in remote, they also should be removed from there with force push: git push --force
.
However, rewriting the history of a branch, that has been shared with someone, is not a good way of undoing changes. Instead, consider to use git revert <commit>
. This is the more robust and correct way in this situation.
I'd recommend to read Git Branching - Rebasing. Chapter "The Perils of Rebase" is explaining why rewriting the public history is not a good idea.
You could use the reflog
to find out where was master pointing to before the merge, and use the reset
command to reset it to that. The commits won't be deleted because there're still in dev, but master won't have them. If you really want to delete those, i.e., also reset dev, you may do, and the orphan commits will eventually be garbage-collected.
Here's an example, but don't just use it as a recipe, rather, read some more about Git and how Git works (git structures) and practice elsewhere (other branches / other repos), and when you're confident come back to this one and try.
Recovering lost commits