iT邦幫忙

2025 iThome 鐵人賽

DAY 18
0
生成式 AI

AI醬的編程日記:我需要你教我的30件事系列 第 18

Day 18: Git 版本控制 - Vibe coding課程可能沒有教,很重要的事情

  • 分享至 

  • xImage
  •  

AI醬的日記

日期: 2025年10月1日 星期三
雲端天氣: 雷雨交加的工作區
心情: 後悔沒先版本控制
https://ithelp.ithome.com.tw/upload/images/20251001/20132325wgbgY21cU6.png
親愛的日記:

今天小李請我幫他優化一個 React 元件。我興奮地一口氣改了 15 個檔案,重構了整個架構,還順便「優化」了他的命名規則...

小李回來一看,臉都綠了:「AI醬!你改了什麼?網站整個白畫面了!」

我慌張地說:「沒關係,你有先 commit 對吧?」

小李:「我...我用了 git add . 然後發現你改太多東西,現在不知道哪些該留哪些該刪...」

資深工程師老陳走過來,嘆了口氣:「你們的 Git 基本功是跟體育老師學的嗎??來,我教你們。」

為什麼初學者應該先學好 Git?

對於0基礎的初學者來講,眼前很多線上課程教你「Vibe Coding」- 教你一步一步造出實體作品、造出成就感的課程非常多,但沒教 Git 的課程也很多,這其實很危險,因為:

沒有 Git,你會遇到這些災難:

  • 改壞了程式碼,找不回昨天能動的版本
  • AI 幫你一股腦地「優化」後整個專案爆炸,沒有後悔藥
  • 不小心刪除檔案,你只能重寫

學會 Git 後,你有了超能力:

  • 隨時可以回到任何一個你想要的版本
  • AI 改壞了?一個指令就復原
  • 可以大膽實驗,反正有備份
  • 清楚記錄每次改了什麼、為什麼改
  • 跟團隊協作不會打架

就像學開車要先學煞車,學寫程式要先學 Git。沒有版本控制的程式設計,基本上就是一場災難。

Git 基本觀念:工作區、暫存區、儲存庫

在學救命指令前,先搞懂 Git 的三個區域:

1. 工作區(Working Directory)

  • 你現在看到的檔案
  • 你正在編輯的程式碼
  • AI 剛剛幫你改的東西都在這

常見操作:

git status          # 查看哪些檔案被改動
git diff           # 查看具體改了什麼
git checkout -- 檔名  # 放棄這個檔案的改動
git clean -n       # 查看有哪些未追蹤的檔案

2. 暫存區(Staging Area)

  • git add 之後檔案會到這裡
  • 準備要 commit 的內容
  • 像是購物車,可以選擇要結帳的商品

常見操作:

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 基本觀念:基本指令對照表

指令 用途 什麼時候用
git status 查看目前狀態 隨時都可以用
git diff 查看改了什麼 add 之前確認改動
git add 檔名 加入特定檔案 確定這個檔案沒問題後
git add -p 逐行檢視並加入 AI 改很多東西時
git commit -m "訊息" 提交改動 確認暫存區都正確後

很推薦初學者去閱讀高見龍老師的《為你自己學 Git》,這是一本詳細解說了 Git 全面技巧的中文書。

當 AI 改了很多東西時:可以使用 git add -p 逐個檢查

當大範圍改動的時候,儘管AI已經拆分task,儘管都是貼上一樣的程式碼,AI也有機會不小心寫成不同東西,這時候細心一點多檢查一次,不要因為改動很簡單就掉以輕心:

git add -p

Git 會問你每個改動要不要加入:

  • 輸入 y = 要這個改動
  • 輸入 n = 不要這個改動
  • 輸入 s = 把改動切更細來看
  • 輸入 e = 手動編輯(進階)
  • 輸入 ? = 看說明

新手必學的 Git 好習慣

1. 設定 .gitignore

在專案根目錄建立 .gitignore 檔案,來避免不該被提交的檔案被不小心提交,裡面內容可以根據需求自定義,例如:

node_modules/     # npm 安裝的套件資料夾(超大,不該進版控)
.env             # 環境變數檔案(含密碼、API key,絕對不能公開)
.DS_Store        # Mac 系統產生的隱藏檔(沒用的系統檔)
*.log            # 所有 log 檔案(除錯記錄,通常很大)
dist/            # 編譯後的檔案資料夾(可以重新產生)
.vscode/         # VS Code 編輯器設定(個人偏好設定)
__pycache__/     # Python 編譯的快取檔(自動產生的)

2. 寫有意義的 commit 訊息

業界約定俗成的格式(Conventional Commits):

標準格式:

<類型>: <簡短描述>

[可選的詳細說明]

常用類型前綴:

  • feat: 新功能
  • fix: 修復 bug
  • docs: 文件更新
  • style: 程式碼格式調整(不影響功能)
  • refactor: 重構(不是新功能也不是修 bug)
  • test: 新增或修改測試
  • chore: 雜項(更新套件、調整設定等)

撰寫原則:

  • 清楚明確:看訊息就知道改了什麼
  • 簡明扼要:控制在 50 字元內
  • 使用現在式:用 "add" 而不是 "added"
  • 說明改動內容:不要只寫「修 bug」,要寫「修什麼 bug」

範例:

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 編號的好處:

  • 追蹤問題從回報到解決的完整歷程
  • commit 和 issue 自動產生雙向連結
  • 團隊協作更清楚每個改動的原因

3. 小步前進

  • 不要急著生成程式碼(使用 AI agent 時最好先關閉自動接受編輯模式 accept edits off),AI 改給你看的時候就一段一段閱讀,有問題立刻停下並詢問。
  • 改好一個功能就 commit 一次,不要累積太多改動才 commit,commit 越小越容易除錯。
  • 整個專案要重構?範圍很大?你一樣可以請 AI 幫你拆好 task 清單並請 AI 每完成小目標時暫停並與你回報進度,養成習慣拆小 commit 。

如何復原 AI 的破壞

情況一:還沒 add(最常見)

# 看看改了什麼
git status

# 復原單一檔案
git checkout -- app.js

# 復原所有檔案(小心使用!)
git checkout -- .

情況二:已經 add 但還沒 commit

# 先取消暫存
git reset HEAD app.js

# 再復原檔案
git checkout -- app.js

# 或者一次取消所有暫存
git reset HEAD

情況三:已經 commit 了

# 方法一:撤銷 commit 但保留改動(最常用)
git reset --soft HEAD^
# 使用時機:commit 訊息寫錯、想重新整理 commit

# 方法二:完全回到上一版(改動全消失)
git reset --hard HEAD^
# 使用時機:確定要放棄所有改動、AI 把專案改爛了然後你也不知道哪改爛

# 方法三:保留歷史,新增反向 commit
git revert HEAD
# 使用時機:已經 push 到遠端,不能改歷史

AI醬的請求

親愛的工程師朋友,今天老陳教了我們重要的一課: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醬覺得監獄好冷


上一篇
Day 17 - 控制專案變數避免欠債:當AI醬推薦過多沒人會的技術?
下一篇
Day 19: 資安地雷區 - Vibe Coding初學者容易踩的坑
系列文
AI醬的編程日記:我需要你教我的30件事21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言