文章目录
- [1. 命令概述](#1. 命令概述)
- [2. 命令格式](#2. 命令格式)
- [3. 基本用法](#3. 基本用法)
-
- [3.1 删除工作区和暂存区的文件](#3.1 删除工作区和暂存区的文件)
- [3.2 删除目录](#3.2 删除目录)
- [3.3 使用通配符删除文件](#3.3 使用通配符删除文件)
- [4. 高级用法](#4. 高级用法)
-
- [4.1 --cached](#4.1 --cached)
- [4.2 -f 或 --force](#4.2 -f 或 --force)
- [4.3 -r](#4.3 -r)
- [4.4 -n 或 --dry-run](#4.4 -n 或 --dry-run)
- [5. 注意事项](#5. 注意事项)
- [6. 补充信息](#6. 补充信息)
-
- [6.1 处理已修改的文件](#6.1 处理已修改的文件)
- [6.2 与 .gitignore 配合使用](#6.2 与 .gitignore 配合使用)
- [6.3 批量清理已被 --cached 的文件](#6.3 批量清理已被 --cached 的文件)
1. 命令概述
git rm 是一个用于从 Git 仓库中删除文件的命令。它的核心功能是:
- 从工作目录(工作区)中物理删除指定的文件。
- 将这次删除操作记录到暂存区(索引区),为下一次提交做好准备。
简单来说,它相当于执行了 rm <file>(删除文件) 和 git add <file>(记录变更) 两个操作的结合。它是 Git 工作流中用于删除文件的"正确"方式。
2. 命令格式
基本的命令格式如下:
bash
git rm [<选项>] <文件或路径>...
你可以同时指定多个文件或使用通配符。
3. 基本用法
3.1 删除工作区和暂存区的文件
这是最标准的用法,用于删除一个已经被 Git 跟踪的文件。
bash
git rm filename.txt
执行后:
filename.txt会从你的硬盘上消失。- 这个删除动作被添加到了暂存区。
3.2 删除目录
使用 -r 或 --recursive 选项来递归删除一个目录及其下的所有内容。
bash
git rm -r directory_name/
3.3 使用通配符删除文件
bash
# 删除所有 .log 文件
git rm *.log
# 删除 logs 目录下所有 .txt 文件
git rm logs/*.txt
4. 高级用法
4.1 --cached
仅从暂存区删除,保留工作区文件。
这是 极其重要 的一个选项。它的作用是停止跟踪文件,但不在硬盘上删除它。
使用场景:
- 你误将不该跟踪的文件加入了 Git (比如编译生成的
*.class, 包含密码的config.properties等)。 - 你希望一个文件被
.gitignore规则忽略,但它已经被 Git 跟踪了(仅添加.gitignore对已跟踪文件无效,必须先取消跟踪)。
bash
git rm --cached secret_file.txt
执行后:
secret_file.txt会从暂存区移除,不再被 Git 跟踪。- 但这个文件仍然保留在你的硬盘上。
- 此时,这个文件会出现在 未跟踪文件(Untracked files) 列表中。
4.2 -f 或 --force
强制删除。
当你要删除的文件在工作区有 尚未暂存的修改 时,Git 为了防止你丢失这些未保存的修改,会拒绝执行 git rm。
bash
$ git rm modified_file.txt
error: the following file has local modifications:
modified_file.txt
(use --cached to keep the file, or -f to force removal)
这时,如果你确认要删除,可以使用 -f 选项强制删除。
bash
git rm -f modified_file.txt
注意: 此操作会永久丢弃你对文件的所有未提交的修改,请谨慎使用。
4.3 -r
递归删除。(用于目录)
如前所述,删除目录时必须使用此选项。
bash
git rm -r old_project/
4.4 -n 或 --dry-run
试运行。这是一个安全选项。它会显示如果执行 git rm 会删除哪些文件,但并不真正执行删除操作。非常适合在批量删除前进行确认。
bash
git rm -n *.tmp
输出会类似:rm file1.tmp, rm file2.tmp,让你清楚即将发生什么。
5. 注意事项
-
只能删除已跟踪的文件 :你不能用
git rm去删除一个 Git 还不知道的文件(即未跟踪文件)。对于未跟踪文件,直接使用系统的rm命令即可。 -
删除操作需要提交 :
git rm只是将"删除"这个动作暂存了起来。你必须再执行一次git commit,这次删除才会被永久记录到版本库的历史中。
bash
git rm file_to_delete.txt
git commit -m "Remove the obsolete file_to_delete.txt"
-
关于恢复:
- 如果在
git rm之后,但在git commit之前,你后悔了,可以使用git restore --staged <file>来取消暂存区的删除,并用git restore <file>从索引中恢复文件到工作区。 - 更通用的恢复命令是
git reset HEAD <file>(取消暂存) 配合git checkout -- <file>(恢复文件),但在新版本 Git 中推荐使用git restore。 - 如果已经提交了删除,你可以通过
git log找到删除前的那个提交的哈希值,然后使用git checkout <commit_hash> -- <file>来恢复文件。
- 如果在
-
git rmvs 系统rm:git rm <file>=rm <file>+git add <file>- 如果你不小心先用了系统的
rm命令删除了文件,你只需要再执行一次git add .或git rm <file>,效果和直接使用git rm是一样的。Git 会识别到工作区的文件被删除了,并将这个变更添加到暂存区。
6. 补充信息
6.1 处理已修改的文件
这是新手最容易困惑的地方。
我们梳理一下不同情况:
| 文件状态 | 直接 git rm |
git rm -f |
git rm --cached |
|---|---|---|---|
| 未修改 | ✅ 成功删除 | ✅ 成功删除 | ✅ 从跟踪列表中移除,文件保留 |
| 已修改(未暂存) | ❌ Git 报错,拒绝操作 | ✅ 强制删除,未保存的修改丢失! | ✅ 从跟踪列表中移除,已修改的文件被保留 |
6.2 与 .gitignore 配合使用
这是一个经典组合拳。如果你发现一个本应被忽略的文件(如 app.log)已经被 Git 跟踪了,你需要:
bash
# 1. 停止跟踪该文件,但保留在本地
git rm --cached app.log
# 2. 确保 .gitignore 文件中有一行 `*.log` 或 `app.log`
echo "*.log" >> .gitignore
# 3. 提交这次变更
git add .gitignore
git commit -m "Stop tracking log files"
这样,app.log 就从版本库中移除了,并且未来也不会再被跟踪,但它依然存在于你的本地目录。
6.3 批量清理已被 --cached 的文件
当你使用 git rm --cached 取消跟踪大量文件后,它们会变成未跟踪文件。如果你想一次性清理掉所有这些未跟踪文件,可以使用:
bash
# 危险操作!会永久删除所有未跟踪文件!
git clean -fd
使用 git clean -n 可以先查看哪些文件会被删除。