Revert Git to Previous Commit: Reset vs Revert Guide
Learn how to revert a Git repository to a previous commit like 0d1d7fc using git reset --hard or git revert commit. Safe methods for local and shared branches, with examples, recovery tips, and git reset head alternatives.
How do I revert a Git repository to a previous commit? I want to revert from my current state to a specific snapshot. For example, when I run git log, I see the following output:
commit a867b4af366350be2e7c21b8de9cc6504678a61b
Author: Me <me@me.com>
Date: Thu Nov 4 18:59:41 2010 -0400
blah blah blah...
commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date: Thu Nov 4 05:13:39 2010 -0400
more blah blah blah...
commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date: Thu Nov 4 00:55:06 2010 -0400
And yet more blah blah...
commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date: Wed Nov 3 23:56:08 2010 -0400
Yep, more blah blah.
How do I revert to the commit from November 3, i.e., commit 0d1d7fc?
To revert your repository to commit 0d1d7fc you have two main paths: use git reset --hard 0d1d7fc to move the branch pointer and make your working tree match that snapshot (this rewrites history), or use git revert / restore-and-commit to create new commits that undo later changes (safe for shared branches). If the branch is only local, the hard reset is the fastest; if the commits were pushed or others use the branch, prefer git revert or restore the snapshot and commit so history stays intact.
Contents
- Quick decision: reset vs revert
- Reset to commit 0d1d7fc with git reset --hard
- Revert commits safely with git revert (revert commit)
- Inspect the snapshot and work with a detached HEAD
- Push, collaboration and safety notes
- Practical examples and troubleshooting
- Sources
- Conclusion
Quick decision: reset vs revert
Which route you take depends on whether the branch is published. Want the branch pointer and history moved back to 0d1d7fc (so later commits disappear from the branch)? Use git reset --hard 0d1d7fc. Want the repository state to look like 0d1d7fc while preserving all history (so collaborators aren’t surprised)? Use git revert or restore the tree from that commit and make a new commit that records the undo. See the Atlassian comparison of resetting, checking out and reverting for a compact explanation: https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting.
Reset to commit 0d1d7fc with git reset --hard
Use this when the branch is local or you’ve coordinated with everyone who might be affected. This moves HEAD and the branch ref to the target commit and updates your working tree and index to match it (later commits become unreachable from that branch).
Steps
- Check which branch you’re on and make a quick backup branch:
git status git branch backup-before-reset
- Reset hard to the commit:
git reset --hard 0d1d7fc
- If you need to update the remote branch (and you’re sure): force-push using the safer option:
git push --force-with-lease origin main
Use --force-with-lease instead of plain --force to reduce the chance of clobbering someone else’s pushed work.
Why this is destructive
git reset --hardrewrites history for the current branch: commits after0d1d7fcare no longer reachable from that branch. They still exist in the repo until garbage-collected, and you can usually recover them withgit reflogif you act quickly. See the FreeCodeCamp summary of reset types for more on--softvs--hard: https://www.freecodecamp.org/news/git-reverting-to-previous-commit-how-to-revert-to-last-commit/.
Recovering accidentally reset work
- If you reset by mistake, run
git reflogto find the previous HEAD (e.g.,HEAD@{1}) and thengit reset --hard HEAD@{1}to restore it.
Revert commits safely with git revert (revert commit)
If the branch has been pushed and others might have pulled it, prefer git revert. That creates new commit(s) that undo the effect of earlier commit(s) without rewriting history.
Revert a single commit (safe, simple):
git revert 0766c053
# resolves conflicts if prompted, then push normally
git push origin main
Revert a range of commits (undo everything after 0d1d7fc)
- You can revert each offending commit individually, working from newest to oldest to reduce conflicts:
# see the commits you'll revert
git log --oneline 0d1d7fc..HEAD
# revert newest first (example)
git revert a867b4af
git revert 25eee4ca
git revert 0766c053
git push origin main
- Or try a single sequence that stages inverse changes for the whole range and then commit once:
git revert --no-commit 0d1d7fc..HEAD
# resolve any conflicts, then:
git commit -m "Revert to 0d1d7fc (undo commits after this)"
git push origin main
Note: reverting multiple commits can surface conflicts; resolve them and continue. The Atlassian guide on revert shows options and edge cases for reverting merge commits: https://www.atlassian.com/git/tutorials/undoing-changes/git-revert.
Alternative: restore the whole tree and commit (keeps history, single commit)
- If you want one commit that makes the tree identical to
0d1d7fc:
git checkout main # or git switch main
git checkout 0d1d7fc -- .
git add -A
git commit -m "Restore tree to 0d1d7fc"
git push origin main
This approach is straightforward and keeps the history intact while making the working tree match the older snapshot. For file-level restores, see Atlassian’s checkout examples: https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting.
Inspect the snapshot and work with a detached HEAD
Want to peek before you touch anything? Use these commands.
- Look at the commit details:
git show 0d1d7fc
- Compare that snapshot to HEAD:
git diff --stat 0d1d7fc..HEAD
- If you
git checkout 0d1d7fcyou’ll be in a detached HEAD (you can inspect files but you’re not on a branch). Create a branch there if you want to keep changes:
git checkout -b restore-0d1d7fc 0d1d7fc
# or with modern Git:
git switch -c restore-0d1d7fc 0d1d7fc
Detached HEAD is fine for inspection. If you want to roll the current branch back to that commit, use reset or one of the revert/restore approaches described earlier.
Push, collaboration and safety notes
- If the branch has been published (pushed) and others may have based work on it, avoid
git reset --hard+ force-push unless everybody agrees. Prefergit revertor a restore-and-commit approach that preserves history. - If you must force-push, prefer
git push --force-with-lease origin <branch>to reduce accidental overwrites. - Always create a quick backup branch before destructive operations:
git branch backup-before-reset
- Use
git reflogto recover lost commits when possible:
git reflog git reset --hard <reflog-id>
- Reverting merge commits requires extra care (see the Atlassian revert guide linked above). Graphite’s guide also covers reverting a repo to a previous commit and working with ranges: https://graphite.com/guides/revert-to-previous-commit-git.
Practical examples and troubleshooting
Example 1 — Local-only reset (quick):
git checkout main
git branch before-reset-0d1d7fc
git reset --hard 0d1d7fc
# If you later decide to update remote:
git push --force-with-lease origin main
Example 2 — Preserve history, single commit undo:
git revert 0766c053 git push origin main
Example 3 — Make the repo state match 0d1d7fc in one new commit:
git checkout main
git checkout 0d1d7fc -- .
git add -A
git commit -m "Restore project to commit 0d1d7fc"
git push origin main
Example 4 — Revert a sequence (many commits):
git log --oneline 0d1d7fc..HEAD # list the commits you'll undo
git revert --no-commit 0d1d7fc..HEAD
# resolve conflicts, then:
git commit -m "Revert to 0d1d7fc (undo commits after this)"
git push origin main
Common issues
- Conflicts during
git revertor--no-commit: resolve them, thengit revert --continueorgit commitdepending on how you ran revert. - Accidentally reset the wrong branch: use
git reflogto find the old HEAD and reset back. - Merge commits: reverting a merge commit is tricky because Git needs the parent reference; see detailed docs before attempting.
For quick command examples and community discussion, the Stack Overflow thread contains practical snippets: https://stackoverflow.com/questions/4114095/how-do-i-revert-a-git-repository-to-a-previous-commit. For authoritative explanations of git revert and recommended workflows, see Atlassian’s pages: https://www.atlassian.com/git/tutorials/undoing-changes/git-revert and https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting.
Sources
- git checkout - How do I revert a Git repository to a previous commit? — Stack Overflow
- How to Revert a Commit in Git? — Atlassian Git Tutorial
- Git Reverting to Previous Commit – FreeCodeCamp
- How to revert to a previous commit in Git — Graphite guide
- Resetting, Checking Out & Reverting — Atlassian Git Tutorial
Conclusion
If you just need your local branch to match 0d1d7fc, git reset --hard 0d1d7fc (after creating a backup branch) is the fastest route. If the branch is shared or already pushed, prefer git revert or restore the tree from 0d1d7fc and commit so you don’t rewrite history. Keep a backup branch, use git reflog for recovery, and prefer git push --force-with-lease over blind --force when you must update a remote.