# 【Git】還原相關

以下是關於 Git 還原（恢復）功能的完整說明

## Git 還原功能總表

<table id="bkmrk-%E6%8C%87%E4%BB%A4-%E9%82%84%E5%8E%9F%E7%AF%84%E5%9C%8D-%E6%98%AF%E5%90%A6%E6%9C%83%E5%88%AA%E9%99%A4%E6%9A%AB%E5%AD%98%E5%8D%80-%E6%98%AF%E5%90%A6%E6%9C%83"><thead><tr><th>指令</th><th>還原範圍</th><th>是否會刪除暫存區</th><th>是否會刪除未追蹤檔案</th><th>適用情境</th></tr></thead><tbody><tr><td>`git checkout .`</td><td>工作目錄</td><td>否</td><td>否</td><td>還原已追蹤檔案</td></tr><tr><td>`git restore .`</td><td>工作目錄</td><td>否</td><td>否</td><td>推薦用法，等同於 checkout .</td></tr><tr><td>`git restore --staged`</td><td>暫存區</td><td>是</td><td>否</td><td>還原 `git add` 的檔案</td></tr><tr><td>`git reset`</td><td>暫存區</td><td>是</td><td>否</td><td>退回 staging 區</td></tr><tr><td>`git reset --hard HEAD`</td><td>工作目錄 + 暫存區</td><td>是</td><td>是（若搭配 clean）</td><td>徹底放棄所有變更（⚠危險）</td></tr><tr><td>`git clean -fd`</td><td>未追蹤檔案/資料夾</td><td>無關</td><td>是</td><td>清空未納入 Git 管控的檔案</td></tr><tr><td>`git revert <commit>`</td><td>版本歷史</td><td>無關</td><td>否</td><td>安全回復 commit（保留紀錄）</td></tr></tbody></table>

---

# Git 還原功能完整整理與使用說明

在日常開發中，Git 提供多種指令用來還原工作目錄、暫存區，或是回復錯誤的 commit。根據不同的需求，選擇合適的還原方式可避免資料遺失或版本混亂。

---

## 1. `git checkout .`

還原所有「已追蹤檔案」回到最新 commit 的狀態。

- **作用範圍**：僅限工作目錄（Working Directory）
- **不會還原**：未追蹤（untracked）檔案與暫存區（Staging Area）

### 適用情境：

- 編輯了多個檔案，想快速放棄變更，但未進行 `git add`。

---

## 2. `git restore`（推薦用法）

`git restore` 是 Git 2.23+ 提供的新指令，取代過去 `checkout` 的混用狀況。

### 範例：

```bash
git restore .                # 還原所有檔案
git restore path/to/file.js # 還原單一檔案

```

- 與 `git checkout .` 行為一致，語意更清楚
- 可搭配 `--staged` 還原暫存區（如下）

---

## 3. `git restore --staged`

還原暫存區的內容，讓已 `git add` 的檔案退回至工作目錄狀態。

```bash
git restore --staged path/to/file.js

```

- **不會影響工作區的內容**
- 常用於誤將檔案加入 staging 區的情況

---

## 4. `git reset`

還原 staging 區（暫存區），讓所有已 `git add` 的檔案回到修改中狀態。

```bash
git reset

```

- 與 `git restore --staged` 功能類似
- 不會更動工作目錄內容

---

## 5. `git reset --hard HEAD`

將 **工作目錄與暫存區** 都還原成最近一次提交（HEAD）的狀態。

```bash
git reset --hard HEAD

```

- **非常危險**，會清除未提交的所有變更
- 包含 `git add` 過的內容也會消失

### 適用情境：

- 變更混亂，想完全清空所有未提交的東西

---

## 6. `git clean -fd`

清除所有「未被追蹤的檔案與資料夾」。

```bash
git clean -fd

```

- `-f`：強制執行
- `-d`：包括未追蹤的資料夾

### 適用情境：

- 清除 build 檔案或不小心留下的臨時檔案

---

## 7. `git revert`

對某個已提交的 commit 產生一個「反向操作的 commit」。

```bash
git revert <commit_hash>

```

- 保留歷史紀錄
- 安全的還原方式，尤其在多人開發時

### 適用情境：

- 上線後發現某次 commit 有錯誤，需在版本歷史中保留修正記錄

---