Rollback a Git merge
Categories:
How to Rollback a Git Merge: Undoing Changes in Your Repository

Learn various strategies to effectively undo a Git merge, from simple reverts to more complex resets, ensuring your repository history remains clean and accurate.
Merging branches is a fundamental operation in Git, allowing developers to integrate changes from one branch into another. However, sometimes a merge might introduce unwanted changes, conflicts, or simply be performed by mistake. In such scenarios, knowing how to effectively rollback a Git merge is crucial for maintaining a clean and functional repository history. This article will guide you through different methods to undo a merge, explaining when to use each approach based on your specific situation.
Understanding Merge Rollback Scenarios
Before attempting to undo a merge, it's important to understand the state of your repository and whether the merge has already been pushed to a shared remote repository. This distinction dictates the safest and most appropriate rollback strategy. There are two primary scenarios:
flowchart TD A[Merge Performed] --> B{Is Merge Pushed to Remote?} B -->|No| C[Local Merge Only] B -->|Yes| D[Pushed Merge] C --> E[Use `git reset` (soft/hard)] D --> F[Use `git revert`] E --> G[History Rewritten] F --> H[New Commit to Undo Merge] G & H --> I[Merge Undone]
Decision flow for choosing a Git merge rollback strategy.
Scenario 1: Undoing a Local Merge (Not Pushed)
If you've merged branches locally and haven't yet pushed these changes to a remote repository, you have more flexibility. In this case, you can safely use git reset
to move your branch's HEAD pointer back to a commit before the merge. This effectively rewrites history locally.
git reset --hard
is a destructive operation. Any uncommitted changes in your working directory will be lost. Always ensure your working directory is clean or you've stashed your changes before using --hard
.1. Identify the commit before the merge
Use git log
to find the commit hash of the commit just before the merge occurred. This is the commit you want to reset to.
2. Perform the reset
Execute git reset --hard <commit-hash-before-merge>
. This will move your HEAD and branch pointer to the specified commit, discarding all changes introduced by the merge and any subsequent commits.
3. Verify the history
Run git log
again to confirm that the merge commit and any commits after it are no longer in your branch's history.
git log --oneline --graph
# Find the commit hash before the merge, e.g., 'a1b2c3d'
git reset --hard a1b2c3d
git log --oneline --graph
Example of using git reset --hard
to undo a local merge.
Scenario 2: Undoing a Pushed Merge (Shared History)
If the merge has already been pushed to a shared remote repository, rewriting history with git reset
is generally discouraged as it can cause significant problems for collaborators. Instead, the recommended approach is to use git revert
. git revert
creates a new commit that undoes the changes introduced by the merge, preserving the project history.
-m
or --mainline
option followed by the parent number (usually 1 for the branch you were on, 2 for the branch you merged in).1. Identify the merge commit
Use git log
to find the commit hash of the merge you want to undo. Merge commits typically have two parent hashes listed.
2. Revert the merge commit
Execute git revert -m 1 <merge-commit-hash>
. The -m 1
option tells Git to revert the merge, considering the first parent (your current branch) as the mainline. If you want to undo the changes introduced by the merged branch, you might use -m 2
.
3. Commit the revert
Git will open your default editor to allow you to modify the revert commit message. Save and close the editor to complete the revert.
4. Push the revert commit
Push the new revert commit to the remote repository using git push origin <your-branch-name>
.
git log --oneline --graph
# Find the merge commit hash, e.g., 'e4f5g6h'
git revert -m 1 e4f5g6h
# Git opens editor for commit message, save and close
git push origin main
Example of using git revert -m 1
to undo a pushed merge.
Reverting a Revert (If You Change Your Mind)
What if you revert a merge, and then realize you actually needed those changes? You can simply revert the revert commit. This will re-apply the changes that were undone by the initial revert. This demonstrates the non-destructive nature of git revert
.
git log --oneline
# Find the commit hash of the revert commit, e.g., 'f7g8h9i'
git revert f7g8h9i
# Git opens editor for commit message, save and close
git push origin main
Example of reverting a previous revert commit.