Skip to main content

Using Git

How to Unstage Files in Git

Accidentally added a file in the latest commit? Don't worry too much. Here is how you can unstage a file in Git.

It is essential for commit message to line up with changes. What if you accidentally staged a file that was not intended for current commit?

git rm --cached <FILE-NAME>

Specifying a file name when you use the command provided above will unstage a single file (or more, depending on how many files you have specified).

If you want to get more in depth, continue reading.

Git rm command

The command git rm is used to remove files from the working tree and also from the index.

This command comes with a handy flag --cached. Upon using this flag along with specifying name of one or more files, they are removed from index.

This means that the working tree files will not be touched. Only that they will be removed from the staging area that Git uses.

Let's look at an example

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   README.md

$ git rm --cached README.md
rm 'README.md'

$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        README.md

I added a file 'README.md' to the staging area, and a while later realized that it was a mistake. So, to remove 'README.md' from staging area, I used the git rm command and unstaged it.

After removing it from the staging area, I run git status and I see that 'README.md' is not being tracked, and also that it was not deleted (which would be very disastrous).

The command git rm along with --cached flag is the exact opposite of git add command and can be used safely.

Git reset command

The command git reset will reset the current HEAD to the state that user specifies.

The command alone is not useful in this context, but we can use the double hyphen -- option will not interpret arguments as options anymore. And lastly, specify the name of file to remove from staging area.

Let's look at an example to understand this better...

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   README.md

$ git reset -- README.md

$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        README.md

As you can see, the file 'README.md', which was previously in staging area, is now unstaged.

Conclusion

There are mainly two commands used to unstage a file in a local Git repository. They are git rm and git reset, both are used with special flags to perform the action of unstaging files.