- 已经会基本提交和分支操作的开发者
- 想理解命令边界与风险的人
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 -u 或 git commit -a 让 Git 感知删除;但 git rm 会把“删除文件”和“暂存删除记录”一起完成。
风险点
git rm删除的是已跟踪文件- 如果还没提交,通常还能从历史或工作区恢复
- 一旦提交并推送,删除就会进入共享历史
这条命令在流程里解决什么问题
git rm 同时在工作区和暂存区两个层面删除文件:它会从文件系统中移除文件(工作区),并把"删除"这一操作记录到索引中(暂存区)。它解决的是"让 Git 知道文件被删除了,并准备进入下一次提交"的问题。
典型用例
- 删除文件并自动暂存删除记录(
git rm <file>),一步完成文件系统删除和 Git 暂存。 - 只从 Git 跟踪中移除但保留本地文件(
git rm --cached <file>),常用于把误提交的文件加入.gitignore后的处理。 - 递归删除整个目录(
git rm -r <dir>),适合清理不再需要的文件夹。
图例理解
已跟踪的文件路径(可选)--cached 只删索引
工作区中文件被删除索引中已暂存的删除记录
可以用系统 rm 删除文件后再用 git add -u 达到类似效果,但 git rm 一步到位、意图更清晰。
特殊情况与边界
git rm只对已跟踪的文件有效,对未跟踪的文件使用会报错。- 如果文件在工作区中有未暂存的改动,
git rm会拒绝删除以防止意外丢失数据——使用-f可以强制删除。 --cached模式只从索引中移除跟踪,文件本身保留在工作区,这常用于将文件加入.gitignore后停止跟踪。- 一旦删除被提交并推送到远端,文件就从共享历史中被移除——虽然 reflog 中可能仍有痕迹,但普通用户已难以恢复。