Git 全景課 / 第四部分 應用 · M13
M13 AI 時代的 Git
AI agent 寫得快、不會累,也會照字面執行命令。當幾個 agent 和人同時修改同一個倉庫,前面學過的每一樣東西——worktree、分支、PR、保護規則、commit 說明——都從「好習慣」變成「必需品」。本單元把它們組合成一套讓人和 AI 並行工作、正本仍然受控的做法。
學完本單元,你能夠:
- 為幾個並行的 agent 設計 worktree 和分支,避免互相覆蓋;
- 說明為甚麼 AI 的改動應經 PR 合併,以及怎樣按風險分級審查;
- 用 commit 說明和 trailer 追溯哪些改動出自 AI;
- 為一個人+AI 的倉庫設定合適的規則。
1AI 帶來的新問題 What changes with AI agents
| 情況 | 風險 | 對應的工具 |
|---|---|---|
| 幾個 agent 同時工作 | 在同一個資料夾互相蓋掉檔案 | 一個 agent 一張書桌(worktree,M8) |
| agent 照字面執行「推上去」 | 未經審查的改動直接進正本 | 保護規則+清空繞過名單(M11) |
| agent 產生大量改動 | 人沒有時間逐行看 | 小 PR、CI、按風險分級審查(M10、M11) |
| 事後追查 | 分不清哪些是人寫的、哪些是 AI 寫的 | commit 說明+trailer、分開的身份(M2、本單元) |
| agent 修改了歷史 | amend、rebase、強制推送蓋掉別人的工作 | 黃金規則+禁止強制推送(M7、M11) |
2一個 agent 一張書桌 One agent, one worktree
M8 的規則在這裏最實用:每個 agent 有自己的 worktree(資料夾)和自己的分支。它們共用同一份歷史,卻不會碰到彼此未提交的檔案;Git 的「一條分支只能在一張書桌」規則,也防止兩個 agent 同時寫同一條分支。完成後,各自開 PR,經審查合併回 main。
| 命令 | 作用 |
|---|---|
git worktree add ../wt-1 -b feat-1 | 為一個 agent 開書桌,同時建立它的分支 feat-1 |
git worktree list | 列出所有書桌和各自攤開的分支 |
git worktree remove ../wt-1 | 任務完成後收拾書桌(有未提交修改時會拒絕,要加 --force) |
git worktree prune | 清理資料夾已被直接刪掉的書桌留下的記錄 |
書桌是分開的,抽屜和書架是共用的
每個 worktree 有自己的 HEAD、暫存區和工作檔案;但物件庫、分支和其他 ref、stash、hooks、設定(config)都是所有書桌共用的。所以一個 agent 執行
git stash pop,可能取走另一個 agent 存進去的改動;在一張書桌 git branch -D,別的書桌也就沒有那條分支了。給 agent 的規則:不要用沒有標記的 stash(寧可先做一個臨時 commit),不要刪除不是自己建立的分支。
3AI 開 PR,按風險分級審查 AI-authored PRs and tiered review
AI 的改動一律經 PR 進入 main,保護規則(清空繞過名單)讓這一點不靠自覺。但如果每個 PR 都要人逐行看,AI 帶來的效率就沒了。一個常見的做法是按風險分級:
| 級別 | 例子 | 誰審查、誰合併 |
|---|---|---|
| 一級:低風險 | 筆記、文件、拼字 | 另一個 AI 審查(審查者與作者不同、只有讀取權),通過後自動合併 |
| 二級:中風險 | 腳本、排程、部署設定 | AI 審查後合併,合併後通知人(例如每日摘要) |
| 三級:高風險 | 規則檔本身、權限、密鑰、刪除檔案、審查設定 | 一律由人親自審查和合併 |
關鍵是分級由規則(例如按檔案路徑)決定,而不是由寫改動的 AI 自己決定,否則它可以把高風險的改動說成低風險。審查者也必須和作者不同,不能審自己的 PR。
分級也要由伺服器上的設定機械地執行,而不是靠 AI 守約定:
- 最高一級交給人:用 CODEOWNERS(M11)把高風險路徑——規則檔、權限設定、CI 設定、CODEOWNERS 檔本身——指定由人負責,再在保護規則開啟「需要 CODEOWNERS 審查」。改到這些路徑的 PR,沒有人批准就合併不了,不管 AI 怎樣描述它。
- agent 的權限最小化:agent 用的帳號或 token 只給完成任務所需的權限,不給管理員權限,也不放進繞過名單。這樣它既不能改保護規則,也不能強行合併。
注意:GitHub 不允許 PR 的作者批准自己的 PR。如果 agent 用你的帳號開 PR,你就無法以審查者身份批准它;要讓「需要審查」這類規則運作,agent 需要自己的帳號。
4追溯:哪些改動出自 AI Tracing AI changes
幾個月後要問「這段是誰改的、為甚麼」時,歷史就是唯一的證據。三個做法讓 AI 的改動可以追溯:
- commit 說明照樣寫清楚(M2):AI 很擅長寫,前提是你要求它寫。
- trailer:在說明最後一段加上
Co-authored-by: ai-bot <ai-bot@example.com>之類的標記行。如果這個電郵屬於某個 GitHub 帳號,GitHub 會把那個帳號顯示為共同作者;電郵不對應任何帳號,GitHub 就不會列出共同作者(說明裏的文字仍在)。搜尋時注意--grep區分大小寫(各工具的寫法不一,有Co-Authored-By也有Co-authored-by),而且比對整段說明,所以用git log -i --grep "^Co-authored-by:";要只讀真正的 trailer,用git log --format='%h %(trailers:key=Co-authored-by,valueonly)'。 - 分開的作者身份:commit 的作者欄來自
user.name/user.email,--author比對的就是它,與推送時用哪個 GitHub 帳號無關。即使你和 agent 共用同一個 GitHub 帳號,也可以讓 agent 用另一個作者身份:在它的 worktree 執行git config --worktree user.email ai-bot@example.com(先要git config extensions.worktreeConfig true,否則只能改到共用設定),或設定GIT_AUTHOR_NAME/GIT_AUTHOR_EMAIL環境變數。給 agent 獨立的帳號(machine user)也可以,好處是權限可以分開。 - 簽署(M11):簽署證明「哪把金鑰簽了這個 commit」,不會改變作者欄,所以不能用
--author篩選。要用git log --show-signature或git log --format='%h %G? %GS'檢查簽署狀態和簽署者。
5一個人+AI 的倉庫,怎樣設定 A checklist
- main 受保護:必須經 PR、禁止強制推送和刪除、繞過名單清空(M11)。審查人數可以是 0,因為只有你一個人。
- 每個任務一張書桌:agent 在自己的 worktree 和分支上工作(M8);很多 AI 工具會自動這樣做。
- 先開 issue 再動手:較大的任務先寫一張 issue 說明目標和完成標準,PR 連回那張 issue。
- PR 要小:一個 PR 一件事(M10);要求 AI 在說明裏寫「改了甚麼、為甚麼、怎樣驗證」。
- 按風險分級:規則檔、權限、密鑰相關的改動,永遠由人合併。
- 可追溯:trailer 或獨立的作者身份;保留 PR 記錄。
- 收拾:合併後刪除分支和 worktree;刪除前比較內容,不要只信 commit(M7 squash 陷阱)。
6對照與誤解 Easily confused
| 讓 AI 直接推 main | AI 經 PR 合併 | |
|---|---|---|
| 速度 | 最快 | 多一步,但可以自動化(分級合併) |
| 出錯時 | 錯誤立即進入正本,別人可能已經 pull | 在 PR 階段被 CI 或審查攔下 |
| 記錄 | 只有 commit | PR 說明、審查意見、CI 結果 |
| 撤銷 | 要 revert,可能已有人基於它工作 | 不合併就是了 |
常見誤解
- 「在提示裏叫 AI 不要直推 main 就夠了。」提示是約定;只有伺服器上的規則(而且不在繞過名單上)才是保證。
- 「AI 寫的程式通過了 CI,就不用人看。」CI 只檢查寫成規則的事;權限、密鑰、規則檔仍要人看。
- 「幾個 agent 在同一個資料夾開不同分支就好。」一個資料夾一次只能展示一條分支;切換會互相干擾。要用 worktree。
7小測 Quiz
本單元重點 Summary
- 一個 agent 一張書桌一條分支;完成後各開 PR。
- AI 的改動經 PR 進入 main,由伺服器規則保證,而且繞過名單要清空。
- 按風險分級審查;分級由規則決定,審查者不能是作者本身。
- 用 trailer 或獨立的作者身份(
user.email)讓 AI 的改動可以追溯;簽署不改變作者。 - 前面學過的每一樣工具,在人和 AI 並行時都從好習慣變成必需品。
延伸閱讀
- git interpret-trailers 官方文件(commit trailer 的格式)
- GitHub Docs:Creating a commit with multiple authors
- M8 的延伸閱讀:DataCamp, Git Worktree Tutorial(含 AI 並行開發的例子)