Undo a particular commit in Git that's been pushed to remote repos
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
Handling commit history in Git can be quite crucial, especially when a commit needs to be undone after it has already been pushed to a remote repository. Git offers several ways to undo changes, and the choice depends on the context and what you want to achieve. This article delves into the technicalities of undoing a specific commit that’s been pushed to one or multiple remote repositories.
The Necessity of Undoing a Commit
Before undoing a commit, it's important to recognize why the commit needs undoing. It could be due to a mistake in the code, an accidental inclusion of unnecessary files, or simply an incomplete feature. Understanding the reason will help in choosing the strategy to reverse it.
Key Concepts
Commit Hash
Each commit in Git is uniquely identified by a SHA-1 hash. This hash is a 40-character string that serves as an ID for the commit. You can find this hash by using:
Working Directory, Staging Area, and Local Repository
- Working Directory: Where your files are edited.
- Staging Area: Holds the files that are about to be committed.
- Local Repository: Contains your project’s history.
Methods to Undo a Commit
There are two primary methods to consider when undoing a commit: git revert and git reset. We’ll also discuss how to handle branch pointers if necessary.
1. git revert
This command is considered safe for undoing a commit that’s already been pushed to a shared repository. It creates a new commit that reverses the changes of a specified commit, preserving Git history.
Example usage:
If the commit you need to undo is no longer the latest one, use:
The -n flag (or --no-commit) allows you to make additional modifications to the working tree or index before committing.
Pros and Cons:
- Pros:
- Maintains a clear history and log of what changes occurred and their reversals.
- Collaborators pull the revert normally without rewriting history.
- Cons:
- Introduces additional, possibly unnecessary commits to the history.
2. git reset
In contrast, git reset is suitable for local amendments or when the history doesn’t need to be maintained. Note that this method can rewrite commit history, which is dangerous in shared branches without coordination.
Example usage:
To move HEAD and the current branch to a previous commit, effectively removing any newer commits from history:
If you want to keep the changes in the working directory, you can use:
Pros and Cons:
- Pros:
- Allows the removal of commits entirely from the history.
- Cons:
- Rewrites history, making it risky if the branch is shared.
- Requires force-pushing, which can disrupt other collaborators.
Force Pushing
If you use git reset, you'll need to force push your changes. Force pushing should be approached with caution:
Handling Branch Pointers
Sometimes when you undo a commit, especially using git reset, you might need to adjust your branch pointers. Make sure all collaborators are aware to avoid conflicts.
Summary Table
| Method | Command Example | Safe for Shared Repos? | History Rewriting | Additional Commits |
| git revert | git revert <commit-hash> | Yes | No | Yes |
| git reset | git reset --hard <commit-hash> | No | Yes | No |
Conclusion
Undoing a commit in Git requires deliberate consideration of the impact on other team members and the integrity of the repository’s history. While git revert is the safer and more collaborative approach, git reset might be used for local branches or in isolated conditions. Make sure to communicate with your team when conducting history-altering operations and leverage Git's powerful branching to experiment and make committed decisions.

