(二)日常工作流 - git rm 命令的使用

文章目录

  • [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 仓库中删除文件的命令。它的核心功能是:

  1. 从工作目录(工作区)中物理删除指定的文件。
  2. 将这次删除操作记录到暂存区(索引区),为下一次提交做好准备。

简单来说,它相当于执行了 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.tmprm file2.tmp,让你清楚即将发生什么。

5. 注意事项

  1. 只能删除已跟踪的文件 :你不能用 git rm 去删除一个 Git 还不知道的文件(即未跟踪文件)。对于未跟踪文件,直接使用系统的 rm 命令即可。

  2. 删除操作需要提交git rm 只是将"删除"这个动作暂存了起来。你必须再执行一次 git commit,这次删除才会被永久记录到版本库的历史中。

bash 复制代码
git rm file_to_delete.txt    
git commit -m "Remove the obsolete file_to_delete.txt"    
  1. 关于恢复

    • 如果在 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> 来恢复文件。
  2. git rm vs 系统 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 可以先查看哪些文件会被删除。

相关推荐
这是个栗子30 分钟前
git报错:‘git‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
git
inferno35 分钟前
TortoiseGit下载与安装
git
取名真是44 分钟前
Git 到底是干啥的?零基础小白听完都懂了并且轻松驾驭它
git
AA陈超3 小时前
Git常用命令大全及使用指南
笔记·git·学习
无限进步_3 小时前
C语言数组元素删除算法详解:从基础实现到性能优化
c语言·开发语言·windows·git·算法·github·visual studio
松涛和鸣3 小时前
16、C 语言高级指针与结构体
linux·c语言·开发语言·数据结构·git·算法
楠语3 小时前
从指针行为理解Git中的reset操作
git
扛麻袋的少年6 小时前
git reset 和 git reflog 解决代码分支提交错误
git
放学有种别跑、8 小时前
GIT使用指南
大数据·linux·git·elasticsearch