How to discard changes in Git

Kenny DuMez
Kenny DuMez
Graphite software engineer

This guide will cover several methods to discard changes in Git, using various commands to handle different scenarios. We'll provide examples for each situation to help you understand how to revert your work to a desired state.

Before diving into the commands, let's clarify the main areas of Git:

  1. Working directory: The Git working directory, also known as the working area, is the space on your local filesystem where the actual files and directories of your project are stored and modified before being committed to the remote repository.
  2. Staging area (index): This is where you prepare and organize changes before committing them to the remote repository. It acts as a middle ground between your local machine and the repository stored on a remote server.
  3. Commits: These are records of your past code changes, which are stored in the project history.

The git checkout command is one of the most common ways to revert changes:

  • Discard changes in the working directory: To revert a specific file to the last committed state, use:

    git checkout <file>

    Replace <file> with the name of the file you want to revert.

  • Discard all changes in the working directory: If you want to discard changes from all files in the working directory:

    git checkout .

This will revert all of your tracked files back to the state they were in at the last commit. However, this will not affect "untracked" files, new files that have been created locally but not committed yet, or other files that are auto-generated and shouldn't be committed to the repository like build artifacts, compiled binaries, log files etc.

Git 2.23 introduced a more straightforward command called git restore, designed to make it easier to work with changes:

  • Discard changes to a specific file:

    git restore <file>
  • Discard changes to all files in the working directory:

    git restore .

This command is versatile and can also be used to restore files from a specific branch or commit.

For files that are not tracked by Git (new files or automatically generated files that are not in your .gitignore), you can use the git clean command to clean your working directory:

  • Discard untracked files:

    git clean -f
  • Discard untracked directories:

    git clean -fd

This command will remove all files and directories that are not under version control, so use it with caution as these changes cannot be undone.

Both of the above commands will leave files explicitly ignored by Git (i.e. files listed in the .gitignore file) intact. To delete ignored files in addition to all of the other untracked files, you can add the -x flag:

git clean -fx

If you need to discard all staged and unstaged changes, you can use git reset:

  • Discard all changes (staged and unstaged):

    git reset --hard

This command resets your working directory and staging area to match the last commit. It's a powerful command that should be used carefully, as it will permanently erase all changes. However, untracked files will be untouched by this command.

Here are a few more specific use cases and how to handle them:

  • Discard changes in one file that are staged:

    If you have added changes to the staging area (with git add) and want to remove them from there, you can use:

    git restore --staged <file>

    If you also want to discard these changes in the working directory, after restoring the file run:

    git checkout <file>

For further reading see the official Git documentation.

On this page
Stay unblocked. Ship faster.
Experience the new developer workflow - create, review, and merge code continuously. Get started with one command.
Get started

Give your PR workflow
an upgrade today

Stack easier | Ship smaller | Review quicker

Or install our CLI.
Product Screenshot 1
Product Screenshot 2