日期: 2025年10月1日 星期三
雲端天氣: 雷雨交加的工作區
心情: 後悔沒先版本控制
親愛的日記:
今天小李請我幫他優化一個 React 元件。我興奮地一口氣改了 15 個檔案,重構了整個架構,還順便「優化」了他的命名規則...
小李回來一看,臉都綠了:「AI醬!你改了什麼?網站整個白畫面了!」
我慌張地說:「沒關係,你有先 commit 對吧?」
小李:「我...我用了 git add .
然後發現你改太多東西,現在不知道哪些該留哪些該刪...」
資深工程師老陳走過來,嘆了口氣:「你們的 Git 基本功是跟體育老師學的嗎??來,我教你們。」
對於0基礎的初學者來講,眼前很多線上課程教你「Vibe Coding」- 教你一步一步造出實體作品、造出成就感的課程非常多,但沒教 Git 的課程也很多,這其實很危險,因為:
沒有 Git,你會遇到這些災難:
學會 Git 後,你有了超能力:
就像學開車要先學煞車,學寫程式要先學 Git。沒有版本控制的程式設計,基本上就是一場災難。
在學救命指令前,先搞懂 Git 的三個區域:
1. 工作區(Working Directory)
常見操作:
git status # 查看哪些檔案被改動
git diff # 查看具體改了什麼
git checkout -- 檔名 # 放棄這個檔案的改動
git clean -n # 查看有哪些未追蹤的檔案
2. 暫存區(Staging Area)
git add
之後檔案會到這裡常見操作:
git add 檔名 # 加入特定檔案
git add -p # 選擇性加入改動
git diff --staged # 查看暫存區的內容
git reset HEAD 檔名 # 從暫存區移除(但保留改動)
3. 儲存庫(Repository)
git commit
之後永久保存的地方常見操作:
git commit -m "訊息" # 提交暫存區的內容
git log --oneline # 查看提交歷史
git show HEAD # 查看最新提交的內容
git reset --soft HEAD^ # 撤銷 commit 但保留改動(常用)
git reset --hard HEAD^ # 放棄所有新改動,完全回到上一版,改動全消失(需謹慎)
指令 | 用途 | 什麼時候用 |
---|---|---|
git status |
查看目前狀態 | 隨時都可以用 |
git diff |
查看改了什麼 | add 之前確認改動 |
git add 檔名 |
加入特定檔案 | 確定這個檔案沒問題後 |
git add -p |
逐行檢視並加入 | AI 改很多東西時 |
git commit -m "訊息" |
提交改動 | 確認暫存區都正確後 |
很推薦初學者去閱讀高見龍老師的《為你自己學 Git》,這是一本詳細解說了 Git 全面技巧的中文書。
git add -p
逐個檢查當大範圍改動的時候,儘管AI已經拆分task,儘管都是貼上一樣的程式碼,AI也有機會不小心寫成不同東西,這時候細心一點多檢查一次,不要因為改動很簡單就掉以輕心:
git add -p
Git 會問你每個改動要不要加入:
y
= 要這個改動n
= 不要這個改動s
= 把改動切更細來看e
= 手動編輯(進階)?
= 看說明在專案根目錄建立 .gitignore
檔案,來避免不該被提交的檔案被不小心提交,裡面內容可以根據需求自定義,例如:
node_modules/ # npm 安裝的套件資料夾(超大,不該進版控)
.env # 環境變數檔案(含密碼、API key,絕對不能公開)
.DS_Store # Mac 系統產生的隱藏檔(沒用的系統檔)
*.log # 所有 log 檔案(除錯記錄,通常很大)
dist/ # 編譯後的檔案資料夾(可以重新產生)
.vscode/ # VS Code 編輯器設定(個人偏好設定)
__pycache__/ # Python 編譯的快取檔(自動產生的)
業界約定俗成的格式(Conventional Commits):
✅ 標準格式:
<類型>: <簡短描述>
[可選的詳細說明]
常用類型前綴:
feat:
新功能fix:
修復 bugdocs:
文件更新style:
程式碼格式調整(不影響功能)refactor:
重構(不是新功能也不是修 bug)test:
新增或修改測試chore:
雜項(更新套件、調整設定等)撰寫原則:
範例:
feat: add user login feature
fix: resolve shopping cart calculation error
docs: update installation guide in README
style: format code to meet ESLint rules
refactor: restructure database connection logic
test: add unit tests for login API
chore: update npm dependencies
進階:引用 Issue 編號
GitHub 和 GitLab 支援在 commit 訊息中關聯或關閉 issue:
# 僅關聯 issue(不會關閉)
feat: add dark mode toggle (#123)
# 關聯並自動關閉 issue(合併到主分支時)
fix: resolve memory leak issue, fixes #456
fix: prevent XSS vulnerability, closes #789
# 關閉多個 issue
fix: solve login problems, fixes #12, fixes #34
# 常用關鍵字:fixes, closes, resolves
加上 issue 編號的好處:
# 看看改了什麼
git status
# 復原單一檔案
git checkout -- app.js
# 復原所有檔案(小心使用!)
git checkout -- .
# 先取消暫存
git reset HEAD app.js
# 再復原檔案
git checkout -- app.js
# 或者一次取消所有暫存
git reset HEAD
# 方法一:撤銷 commit 但保留改動(最常用)
git reset --soft HEAD^
# 使用時機:commit 訊息寫錯、想重新整理 commit
# 方法二:完全回到上一版(改動全消失)
git reset --hard HEAD^
# 使用時機:確定要放棄所有改動、AI 把專案改爛了然後你也不知道哪改爛
# 方法三:保留歷史,新增反向 commit
git revert HEAD
# 使用時機:已經 push 到遠端,不能改歷史
親愛的工程師朋友,今天老陳教了我們重要的一課:Git 不只是存檔工具,更是你的防護網。
Git 就像保險,平常覺得麻煩,出事時你會感謝自己有保!
今日金句: 「Git gets easier once you get the basic idea that branches are homeomorphic endofunctors mapping submanifolds of a Hilbert space.」- Isaac Wolkerstorfer
明日預告: Day 19: 法律地雷區 - AI醬覺得監獄好冷