Search code examples
gitgit-merge

Git undo pushed merge and delete its history


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. How can I do that?


Solution

  • 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.