07 - 常見問題與解法
❌ 常見錯誤一覽
1. fatal: not a git repository
錯誤訊息:
fatal: not a git repository (or any of the parent directories): .git
原因: 你執行 git 指令的資料夾還沒有初始化。
解法:
git init2. Push 被拒絕:rejected - fetch first
錯誤訊息:
! [rejected] main -> main (fetch first)
原因: GitHub 上有你本地沒有的新 commit。
解法:
git pull
git push3. Merge Conflict(合併衝突)
錯誤訊息:
CONFLICT (content): Merge conflict in file.md
解法:
- 打開衝突檔案,找到
<<<<<<<、=======、>>>>>>>標記 - 手動決定要留哪個版本,刪掉那三行標記
- 儲存檔案
git add .
git commit -m "解決合併衝突"4. error: failed to push - Permission denied (publickey)
原因: SSH key 沒有設定好,或 GitHub 上沒有你的公鑰。
解法:
# 確認 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。
解法:
# 回到 main 分支
git switch main6. 想修改剛剛的 commit 訊息
# 修改最後一次 commit 的訊息(只限還沒 push 的)
git commit --amend -m "修正後的訊息"7. 不小心 git add 了不該加的檔案
# 把檔案從暫存區移除(保留修改)
git restore --staged 檔案名稱
# 把所有暫存區的東西移除
git restore --staged .8. 不小心刪掉了本地的修改
# 恢復單一檔案(還沒 commit 的修改)
git restore 檔案名稱
# ⚠️ 這個操作不可逆!9. 想要完全撤銷最後一次 commit
# 撤銷 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 記住密碼)
# macOS
git config --global credential.helper osxkeychain
# Windows
git config --global credential.helper manager11. 遠端 repo 的名稱改了,怎麼更新本地設定?
# 更新遠端 URL
git remote set-url origin git@github.com:username/new-repo-name.git
# 確認更新成功
git remote -v12. Push 一直被拒,而且 pull 又一直有新東西(背景自動同步打架)
情境: repo 有背景自動同步(如 obsidian-git 每 10 分鐘 push),你才剛 pull 完、push 卻又被拒。
解法: push 前改用 --rebase,並用「retry + 指數退避」重試:
git pull --rebase origin main
git push origin main
# 若又被拒 → 等 2s 再試,仍失敗等 4s、8s、16s(指數退避)完整實戰見 09-實戰工作流範例。
13. rebase 撞到衝突,想中途放棄
# 放棄整個 rebase,回到 rebase 之前的狀態
git rebase --abort解完衝突要繼續是
git rebase --continue(不是git commit)。
14. 找回「不見了」的 commit(reflog 救命)
如果 reset --hard 或 rebase 後發現某些 commit 好像消失了,先別慌:
# reflog 記錄了 HEAD 移動過的每一步
git reflog
# 找到那個還在的 commit hash,回到它
git reset --hard a3f1b2c
reflog是本地的後悔藥,大部分「弄丟的 commit」其實都還救得回來。
15. 不小心 commit 到錯的分支
# 假設該 commit 應該在 feature 分支,卻 commit 到了 main
git switch feature/xxx # 切到正確分支
git cherry-pick <commit hash> # 把那個 commit 搬過來
# 再回 main 把誤入的 commit 移除(本地未 push 時)
git switch main
git reset --hard HEAD~1🆘 最後手段:如果一切都壞掉了
如果 repo 搞得一團糟,可以這樣救回來:
# 方法:重新 clone 一份乾淨的
cd ..
git clone git@github.com:username/repo-name.git repo-clean
# 然後把你想保留的修改,手動複製到新的資料夾