Command Reference

git rm

删除已跟踪文件并同步到暂存区,理解它有助于区分文件系统删除和 Git 记录删除。

适合谁看
  • 已经会基本提交和分支操作的开发者
  • 想理解命令边界与风险的人
前置知识
  • 知道工作区、暂存区、提交的基本关系
  • 能读懂 `git status` 和简单历史图
常见风险
  • 误把本地整理命令用到共享历史
  • 在没确认恢复路径前直接继续改写历史

git rm 不只是删文件,它还会把“删除”这件事放进暂存区,准备进入下一次提交。

常见写法

git rm app/old-file.ts
git rm -r legacy-folder
git rm --cached .env.local

三种最常见场景

删除文件并提交删除

git rm notes.txt
git commit -m "remove old notes"

只从 Git 跟踪中移除,但保留本地文件

git rm --cached .env.local

这在把文件加入 .gitignore 时很常见。

递归删除目录

git rm -r tmp/

为什么它和直接 rm 不一样

你可以先用系统 rm 删除文件,再用 git add -ugit commit -a 让 Git 感知删除;但 git rm 会把“删除文件”和“暂存删除记录”一起完成。

风险点

  • git rm 删除的是已跟踪文件
  • 如果还没提交,通常还能从历史或工作区恢复
  • 一旦提交并推送,删除就会进入共享历史

这条命令在流程里解决什么问题

git rm 同时在工作区和暂存区两个层面删除文件:它会从文件系统中移除文件(工作区),并把"删除"这一操作记录到索引中(暂存区)。它解决的是"让 Git 知道文件被删除了,并准备进入下一次提交"的问题。

典型用例

  • 删除文件并自动暂存删除记录(git rm <file>),一步完成文件系统删除和 Git 暂存。
  • 只从 Git 跟踪中移除但保留本地文件(git rm --cached <file>),常用于把误提交的文件加入 .gitignore 后的处理。
  • 递归删除整个目录(git rm -r <dir>),适合清理不再需要的文件夹。

图例理解

文件删除的双重影响git rm 同时从工作区移除文件和从索引中移除跟踪记录,让删除操作进入下一次提交。
输入
已跟踪的文件路径(可选)--cached 只删索引
产出
工作区中文件被删除索引中已暂存的删除记录
可以用系统 rm 删除文件后再用 git add -u 达到类似效果,但 git rm 一步到位、意图更清晰。

特殊情况与边界

  • git rm 只对已跟踪的文件有效,对未跟踪的文件使用会报错。
  • 如果文件在工作区中有未暂存的改动,git rm 会拒绝删除以防止意外丢失数据——使用 -f 可以强制删除。
  • --cached 模式只从索引中移除跟踪,文件本身保留在工作区,这常用于将文件加入 .gitignore 后停止跟踪。
  • 一旦删除被提交并推送到远端,文件就从共享历史中被移除——虽然 reflog 中可能仍有痕迹,但普通用户已难以恢复。