git reset [--soft|--hard] [commit] [-- path ...]

If no paths are given, update HEAD to point at the given commit. This can be used to undo one or more commits as if they had never happened. If paths are given, HEAD is not changed; only the listed files and directories are modified.


git reset is extremely dangerous and can cause you to lose track of portions of your repository’s history. Use it only on branches that have never been shared with anyone else. If you make a mistake with git reset, you can usually undo it using git reflog.

With --soft, neither the index nor the work tree are modified, and only the HEAD pointer is changed. Thus, the difference between HEAD and the index is the set of changes needed to convert the new HEAD into the original HEAD. If you then run git commit, a new commit will be created that changes the files back to the way they were before you ran git reset.

With --hard, both the index and the work tree are modified to match the given commit; any changes from the given commit to HEAD are lost.

If neither --soft nor --hard is specified, then the index is updated, but not the work tree.


To undo the most recent commit without losing the changes to the files themselves (so they can be committed again):

$ git reset HEAD^

To change the current branch to point at the same place as origin/master, destroying anything else that might have happened in the current branch previously:

$ git reset --hard origin/master

To undo the above git reset ...

Get Linux in a Nutshell, 6th Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.