What Is the Difference Between Git Rm --Cached and Git Reset?

According to the git rm documentation,

--cached
Use this option to unstage and remove paths only from the index.    
Working tree files, whether modified or not, will be left alone.

But according to this resource unstaging a file is done with

git reset HEAD <file>

What is the difference? Is there one?

2

2 Answers

With git rm --cached you stage a file for removal, but you don't remove it from the working dir. The file will then be shown as untracked.

Take a test drive

git init test_repo
cd test_repo

touch test
git add test
git commit -m 'Added file test

git rm --cached test

git status
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    test      <---- staged for removal

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

        test              <-- still in the working dir

With git reset <file> you can unstage a file. In the example above you might want to use git reset test to unstage the removal.

git reset test
git status
On branch master
nothing to commit, working directory clean

The command with flag git rm --cached removes the file from the index but leaves it in the working directory. This indicates to git that you don't want to track the file any more.

On the other hand, the command git reset HEAD <file> leaves the file as a tracked file in the index, but the modifications cached in the index are lost. This has the effect as if the file in cache had been over written by the file in HEAD (while the working tree file is untouched).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

James H. Sterling

James H. Sterling

Environmental Science & Climate Journalist

James Sterling reports on renewable energy developments, climate policy, ecological conservation, and green tech innovations around the globe.

Share this article
Twitter Facebook Pinterest