How can I undo pushed commits using Git?
Categories:
How to Undo Pushed Commits in Git: A Comprehensive Guide

Learn the essential Git commands git reset
and git revert
to safely undo pushed commits, understanding their implications and best use cases.
Accidentally pushing commits with errors or sensitive information is a common scenario in Git. While git push
sends your local changes to a remote repository, undoing those changes requires careful consideration, especially when others might have already pulled them. This article will guide you through two primary methods for undoing pushed commits: git reset
and git revert
, explaining their differences, use cases, and potential impacts on your team's workflow.
Understanding the Impact of Undoing Pushed Commits
Before diving into the commands, it's crucial to understand the implications. Modifying history that has already been shared with others can lead to significant problems, as it forces collaborators to adjust their local repositories. Always communicate with your team before performing operations that rewrite shared history.
flowchart TD A[Local Commit] --> B[git push] B --> C{Remote Repository} C --> D[Collaborator pulls] D --> E{Need to Undo?} E -->|Yes, but not shared| F[git reset --hard (local only)] E -->|Yes, and shared| G[git revert (safer for shared history)] E -->|Yes, and shared, with caution| H[git reset --hard + git push --force (rewrites history)]
Decision flow for undoing Git commits based on sharing status.
Method 1: git revert
- The Safe Way to Undo Shared History
git revert
creates a new commit that undoes the changes introduced by a previous commit. It doesn't rewrite history, making it the safest option for undoing commits that have already been pushed to a shared remote repository. This approach maintains a clear, linear history, which is beneficial for collaboration and auditing.
# Revert the last commit
git revert HEAD
# Revert a specific commit by its hash
git revert <commit-hash>
# Revert a range of commits (from oldest to newest)
git revert <commit-hash-oldest>..<commit-hash-newest>
Basic git revert
commands.
git revert
applies them in reverse order. If you revert a range, Git will prompt you to create a new commit for each reverted commit. Use the -n
or --no-commit
flag to stage all reverted changes and commit them as a single new commit.# Revert multiple commits and combine into a single new commit
git revert -n <commit-hash-oldest>..<commit-hash-newest>
git commit -m "Reverted commits X through Y"
Reverting multiple commits into a single new commit.
Method 2: git reset
- Rewriting History (Use with Extreme Caution)
git reset
moves the HEAD pointer and optionally changes the staging area and working directory. When used with --hard
and applied to pushed commits, it effectively rewrites history. This is generally discouraged for shared branches because it can cause significant problems for collaborators who have already pulled the
git reset --hard
on commits that have been pushed to a shared branch unless you have explicitly coordinated with your team and understand the implications. It will rewrite history and force collaborators to perform complex recovery steps.1. Identify the commit to reset to
Find the hash of the commit before the one(s) you want to undo. You can use git log
to view commit history.
2. Perform the reset locally
Execute git reset --hard <commit-hash-before-undone-commits>
. This will discard all changes from the undone commits from your local history and working directory.
3. Force push to the remote
After resetting locally, you must force push to overwrite the remote history: git push --force origin <branch-name>
. This is the step that rewrites shared history.
4. Communicate with your team
Inform your team immediately. Collaborators will need to run git fetch origin
followed by git reset --hard origin/<branch-name>
to synchronize their local repositories with the rewritten remote history.
# 1. View log to find the commit hash you want to reset to
git log --oneline
# Example: Reset to commit 'a1b2c3d' (the commit *before* the bad ones)
git reset --hard a1b2c3d
# 2. Force push to overwrite remote history (DANGER!)
git push --force origin main
Using git reset --hard
and git push --force
.
Choosing Between git reset
and git revert
The choice between git reset
and git revert
depends entirely on whether the commits have been shared. If the commits are only on your local machine and haven't been pushed, git reset
is a clean way to undo them. If they've been pushed and potentially pulled by others, git revert
is almost always the safer and recommended approach.

Key differences between git reset
and git revert
.
git reflog
to recover lost commits or git cherry-pick
to reapply specific changes after a reset. Always back up your repository or work on a temporary branch when experimenting with history-rewriting commands.