---
title: "07 - 常見問題與解法"
type: note
specialty: Programming
tags: [git-github, 07-常見問題與解法]
---

# 07 - 常見問題與解法

← [[06-分支管理]] | 下一篇 → [[08-指令速查表]]

---

## ❌ 常見錯誤一覽

---

### 1. `fatal: not a git repository`

**錯誤訊息：**
```
fatal: not a git repository (or any of the parent directories): .git
```

**原因：** 你執行 git 指令的資料夾還沒有初始化。

**解法：**
```bash
git init
```

---

### 2. Push 被拒絕：`rejected - fetch first`

**錯誤訊息：**
```
! [rejected]  main -> main (fetch first)
```

**原因：** GitHub 上有你本地沒有的新 commit。

**解法：**
```bash
git pull
git push
```

---

### 3. Merge Conflict（合併衝突）

**錯誤訊息：**
```
CONFLICT (content): Merge conflict in file.md
```

**解法：**
1. 打開衝突檔案，找到 `<<<<<<<`、`=======`、`>>>>>>>` 標記
2. 手動決定要留哪個版本，刪掉那三行標記
3. 儲存檔案
```bash
git add .
git commit -m "解決合併衝突"
```

---

### 4. `error: failed to push - Permission denied (publickey)`

**原因：** SSH key 沒有設定好，或 GitHub 上沒有你的公鑰。

**解法：**
```bash
# 確認 SSH key 是否存在
ls ~/.ssh/

# 測試 GitHub 連線
ssh -T git@github.com

# 如果失敗，重新設定 SSH key（見 02 章節）
```

---

### 5. `detached HEAD` 狀態

**錯誤訊息：**
```
HEAD detached at a3f1b2c
```

**原因：** 你用 `git checkout [commit hash]` 跳到了過去的某個 commit。

**解法：**
```bash
# 回到 main 分支
git switch main
```

---

### 6. 想修改剛剛的 commit 訊息

```bash
# 修改最後一次 commit 的訊息（只限還沒 push 的）
git commit --amend -m "修正後的訊息"
```

---

### 7. 不小心 `git add` 了不該加的檔案

```bash
# 把檔案從暫存區移除（保留修改）
git restore --staged 檔案名稱

# 把所有暫存區的東西移除
git restore --staged .
```

---

### 8. 不小心刪掉了本地的修改

```bash
# 恢復單一檔案（還沒 commit 的修改）
git restore 檔案名稱

# ⚠️ 這個操作不可逆！
```

---

### 9. 想要完全撤銷最後一次 commit

```bash
# 撤銷 commit，但保留修改（可以重新 commit）
git reset --soft HEAD~1

# 撤銷 commit 並丟棄修改（危險！）
git reset --hard HEAD~1
```

> `HEAD~1` 表示「目前的上一個 commit」

---

### 10. `git push` 要求輸入密碼

**原因：** 你用的是 HTTPS 連線，而不是 SSH。

**解法一：** 改用 SSH（見 [[02-安裝與初始設定]]）

**解法二：** 使用 Personal Access Token 作為密碼

**解法三：** 設定 credential helper（讓 git 記住密碼）
```bash
# macOS
git config --global credential.helper osxkeychain

# Windows
git config --global credential.helper manager
```

---

### 11. 遠端 repo 的名稱改了，怎麼更新本地設定？

```bash
# 更新遠端 URL
git remote set-url origin git@github.com:username/new-repo-name.git

# 確認更新成功
git remote -v
```

---

## 🆘 最後手段：如果一切都壞掉了

如果 repo 搞得一團糟，可以這樣救回來：

```bash
# 方法：重新 clone 一份乾淨的
cd ..
git clone git@github.com:username/repo-name.git repo-clean

# 然後把你想保留的修改，手動複製到新的資料夾
```

---

← [[06-分支管理]] | 下一篇 → [[08-指令速查表]]
