git rm 同步更新暂存区并删除工作区文件,而直接 rm 仅删磁盘文件、Git 未知;git rm --cached 仅取消跟踪不删文件;删目录须用 git rm -r;误删可依阶段用 git restore 或 git checkout 恢复。

git rm 会同步更新暂存区,直接 rm 不会
直接运行 rm test.txt,只是把文件从磁盘删掉,Git 完全不知道这件事。此时 git status 显示 deleted: test.txt,但状态是 “Changes not staged for commit”——它还在暂存区里,没进提交队列。
git rm test.txt 则一步到位:删掉工作区文件 + 把“删除”这个动作记入暂存区。下一次 git commit 就能直接提交删除记录,不用额外操作。
- 误用
rm后想提交?得先git add test.txt(告诉 Git “这删了”),再git commit - 或者偷懒用
git commit -am "msg",但-a会自动add所有已跟踪文件的修改/删除,不适用于新增未跟踪文件 -
git rm是显式、可预测的操作;rm+git commit -a是隐式、容易漏掉边界情况的组合
git rm --cached 是“只取消跟踪”,不是真删文件
有些文件你只想让 Git 别再管它(比如本地配置、.env),但又得保留在磁盘上——这时候不能用 rm,也不能裸用 git rm,而要用 git rm --cached config.local。
执行后:config.local 仍存在本地,但不再出现在 git status 的已跟踪列表里,也不会被下次 git push 带走。
Conventional Commits v1.0.0 分支、工作树命名及提交信息规范,适用于 GitHub 与 GitLab 项目,用于创建分支和命名工作树等场景。
- 如果忘了加
--cached,文件被误删了,可用git restore --staged config.local撤回暂存区操作,再git checkout -- config.local恢复文件内容 -
--cached对未跟踪文件无效;对已修改未暂存的文件,需加-f强制(git rm -f --cached) - 后续若想重新跟踪该文件,得手动
git add config.local,Git 不会自动捡回来
删除目录必须用 git rm -r,rm -r 不够用
rm -r src/ 只清空磁盘上的目录,Git 仍然认为里面所有文件都“该在却不见了”,git status 会为每个子文件单独报 deleted: 行,非常冗长。
git rm -r src/ 一次性把整个目录树从暂存区标记为删除,提交时只产生一条 delete mode 记录,干净利落。
- 若目录里有未跟踪文件(比如构建产物),
git rm -r默认忽略它们;加-f(git rm -rf src/)才会强制删掉已跟踪且已修改的文件 - 想保留目录结构只删内容?不行。
git rm -r删除的是路径本身,Git 没有“空目录”概念(除非放 .gitkeep) - 删完别忘
git commit,否则别人拉代码时,那个目录还会存在
恢复误删的文件,路径和阶段决定命令组合
删错文件不可怕,但恢复方式取决于你用的是哪个命令、删到哪一步了:
- 刚
git rm file.txt但还没commit?用git restore --staged file.txt把它从暂存区撤回,再git restore file.txt恢复文件内容 - 只
rm file.txt且没git add?直接git restore file.txt就行(Git 还记得它) - 已经
git commit了?得git checkout HEAD~1 -- file.txt或git restore -s HEAD~1 -- file.txt回退到上个版本 - 如果文件是被
git rm --cached移出跟踪的,恢复跟踪要git add file.txt,内容本身没丢
最易忽略的一点:Git 不保存空目录,也不记录文件夹的“存在”本身——所以删了整个目录后,即使恢复了所有文件,目录若为空,git status 也不会显示它回来了。

















