# 【Git】git revert <commit> 和 git checkout <commit> 差異

`git revert <commit>` 和 `git checkout <commit>` 雖然都能「回到某個 commit」，但本質上用途完全不同。以下為詳細說明與比較。

---

## 一、`git revert <commit>`

### 功能說明：

- 用來\*\*「反向操作」某個已提交的 commit\*\*。
- Git 會建立一個新的 commit，內容是將指定的 commit 所做的變更**還原回去**。
- 原本的 commit 仍然會保留在歷史中。

### 特性：

- **安全**，適合多人協作情境。
- **保留歷史紀錄**。
- 可選擇 revert 多個 commit（可搭配 `-n` 進行批次處理）。

### 使用情境：

- 已經 push 到遠端，但發現某個 commit 有誤，需要「撤銷」那次變更，但不想刪除歷史。
- 緊急修復 bug，並希望讓其他人看見這次的「撤銷行為」。

### 範例：

```bash
git revert a1b2c3d

```

會產生一個新的 commit，把 `a1b2c3d` 的內容還原。

---

## 二、`git checkout <commit>`（或 `git switch --detach <commit>`）

### 功能說明：

- 將當前工作目錄切換到某個過去的 commit（**進入 detached HEAD 狀態**）。
- 不會建立新的 commit，純粹只是瀏覽某個歷史狀態。
- 如果在此狀態下修改檔案並 commit，會產生「無分支」的 commit（容易遺失）。

### 特性：

- 不會變動歷史，也不會建立新 commit。
- 適合測試、比較、build 老版本。

### 使用情境：

- 想**檢查過去某次版本的內容**、debug、測試、build。
- 需要比較不同版本的行為。

### 範例：

```bash
git checkout a1b2c3d
# 或推薦用法（Git 2.23+）
git switch --detach a1b2c3d

```

---

## 三、兩者比較表

<table id="bkmrk-%E6%8C%87%E4%BB%A4-%E5%8B%95%E4%BD%9C%E9%A1%9E%E5%9E%8B-%E6%98%AF%E5%90%A6%E5%BB%BA%E7%AB%8B%E6%96%B0-commit"><thead><tr><th>指令</th><th>動作類型</th><th>是否建立新 commit</th><th>是否修改歷史</th><th>是否可安全推送遠端</th><th>常見用途</th></tr></thead><tbody><tr><td>`git revert <commit>`</td><td>**建立反向 commit**</td><td>✅ 是</td><td>❌ 否</td><td>✅ 是</td><td>撤銷已推送的錯誤 commit</td></tr><tr><td>`git checkout <commit>`</td><td>**切換版本**</td><td>❌ 否</td><td>❌ 否</td><td>⚠️ 不適合推送 detached commit</td><td>查看歷史、測試、debug</td></tr></tbody></table>

---

## 四、補充說明：若想基於某個舊 commit 建立新分支

```bash
git checkout -b new-branch a1b2c3d

```

這樣可以保留該版本的狀態，並在其上繼續開發，而不會讓 HEAD 處於 detached 狀態。

---

如果你有實際情境（例如：某個 commit 上錯 production，或想回復某功能），可以提供情況，我能幫你判斷該用 revert 還是 checkout 或其他方案。