Staging Deleted files
Solution 1
Since Git 2.0.0, git add
will also stage file deletions.
< pathspec >…
Files to add content from. Fileglobs (e.g. *.c) can be given to add all matching files. Also a leading directory name (e.g. dir to add dir/file1 and dir/file2) can be given to update the index to match the current state of the directory as a whole (e.g. specifying dir will record not just a file dir/file1 modified in the working tree, a file dir/file2 added to the working tree, but also a file dir/file3 removed from the working tree. Note that older versions of Git used to ignore removed files; use --no-all option if you want to add modified or new files but ignore removed ones.
Solution 2
Use git rm foo
to stage the file for deletion. (This will also delete the file from the file system, if it hadn't been previously deleted. It can, of course, be restored from git, since it was previously checked in.)
To stage the file for deletion without deleting it from the file system, use git rm --cached foo
Solution 3
Even though it's correct to use git rm [FILE]
, alternatively, you could do git add -u
.
According to the git-add
documentation:
-u --update
Update the index just where it already has an entry matching [FILE]. This removes as well as modifies index entries to match the working tree, but adds no new files.
If no [FILE] is given when -u option is used, all tracked files in the entire working tree are updated (old versions of Git used to limit the update to the current directory and its subdirectories).
Upon which the index will be refreshed and files will be properly staged.
Solution 4
To stage all manually deleted files you can use:
git rm $(git ls-files --deleted)
To add an alias to this command as git rm-deleted
, run:
git config --global alias.rm-deleted '!git rm $(git ls-files --deleted)'
Solution 5
to Add all ready deleted files
git status -s | grep -E '^ D' | cut -d ' ' -f3 | xargs git add --all
thank check to make sure
git status
you should be good to go
Andrew Tomazos
Updated on September 21, 2021Comments
-
Andrew Tomazos over 2 years
Say I have a file in my git repository called
foo
.Suppose it has been deleted with
rm
(notgit rm
). Then git status will show:Changes not staged for commit: deleted: foo
How do I stage this individual file deletion?
If I try:
git add foo
It says:
'foo' did not match any files.
Update (9 years later, lol):
This looks like it has been fixed in git 2.x:
$ git --version git version 2.25.1 $ mkdir repo $ cd repo $ git init . Initialized empty Git repository in repo/.git/ $ touch foo bar baz $ git add foo bar baz $ git commit -m "initial commit" [master (root-commit) 79c736b] initial commit 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 bar create mode 100644 baz create mode 100644 foo $ rm foo $ git status On branch master Changes not staged for commit: deleted: foo $ git add foo $ git status On branch master Changes to be committed: deleted: foo
-
Hauleth over 11 yearsAlso you can add
--cache
flag to remove file only from repository, and leaving untouch in filesystem. -
Andrew Tomazos over 11 yearsYes
git add -A .
will add all changes, I specifically wanted to stage one deleted file. -
longda over 10 yearsWhat would be the process to undo this operation, that is, un-stage the file for deletion? Is that possible?
-
longda over 10 yearsJust answered my own question... git reset HEAD <file> followed by a git checkout <file> seems to do the trick!
-
Foreever over 9 yearsThis will add all modified files; Not just deleted files.
-
Foreever over 9 yearsIf you want to delete files in a directory, you could use git rm -r directory
-
Sailesh over 9 yearsThat is correct. More specifically, it will stage all the changes in files that are already tracked, whether deleted or just modified. This helps when you delete multiple files and don't want to stage them individually.
-
aug over 9 yearsIs there a way to only stage deleted files and not modified? Just curious.
-
Sailesh over 9 yearsI am not aware of such option. In such cases, I individually stage deleted files with
git rm file1 file2
command. If there are a lot of deleted files and less of modified, dogit add -u
followed bygit reset file1 file2
command. On the whole, I think you can't avoid individual directories or files in these cases. -
pal4life over 9 years@Wooble This still gives me Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # deleted: sites/default/settings.php How do I add the file to be committed ?
-
Wooble over 9 years@pal4life: you don't add the file to be committed, since you want its deletion to be committed, not its addition.
git rm
does just that. When you nextgit commit
the deletion will be committed. -
Dimitry K about 9 yearsActually OP asked how to stage already_deleted file and this can be done by
git status | grep 'deleted:' | cut -d':' -f2 | xargs -t -I {} git add -u "{}"
. Other answers seem to be showing how to stage file removal correctly (but not how to stage already deleted files). ps. thexargs
based command works for me on Ubuntu 12.04, however when I manually dogit add -u deleted_file.txt
it doens't work. My git is 1.7.9.5 -
Wooble about 9 years@DimitryK:
git rm
will happily stage a file for deletion even if it's already been deleted from the filesystem. And as OP's comment on another answer points out, they wanted to stage one specific file that was already deleted. -
parliament about 9 yearsI did
git add -u FolderWithDeletedFiles/
and it did what I want, thanks -
DanGordon over 8 yearsConfirming that this works. I think the lesson here though is to not do
rm <file>
, but rathergit rm <file>
-
Félix Adriyel Gagnon-Grenier about 8 yearsthe $() notation aparently doesn't exist in windows bash console, leading to
unknown option `deleted)
-
Wil Shipley about 8 yearsI don’t think this works if you have spaces in your path, either. At least, it doesn’t on my system (with zsh).
-
eis over 7 yearsIn windows do
for /F %I in ('git ls-files --deleted') do git add -u %I
-
davis about 7 yearsFYI: cutting on spaces causes issues if any paths have spaces in them
-
J-Dizzle over 6 yearsthis does not work for filenames with spaces, 'git add -u' does if needed.
-
J-Dizzle over 6 yearsthis does not work for filenames with spaces, 'git add -u' does if needed.
-
J-Dizzle over 6 yearsthis does not work for filenames with spaces, 'git add -u' does if needed.
-
Kalob Taulien almost 6 yearsWorks perfectly for me on
git version 2.15.2 (Apple Git-101.1)
. -
KulaGGin almost 5 years
git rm
doesn't stage already removed files. It throws this error:fatal: pathspec '~.SLDASM' did not match any files
. Here are screens with proof: i.imgur.com/cKNKGGe.png i.imgur.com/1p9JdWF.png . First screenshot clearly shows that 2 files are deleted and not staged, second screenshot shows that when I typegit rm "~$Box.SLDASM"
, it throws this error. -
Wooble almost 5 years@KulaGGin: read the error message. It's not trying to delete a file with "$Box" in the name because your shell got rid of that for you. Add more quotes if you're going to have files with horrible names.
-
João Antunes almost 5 yearsThe accepted answer doesn't solve the problem - and the other are more cumbersome since Git 2.0.0 - this is the best way! You have my upvote
-
cambunctious about 4 yearsMinor, but I would just replace
git rm
withgit add
since I the files are already deleted and I am only updating the index. -
IMSoP almost 4 yearsThere's an important caveat to this: something like
git add foo/*/deleted.file
won't work, because the*
only expands to files that still exist. You can use other patterns that don't rely on files existing, though, such asgit add foo/{bar,baz,quux}/deleted.file
-
pavol.kutaj about 3 yearsIn Windows Powershell Core I use
git add (git ls-files --deleted)
or more bravelygit add (git ls-files --deleted) && git commit -m "deletions"
-
Matthias Fripp almost 3 years@IMSoP If files have been deleted from the file system at
foo/*/deleted.file
, you can also stage them for deletion by putting single quotes around the path, including the wildcard. That prevents the operating system from trying to expand the wildcard, and instead git expands it and stages the deleted files:git add 'foo/*/deleted.file'
. -
Tadej Magajna over 2 yearsdoes not work if file names have spaces