W3docs

How to Undo Git Merge

In this snippet, you will find out how to undo git merge in a relatively fast way.

Sometimes, you want to undo a merge operation regardless of whether it was triggered by the merge or pull command. Here, we will consider several ways to undo a merge in Git.

How to Undo a Merge with Conflicts

In case conflicts occurred after calling the merge command, you can undo the whole process by using the command below:

the merge abort command

git merge --abort

How to Undo an Unpushed Merge Commit

One effective way to undo a <kbd class="highlighted">git merge</kbd> is to run the git reset command. This method preserves your local changes and moves the branch pointer back to the commit before the merge. Run the following command:

git last commit before merge

git reset --soft ORIG_HEAD

Alternatively, you can find the merge commit hash using the git log command, then run:

git resetting your local repository to the specific commit sha

git reset --soft <merge-commit-hash>

This method effectively cleans up the merge while preserving local changes. However, it has drawbacks. If your local branch is behind the remote branch, this approach may not work as expected. Additionally, rewriting history can make it difficult for teammates to track changes in the remote repository.

How to Undo a Pushed Merge Commit

Undoing with the git reset command

To undo a pushed merge, first reset the merge commit as described above, then force-push the changes:

git push command with the --force option

git push origin HEAD --force
Warning

Instead of --force, you can use a safer method: --force-with-lease, which will not overwrite the work of other developers.

Undoing with the git revert command

If you want to avoid disrupting parallel developers, use the git revert command. Find the merge commit hash with <kbd class="highlighted">git log</kbd>, then run:

Reverting a merge commit

git revert -m 1 <merge-commit-hash>

The <kbd class="highlighted">-m 1</kbd> flag tells Git to revert to the first parent of the merge commit. Use <kbd class="highlighted">-m 2</kbd> to revert to the second parent instead.

Returning the Reverted Changes

This approach modifies the working data but keeps the history, so it isn't a complete undo. If you merge the branches again, the previously reverted changes won't be applied. To restore them, you must revert the revert commit. As you can see, several methods exist for undoing <kbd class="highlighted">git merge</kbd>. Before choosing one, consider the potential consequences for your workflow and team.