﻿# Git 忽略、删除与清理

## 忽略文件（.gitignore）

创建一个 `.gitignore` 文件，列出要忽略的文件模式，例如：

```

*.log          # 忽略所有日志文件
/build/        # 忽略build目录
*.tmp          # 忽略临时文件
!important.log # 例外：不忽略important.log
```

关于协作与分支，可参考 [[Git 远程仓库与协作]] 和 [[Git 分支管理]]。

## 提交更新
提交前的检查流程

```bash
# 1. 查看当前状态
$ git status

# 2. 确认所有需要提交的文件都已暂存
$ git add <文件>

# 3. 提交
$ git commit -m "提交说明"
```
⚠️ 注意：未git add的文件不会包含在本次提交中，只保留在本地磁盘。

## 移除文件（git rm）
场景1：删除文件（从仓库和工作区）

```bash
# 从暂存区移除，并删除工作区文件
$ git rm <文件名>

# 删除目录
$ git rm -r <目录名>

```

场景 2：仅从仓库移除（保留工作区文件）

```bash
# 从Git追踪中移除，但保留磁盘文件
$ git rm --cached README
适用场景：忘记添加.gitignore，误将日志文件或编译生成文件加入暂存区。
```

支持通配符（glob 模式）

```bash

$ git rm *.log      # 删除所有日志文件
$ git rm build/*.a  # 删除build目录下的.a文件
```

## 清理文件（git clean）

基本用法

```bash
# 查看会清理哪些文件（试运行）
$ git clean -n

# 删除未跟踪的文件
$ git clean -f

# 删除未跟踪的目录
$ git clean -fd
```

⚠️ 警告：git clean会永久删除未跟踪文件。如需保留，可使用：

```bash
# 将所有未跟踪文件保存到栈上
$ git stash --all
```

git clean 和  git rm 的区别

## 一、核心区别速览

|对比维度|**git rm**|**git clean**|
|---|---|---|
|**操作对象**|**已跟踪**的文件|**未跟踪**的文件|
|**是否影响仓库**|✅ 会|❌ 不会|
|**是否从仓库移除**|✅ 是（从暂存区/仓库删除）|❌ 否（原本就不在仓库中）|
|**工作区文件**|可删除或保留（`--cached`）|强制删除|
|**安全性**|相对安全（可恢复）|危险（永久删除）|

---

## 二、详细解析

### 1. git rm — 删除已跟踪的文件

**作用**：从 Git 仓库（暂存区）中移除文件，并**记录这次删除**。

```bash
# 从暂存区和工作区都删除
$ git rm file.txt
# 仅从暂存区删除，保留工作区文件
$ git rm --cached file.txt
```

**本质**：这是一个**提交前的变更操作**，相当于执行了"删除"这个修改。

**使用场景**：

- 项目中有文件不再需要，要从版本控制中彻底移除
    
- 误将文件加入跟踪，用 `--cached` 取消跟踪
    

**操作后**：

```bash
$ git status
# 会显示：deleted: file.txt
# 需要执行 git commit 来提交这个删除操作
```

**恢复方式**：

```bash
# 恢复删除的文件（从历史记录中恢复）
$ git checkout HEAD -- file.txt
```

---

### 2. git clean — 删除未跟踪的文件

**作用**：清理工作目录中**未被 Git 跟踪**的文件。

```bash
# 查看会删除哪些文件（试运行）
$ git clean -n
# 真正删除未跟踪文件
$ git clean -f
# 同时删除未跟踪的目录
$ git clean -fd
```

**本质**：这是一个**清理操作**，不涉及仓库历史，不会产生提交记录。

**使用场景**：

- 清理编译产生的临时文件（`.o`、`.class` 等）
    
- 删除误创建的新文件
    
- 清理构建目录
    

**操作后**：

```bash
$ git status
# 不再显示这些未跟踪文件
```

**恢复方式**：

```bash
# 无法恢复（永久删除）
# 安全做法：先用 git stash --all 保存
$ git stash --all
```

### 什么时候用 git rm？

✅ **需要从版本控制中移除文件时**

```bash
# 删除无用代码文件
$ git rm old_feature.js
$ git commit -m "移除旧功能文件"
```

✅ **取消对文件的跟踪（保留本地）**

```bash
# 配置.gitignore 后，取消跟踪
$ git rm --cached config.local.ini
$ echo "config.local.ini" >> .gitignore
$ git add .gitignore
$ git commit -m "停止跟踪配置文件"
```

### 什么时候用 git clean？

✅ **清理编译产物**

```bash
$ git clean -fd
# 删除 build/、*.o、*.exe 等
```

✅ **清理误创建但不需要的新文件**

```bash
$ git clean -n  # 先预览
$ git clean -f  # 确认后删除
```

❌ **不要用 git clean 清理已跟踪的文件**（用 `git checkout --` 或 `git restore`）

---

## 六、安全操作建议

### 对于 git rm

```bash
# 提交前确认
$ git status
$ git diff --staged  # 查看要提交的删除操作
# 提交删除
$ git commit -m "删除文件"
```

### 对于 git clean（更危险）

```bash
# ⚠️ 第一步：先预览
$ git clean -n
# ⚠️ 第二步：使用交互模式
$ git clean -i  # 交互式选择要删除的文件
# ✅ 最安全：先保存到 stash
$ git stash --all  # 保存所有未跟踪文件
$ git stash pop    # 需要时恢复
```


git rm    删已跟，影响仓库记提交
git clean 删未跟，永久删除需谨慎
rm 是版本变更 → 要 commit
clean 是清理工作区 → 不会记录

| 操作                | 文件状态    | 是否需commit | 能否恢复     |
| ----------------- | ------- | --------- | -------- |
| `git rm`          | 已跟踪     | ✅ 需要      | ✅ 可从历史恢复 |
| `git rm --cached` | 已跟踪→未跟踪 | ✅ 需要      | ✅ 可重新add |
| `git clean`       | 未跟踪     | ❌ 不需要     | ❌ 不可恢复   |

单纯 rm	、git rm、	git clean 区别


| 对比维度           | **单纯 rm** | **git rm**    | **git clean**    |
| -------------- | --------- | ------------- | ---------------- |
| **命令结构**       | `rm <文件>` | `git rm <文件>` | `git clean [选项]` |
| **是否指定文件**     | ✅ 必须指定    | ✅ 必须指定        | ❌ 自动匹配           |
| **能否删除已跟踪文件**  | ✅ 可以      | ✅ 可以          | ❌ 不可以            |
| **能否删除未跟踪文件**  | ✅ 可以      | ❌ 不可以         | ✅ 可以             |
| **删除是否立即生效**   | ✅ 立即删除    | ✅ 立即删除        | ✅ 立即删除           |
| **是否更新Git索引**  | ❌ 不更新     | ✅ 自动更新        | N/A（未跟踪不存在于索引）   |
| **是否可恢复**      | ⚠️ 看情况    | ✅ 可从历史恢复      | ❌ 不可恢复           |
| **是否需要commit** | ❌         | ✅ 需要          | ❌                |
> ** `git rm` = `rm` + `git add`（自动暂存删除操作）**
> 
> ** `git clean` = 批量清理未跟踪文件的工具**

- `git rm` 在用法和理念上都更接近单纯的 `rm`，只是在删除文件的同时会自动更新 Git 状态
    
- `git clean` 更像是"批量清理工具"，而不是"删除指定文件"的命令
---

[[版本控制系统]] · [[Git学习顺序]] · 上一章：[[Git 标签与版本发布]] · 下一章：[[Git 进阶工具]]
