學生問題庫(FAQ)
FAQ-001 Branch 和 worktree 有甚麼分別?怎樣在視覺上區分?
相關單元:M4(分支)· M8(並行工作) 提問:2026-10-03
簡答:branch 是歷史上的一張標籤,worktree 是磁碟上的一個資料夾。
| Branch | Worktree | |
|---|---|---|
| 本質 | 指向某個 commit 的可移動標籤 | 磁碟上一個實際資料夾 |
| 回答的問題 | 「我在哪一條歷史線上?」 | 「我在哪一張桌上工作?」 |
| 成本 | 幾乎為零(一個很小的檔案) | 一整份工作檔案 |
| 查看命令 | git branch、git log --graph |
git worktree list、檔案管理器 |
比喻:repo 是一本書。branch 是夾在書裏的書籤。worktree 是一張書桌,桌上攤開這本書,翻到某一張書籤的位置。只有一張書桌時,要看另一張書籤就得翻頁(git switch),桌上的內容會被換掉。多開幾張書桌(git worktree add),就能同時攤開幾頁,但書始終只有一本(.git 只有一份)。
規則:同一個 branch 同一時間只能在一個 worktree 被 check out,因為兩張書桌不能同時翻到同一張書籤並各自修改。
圖示(課程繪圖時採用的配色):
- 上層灰色框=.git,一份共用的歷史(commit 圖);
- 紫色標籤=branch,貼在 commit 上;
- 下層青色框=worktree,各自以虛線箭頭(HEAD)指向一張標籤;
- 主 worktree 內有真正的 .git 資料夾;其他 worktree 只有一個 .git 檔案,內容指回主倉庫。
text
.git(一份歷史)
A ── B ── C ← main
\
D ── E ← feature
▲ ▲
│ HEAD │ HEAD
~/app/ ~/app-feature/
(主 worktree) (linked worktree)
動手驗證:
bash
git worktree add ../app-feature feature # 開第二張書桌
git worktree list # 列出所有書桌
cat ../app-feature/.git # 是檔案,內容指向主倉庫
常見誤解:「開一個 worktree 就是複製了一份 repo。」不是。歷史只有一份;在任何一個 worktree 提交,其他 worktree 立即看得到該 commit,只是各自的工作檔案互不影響。
FAQ-002 main 加不加保護規則(protect main),有甚麼分別?
相關單元:M11(守住單一正本)· M10(協作流程) 提問:2026-10-03
簡答:不加保護,任何有寫入權的人(包括 AI agent)都可以直接改寫正本。加了保護,所有改動都要經過 PR 這道門。
| 操作 | 不加保護 | 加保護 |
|---|---|---|
git push origin main 直接推送 |
可以 | 被拒絕,必須經 PR |
push --force 改寫已共享的歷史 |
可以,舊 commit 從遠端消失 | 被拒絕 |
刪除受保護的分支(例如 release/2025) |
可以 | 被拒絕(要勾「禁止刪除」) |
| 合併前要求審查/CI 通過 | 無法強制 | 可設為必要條件 |
| 每個改動留下記錄(為甚麼改、誰批准) | 只有 commit | 有 PR、討論和審查記錄 |
比喻:不加保護,像正本放在一張誰都可以直接改的桌上;加了保護,所有人只能交修訂稿(PR),經門口的人(審查和檢查)放行後才合入正本。
代價:每次改動都要「開分支 → 開 PR → 合併」,多幾步操作。一個人的小倉庫會覺得麻煩。
常見誤解:
- 「必要審查人數設為 0,保護就沒有用了。」不是。即使可以自己合併,每個改動也一定經過 PR、留下記錄,而直接推送(包括強制推送)都會被擋。
- 「只要勾了『必須經 PR』,受保護的分支就刪不掉。」不一定。「必須經 PR」管的是推送,刪除分支要另外勾 Restrict deletions。建議三項一起開:必須經 PR、禁止強制推送、禁止刪除。(預設分支 main 本身,GitHub 無論有沒有規則都不准刪除;這條規則保護的是 release/* 這類其他分支。)
- 「保護規則等於安全權限。」不是。它管的是「怎樣改 main」,不是「誰能看這個倉庫」。
判斷準則:只要有第二個寫入者(同事、學生、AI agent),或者這個分支是別人依賴的正本,就應該加。