Git 全景課 / 學生問題庫

學生問題庫(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),或者這個分支是別人依賴的正本,就應該加。