How do I remove a single file from the staging area (undo git add)?
Asked Answered
M

19

1450

Situation: I have a Git repository with files already in the index. I make changes to several files, open Git and add these files to my staging area with "git add ."

Question: How do I remove one of those files from the staging area but not remove it from the index or undo the changes to the file itself?

Mader answered 1/10, 2009 at 19:24 Comment(3)
The staging area is the index, so perhaps you could clarify exactly what you mean?Alleen
https://mcmap.net/q/12972/-how-do-i-undo-39-git-add-39-before-commitPhlogopite
Possible duplicate of How to undo 'git add' before commit?Forequarter
G
2171

If I understand the question correctly, you simply want to "undo" the git add that was done for that file.

If you need to remove a single file from the staging area, use

git reset HEAD -- <file>

If you need to remove a whole directory (folder) from the staging area, use

git reset HEAD -- <directoryName>

Your modifications will be kept. When you run git status the file will once again show up as modified but not yet staged.

See the git reset man page for details.

Gauzy answered 1/10, 2009 at 19:29 Comment(12)
Thanks... I just noticed that that is stated just above the staged files. Guess I've been looking at that screen so long I was selectively choosing what I wanted to see.Mader
This unstages all of my changes, contrary to every advice I've gotten anywhere (man pages, here, friends, &c). I keep thinking some day it's going to do what's advertised, but no.Platinize
Is there anyway to remove files from staging when there haven't been any commits to the repo?Verbid
quick tip @JaredForsyth try rm -rf .git if your repository is just created, then use git init to recreate empty repository, but only in case that your repo (local repo) is totally empty without any commitsMod
I do think adding -- makes the answer more complete, this forces git to interpret the proceeding text as a filenameRetraction
@Jared Forsyth To remove a file never commited from the stage use the command git rm --cached FILE as suggested by another answer.Constitute
Waaaay counter-intuitive, but works. I would have thought that to undo an add, it'd be something like "git add -r <file>". But this is git!Harmonium
the git reset HEAD -- <file> syntax doesn't works! It would be better to use git reset HEAD <filename> [without -- ]Banshee
confusing way of reporting unstaged changes after commit led me to initially think it wasn't working.Tlaxcala
It also worked for me without the double dash, e.g. git reset HEAD <filePath>Peeples
This helped me. I was confused between rm --cache or reset. Thanks. :)Incur
I come to this answer many times, only to come yet again...Rycca
K
168
git rm --cached FILE

,

git rm -r --cached CVS */CVS
Kovar answered 7/5, 2010 at 12:25 Comment(6)
true, but it's better to use git reset here I think, as you may ommit the --chached option and get sad quickly using the git rm command :-) With git reset you're on the safe side, if you forget to add "some option" it's gonna keep the change so it's "safer" for daily use (I'm talking about git reset --hard).Bedfordshire
This method is useful if you don't have previous commits.Demoniac
git rm --cached FILE stages file deletion, without deleting the file form the working tree. This is different than the question, which was about undoing git add.Moncear
This answer throws an error if you have deleted the file from the working tree.Durwin
git rm --cached will cause the file being removed from the index, i.e. the file will become untracked file. I don't think this is what OP wants. Please see a related thread here: stackoverflow.com/questions/45047810/…Butterbur
this will just make the file untracked. the added file with git add still remains staged.Kilt
C
110

git reset <file>

Works whether or not you have any previous commits.

Corniculate answered 13/8, 2013 at 4:20 Comment(0)
S
56

So, a slight tweak to Tim Henigan's answer: you need to use -- before the file name. It would look like this:

git reset HEAD -- <file>
Sebastien answered 21/2, 2014 at 16:55 Comment(3)
What does the -- do and why add it? I did git reset HEAD <file> and it worked.Volvulus
-- is kind of a divider. In case the file name is unconventional e.g.(-f or master) git would interpret it as command line argument or branch name instead of file name. See hereGonadotropin
This worked for me where the command without -- did not due to having no previous commits for that file. Thanks.Goodygoody
P
30

For newer versions of Git there is git restore --staged <file>.

When I do a git status with Git version 2.26.2.windows.1 it is also recommended for unstaging:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)

(This post shows, that in earlier versions git reset HEAD was recommended at this point)

I can highly recommend this post explaining the differences between git revert, git restore and git reset and also additional parameters for git restore.

Poon answered 11/5, 2020 at 8:35 Comment(1)
Since 2.23: infoq.com/news/2019/08/git-2-23-switch-restoreFechter
I
24
git reset filename.txt

If you have a modification in filename.txt , you added it to stage by mistake and you want to remove the file from staging but you don't want to lose the changes.

Intelligent answered 20/3, 2018 at 10:53 Comment(0)
C
7

In case you just want to remove a subset of the changes to your file, you can use:

git reset -p

or

git reset -p <file_name>

This command is basically the reverse of git add -p: it will only remove the selected changes from the staging area. I find it extremely useful in "unadding" something that I added by mistake.

