How to undo a git merge

Greg Foster
Greg Foster
Graphite software engineer


Note

This guide explains this concept in vanilla Git. For Graphite documentation, see our CLI docs.


Undoing a merge is useful when you encounter issues after a merge has been executed. There are various scenarios where you might want to undo a merge, such as when a merge conflict occurs, a merge has been pushed accidentally, or you've merged the wrong branches.

This guide will cover multiple methods to undo a merge in Git, depending on the scenario you might face.

If you have just merged two branches and realized you need to undo it, and the merge has not been pushed to the remote repository, you can use the git reset command:

Terminal
git reset --hard HEAD~1

This command resets your branch to the state it was in just before the merge. HEAD~1 moves the current branch back by one commit.

Keep in mind that the --hard flag makes the reset a destructive command. Any changes to local files that haven’t been committed or stashed yet will be discarded, and the files will be reset to the state matching the commit directly before the most recent one.

To keep these changes run git stash before reseting the merge. From here you can run git stash pop to recover these changes, and apply them directly on top of your local state.

Undoing a merge that has already been pushed to the remote repository is more complex because it affects the repository history that others might have based their work on. One approach is to revert the merge commit using git revert:

Terminal
git revert -m 1 <merge_commit_hash>

Here, <merge_commit_hash> is the hash of the merge commit you want to undo. By specifying -m 1, you're telling Git to treat the first parent of the merge commit as the mainline. This determines which set of changes the revert operation will undo. In a merge commit, the first parent is the commit that was on the branch into which the merge was made, often the main project branch. So, by choosing -m 1, you're saying that you want to revert the merge as if you're keeping the changes made in the main branch (the first parent) intact, and removing the changes that were introduced by the merged branch (the second parent).

If you resolved a merge conflict but are not satisfied with the resolution, you can undo it before committing by using:

Terminal
git reset --hard

This command will reset your working directory to the last committed state.

If you have merged branches and encountered conflicts that you haven't resolved yet, or you decide you don't want to proceed with the merge before committing, use:

Terminal
git merge --abort

This command cancels the merge operation and returns your branch to its pre-merge state.

Sometimes, you might execute a git pull that results in an unwanted merge. To undo this merge:

Terminal
git reset --hard ORIG_HEAD

ORIG_HEAD is automatically set by Git to point to the tip of the current branch before a merge operation, making it useful for undoing a merge that came as part of a pull.

This is also a destructive command. See the above warning on git reset --hard.

  • Always be cautious when altering history, especially on shared branches. Preferably, such actions should be taken on local or feature branches that are not shared with others.

  • Communicate with your team if you need to undo a merge that affects shared branches or has been pushed to the remote repository.

  • In cases where a direct undo is not possible or could cause issues, consider using a new commit to reverse the changes or consulting with your team for the best course of action.

For more information on undoing various Git operations, see the official git documentation on revert, merge, and reset.

Graphite
Git stacked on GitHub

Stacked pull requests are easier to read, easier to write, and easier to manage.
Teams that stack ship better software, faster.

Or install our CLI.
Product Screenshot 1
Product Screenshot 2