靜態站點或組件庫上線前,常同時要改兩條緊急分支:一條修生產環境 CSS,一條做下周落地頁。再克隆一份倉庫既佔磁碟又費心力。Git worktree 讓你在同一對象庫上並行檢出多個分支,特別適合把「第二臺機器」換成可 SSH 的雲 Mac mini,在上面跑 Safari 與構建,而筆記本只保留一個主克隆寫代碼。
為什麼 HTML/CSS 團隊用 worktree
傳統流程——stash、checkout、pull、再跑一遍 npm install——往往只為了改十幾行 hero 區 CSS,上下文全丟。worktree 讓每個分支待在獨立目錄裡、歷史仍共享,於是 A 目錄可以一直開著 npm run dev,B 目錄並行 npm run build,不必來回切分支。
在 Apple Silicon 上,依賴安裝依然耗時:即便 Git 對象共用,每個 worktree 下的 node_modules 對「Vite + Tailwind」這類棧也常佔 250–400 MB。規劃三個活躍樹意味著僅依賴就可能逼近 1.2 GB,再加構建產物——雲 Mac 磁碟寬裕時很輕鬆,256 GB 筆記本若還要裝照片與 Docker 鏡像就會吃緊。
對需要同時對照設計稿與 DOM 的前端,worktree 還能讓「熱修分支」與「特性分支」各用一套本地 URL,減少誤把未合併樣式提交到錯誤分支的概率。評審時也可以把兩個目錄的 diff 並排給設計師看,而不必反覆切換檢出。
日常必備命令
在主倉庫路徑下為兄弟目錄增加檢出:
git fetch origin
git worktree add ../site-hotfix origin/hotfix/css-hero
git worktree list
合併完成後移除對應目錄:
git worktree remove ../site-hotfix
若提示有未提交改動,先提交或確認無用後再 --force。若曾手滑 rm -rf 刪過目錄,用 git worktree prune 清理元數據,避免 git worktree list 裡出現幽靈條目。
工作樹、全量克隆與獨立倉庫
| 方式 | Git 對象佔用 | 複雜度 | 適用 |
|---|---|---|---|
| 第二次完整克隆 | 重複 .git | 低 | 物理隔離機器 |
| worktree | 共享對象庫 | 中 | 同遠端、多分支並行 |
| 獨立倉庫(fork) | 獨立歷史 | 高 | 供應商代碼與主倉遠端不一致 |
開發伺服器、埠與 Safari 標籤
每個 worktree 是獨立根目錄,可在一個裡跑 npx vite --port 5173,另一個 --port 5174。請在 README 或團隊文檔寫清:熱修 → 5173,卡片特性 → 5174。遠程會話裡 Safari 固定標籤頁容易丟,可把兩個 URL 存書籤,或寫個小腳本在起服務後 echo 連結。
若你同時用 SSH 跑命令、偶爾用 VNC 看像素,可參考 雲 Mac 上 SSH 與 VNC 的對比,把長任務放在 SSH 會話,需要並排對比兩個分支的 Safari 表現時再開圖形。
埠衝突常見於忘了關舊進程:用 lsof -i :5173 找到佔用者再結束,比盲目改埠更能避免 CI 與本地文檔不一致。
刪除目錄前的清理清單
- 在 Git 託管平臺確認分支已合併或廢棄。
- 停掉 watch 進程(
Ctrl+C),避免文件句柄未釋放。 - 優先
git worktree remove <路徑>,少用手動rm -rf。 - 若已手動刪除,檢查是否殘留
dist/、.vite緩存。 - 實驗性安裝過多時可跑
npm cache verify回收空間。
跳過第三步容易導致 git worktree list 與真實目錄不一致,自動化腳本若帶 30 秒 超時遍歷樹,會莫名失敗——元數據和人類一樣需要定期打掃。
Prettier、ESLint、Stylelint 的緩存常在各樹自己的 node_modules/.cache;若把緩存目錄硬連結共享,可能在某一分支升級插件大版本後汙染另一分支的格式化結果。更穩妥是接受重複緩存,直到磁碟監控連續一周高於 85 % 再討論統一緩存策略。
靜態導出(Eleventy、Astro 靜態模式)在大版本發布日可對每個樹順序執行 npm run build:四棵樹若各開 八個 worker 並行,M4 Pro 上也可能 CPU 打滿。可在 Node 啟動參數加 --max-old-space-size=4096,並在 Console.app 關注是否出現內存壓力日誌。
為什麼在租用 Mac 上跑 worktree
機房裡的 Apple Silicon Mac mini 像共享構建櫃:大家把分支推到同一臺機,在 /Users/ci/sites/ 下按規範路徑 git worktree add,評審完再刪。筆記本保留一個主克隆寫邏輯;重型並行安裝放在按時計費的雲端,磁碟與電費壓力都更小。
若 SSH 密鑰與 config 尚未理順,請先讀 遠程 Mac 配置指南,再寫自動化添加 worktree 的腳本——穩定的認證比花哨的目錄命名更重要。
成熟團隊會把 git worktree add 包進 Makefile 或三十行以內的 shell:順帶 npm ci 並列印 dev URL。路徑可統一為 /var/tmp/worktrees/$BRANCH_SLUG,slug 截斷到 48 個字符,避免 Webpack 寫深層臨時文件時撞上 macOS 路徑長度上限。
子模塊與 worktree 要格外小心:每棵樹可能都要單獨 git submodule update --init。使用 Git LFS 的資源倉庫記得每樹執行 git lfs pull,否則會出現「CSS 構建成功但 Safari 裡 hero 視頻 404」這類怪問題。
CI 發預覽連結時,在 Slack 裡同時標註 worktree 路徑(例如 熱修 → ~/wt/hero),評審者 SSH 進去不會找錯目錄。每人省三分鐘上下文切換,四個人一輪評審就能抵消不少租賃分鐘成本。
可再配一個 worktree-health.sh,輸出磁碟剩餘、活躍 node 進程與各 dev server 日誌最後五行,用 cron 或 LaunchAgent 每 15 分鐘 跑一次;確認沒有孤兒 webpack 再 git worktree remove --force,避免誤殺仍在寫的進程。
共享主機上每個 worktree 繼承同一套憑據助手,若外包人員曾登錄 shell,合併後記得輪換部署密鑰。各樹 .env.local 建議 chmod 600,不要把密鑰複製到多個分支目錄——未合併的熱修樹在刪除前始終可讀。
大改版前可用 tmutil localsnapshot 做本機快照,或給 dist/ 打個 tarball,避免某次 CSS purge 腳本誤傷所有活躍樹時無處回滾。
常見問題
一臺 Mac 上建議保留幾個 worktree?
在 256 GB 磁碟上多數團隊把活躍 worktree 控制在三到六個之間。每個工作樹仍有獨立工作區與 node_modules,除非使用高級工具共享依賴,建議每周用 df -h 觀察空間。
worktree 會共享 Git 對象嗎?
會。同一倉庫下的多個 worktree 共用一份 .git 對象庫,比重複 git clone 更省空間;但 node_modules 不會自動共享。
能同時跑兩個 Vite 嗎?
可以,為每個目錄顯式指定埠,例如 --port 5173 與 --port 5174,並在團隊文檔裡寫明映射。Safari 可同時打開兩個 localhost 做視覺對比。
Git worktree 不能替代清晰的分支命名,但能去掉「反覆 checkout」的摩擦;與一臺常開、環境接近生產的 Mac mini 搭配時,特別適合在發布周並行多條 HTML/CSS 車道。按日租用雲端算力,高峰多加幾棵樹,發布結束後刪掉 worktree、縮減開支,比為峰值單獨採購機器更靈活。
並行分支需要並行磁碟空間
租用雲 Mac mini,共享 worktree、Safari 評審與長時間 dev server。先選區域,再按幫助中心完成 SSH 與密鑰配置。