Cupboard answered 17/2, 2017 at 22:13 Comment(0)
D
7

I think you probably got confused with the concept of index, as @CB Bailey commented:

The staging area is the index.

You can simply consider staging directory and index as the same thing.
So, just like @Tim Henigan's answer, I guess:

you simply want to "undo" the git add that was done for that file.



Here is my answer:

Commonly, there are two ways to undo a stage operation, as other answers already mentioned:

git reset HEAD <file>

and

git rm --cached <file>

But what is the difference?

Assume the file has been staged and exists in working directory too, use git rm --cached <file> if you want to remove it from staging directory, and keep the file in working directory. But notice that this operation will not only remove the file from staging directory but also mark the file as deleted in staging directory, if you use

git status

after this operation, you will see this :

        deleted:    <file>

It's a record of removing the file from staging directory. If you don't want to keep that record and just simply want to undo a previous stage operation of a file, use git reset HEAD <file> instead.


-------- END OF ANSWER --------

PS: I have noticed some answers mentioned:

git checkout -- <file>

This command is for the situation when the file has been staged, but the file has been modified in working directory after it was staged, use this operation to restore the file in working directory from staging directory. In other words, after this operation, changes happen in your working directory, NOT your staging directory.

Differentiable answered 22/2, 2019 at 3:3 Comment(0)
T
7

After version 2.23, Git has introduced the git restore command which you can use to do that. Quoting the official documentation:

Restore specified paths in the working tree with some contents from a restore source. If a path is tracked but does not exist in the restore source, it will be removed to match the source.

The command can also be used to restore the content in the index with --staged, or restore both the working tree and the index with --staged --worktree.

So you can invoke git restore --staged <path> and unstage the file but also keep the changes you made. Remember that if the file was not staged you lose all the changes you made to it.

Thibodeaux answered 30/3, 2020 at 10:50 Comment(0)
O
7

I think you could go for

git restore --staged <path/to/file_name>

Overlive answered 27/1, 2023 at 16:52 Comment(0)
G
4

If you want to remove files following a certain pattern and you are using git rm --cached, you can use file-glob patterns too.

See here.

Gudrin answered 4/1, 2014 at 9:21 Comment(0)
U
3

When you do git status, Git tells you how to unstage:

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

So git reset HEAD <file> worked for me and the changes were un-touched.

Unmannered answered 8/5, 2018 at 1:19 Comment(0)
C
2

You want:

  • Affect to a single file

  • Remove file from staging area

  • Not remove single file from index

  • Don't undo the change itself

and the solution is

git reset HEAD file_name.ext

or

git reset HEAD path/to/file/file_name.ext
Consubstantiate answered 31/10, 2017 at 9:33 Comment(0)
C
2

You need to be in the directory of the file and then type the following into the terminal

git checkout -- <file>
Clink answered 6/12, 2020 at 20:42 Comment(1)
this works only if you are trying to undo changes in a file that isn't staged. If you want to undo the changes of a file that is stages, you first need to git reset HEAD -- <file> before running your command.Greed
T
1

If you make changes to many tracked files but only want to stage a few of them, doing a

git add .

isn't always favorable (or recommended)- as it stages all the tracked files (some cases where you want to keep changes only to yourself and don't want to stage them to the remote repository).

nor is it ideal doing a bunch of

git add path/to/file1 path/to/file2

if you have a lot of nested directories (which is the case in most projects) - gets annoying

That's when Git GUI is helpful (probably only time I use it). Just open Git GUI, it shows staged and unstaged file sections. Select the files from the staged section that you want to unstage and press

Ctrl+U (for windows)

to unstage them.

Torsk answered 10/8, 2018 at 22:29 Comment(0)
S
0

My sample:

$ git status
On branch feature/wildfire/VNL-425-update-wrong-translation
Your branch and 'origin/feature/wildfire/VNL-425-update-wrong-translation' have diverged,
and have 4 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

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

    modified:   ShopBack/Source/Date+Extension.swift
    modified:   ShopBack/Source/InboxData.swift
    modified:   ShopBack/en.lproj/Localizable.strings

As you may notice

> Changes to be committed:
>       (use "git reset HEAD <file>..." to unstage)
Sunderance answered 29/10, 2019 at 4:23 Comment(0)
J
-1

You need to be in the directory of the file and then type the following into the terminal

git reset HEAD .

Assumption is that you need to reset one file only.

Juneberry answered 26/9, 2017 at 19:51 Comment(0)
A
-4

To unstage everything at once, run this command

git reset HEAD -- .
Arluene answered 6/9, 2016 at 19:3 Comment(1)
Can't add files after that.Ferriter
L
-9

git checkout -- <file>

It works perfectly to remove files from Staging Area

Lucchesi answered 18/5, 2015 at 17:25 Comment(2)
as noted below, this reverts changes to the file, which is going a step further than OP wants to go.Retraction
git rm flie.txt --cachedLucchesi

© 2022 - 2024 — McMap. All rights reserved.