using-git-worktrees

using-git-worktrees

熱門

在開始需要與當前工作區隔離的功能開發時,或在執行實作計畫之前使用——透過原生工具或 git worktree 備援方案確保存在隔離的工作區

23萬星標
2.2萬分支
更新於 2026/6/18
SKILL.md
readonlyread-only
name
using-git-worktrees
description

Use when starting feature work that needs isolation from current workspace or before executing implementation plans - ensures an isolated workspace exists via native tools or git worktree fallback

使用 Git Worktrees

概述

確保工作在隔離的工作區中進行。優先使用平台的原生 worktree 工具。僅在沒有原生工具可用時,才回退到手動 git worktree。

核心原則: 先偵測現有隔離。然後使用原生工具。最後才回退到 git。切勿與框架對抗。

開始時宣告: 「我正在使用 using-git-worktrees 技能來設定隔離的工作區。」

步驟 0:偵測現有隔離

在建立任何東西之前,先檢查你是否已經在隔離的工作區中。

GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
BRANCH=$(git branch --show-current)

子模組防護: GIT_DIR != GIT_COMMON 在 git 子模組內部也會成立。在得出「已在 worktree 中」的結論前,請確認你不在子模組中:

# 如果此命令回傳路徑,表示你在子模組中,而非 worktree — 視為一般儲存庫
git rev-parse --show-superproject-working-tree 2>/dev/null

如果 GIT_DIR != GIT_COMMON(且非子模組): 你已經在一個連結的 worktree 中。跳到步驟 2(專案設定)。不要建立另一個 worktree。

回報分支狀態:

  • 在分支上:「已在 <path> 的隔離工作區中,位於分支 <name>。」
  • 分離 HEAD:「已在 <path> 的隔離工作區中(分離 HEAD,外部管理)。需要在完成時建立分支。」

如果 GIT_DIR == GIT_COMMON(或在子模組中): 你處於一般儲存庫的 checkout 中。

使用者的指令中是否已指定 worktree 偏好?如果沒有,請在建立 worktree 前徵求同意:

「您希望我設定一個隔離的 worktree 嗎?它可以保護您目前的分支不受變更影響。」

若已有宣告的偏好,則直接遵循,無需詢問。如果使用者拒絕同意,則在原地工作並跳到步驟 2。

步驟 1:建立隔離工作區

你有兩種機制。請依此順序嘗試。

1a. 原生 Worktree 工具(優先)

使用者已要求隔離工作區(步驟 0 同意)。你是否有建立 worktree 的方式?可能是名為 EnterWorktreeWorktreeCreate 的工具,或 /worktree 指令,或 --worktree 旗標。如果有,請使用它並跳到步驟 2。

原生工具會自動處理目錄放置、分支建立和清理。當你有原生工具時使用 git worktree add 會產生框架無法看見或管理的幽靈狀態。

只有在沒有原生 worktree 工具可用時,才繼續進行步驟 1b。

1b. Git Worktree 備援方案

僅在步驟 1a 不適用時使用 — 你沒有可用的原生 worktree 工具。使用 git 手動建立 worktree。

目錄選擇

依此優先順序進行。明確的使用者偏好永遠優先於觀察到的檔案系統狀態。

  1. 檢查你的指令中是否有宣告的 worktree 目錄偏好。 如果使用者已指定,直接使用,無需詢問。

  2. 檢查是否存在專案本地的 worktree 目錄:

    ls -d .worktrees 2>/dev/null     # 偏好(隱藏)
    ls -d worktrees 2>/dev/null      # 替代
    

    如果找到,使用它。如果兩者都存在,.worktrees 優先。

  3. 如果沒有其他指引,預設使用專案根目錄下的 .worktrees/

安全性驗證(僅限專案本地目錄)

在建立 worktree 前必須確認目錄已被忽略:

git check-ignore -q .worktrees 2>/dev/null || git check-ignore -q worktrees 2>/dev/null

如果未被忽略: 加入 .gitignore,提交變更,然後繼續。

為何重要: 防止意外將 worktree 內容提交到儲存庫。

建立 Worktree
# 根據選擇的位置決定路徑
path="$LOCATION/$BRANCH_NAME"

git worktree add "$path" -b "$BRANCH_NAME"
cd "$path"

沙箱備援: 如果 git worktree add 因權限錯誤(沙箱拒絕)而失敗,告知使用者沙箱封鎖了 worktree 建立,你將改在目前目錄中工作。然後在原地執行設定和基準測試。

步驟 2:專案設定

自動偵測並執行適當的設定:

# Node.js
if [ -f package.json ]; then npm install; fi

# Rust
if [ -f Cargo.toml ]; then cargo build; fi

# Python
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
if [ -f pyproject.toml ]; then poetry install; fi

# Go
if [ -f go.mod ]; then go mod download; fi

步驟 3:驗證乾淨基準

執行測試以確保工作區從乾淨狀態開始:

# 使用專案適用的指令
npm test / cargo test / pytest / go test ./...

如果測試失敗: 回報失敗,詢問是否繼續或調查。

如果測試通過: 回報就緒。

回報

Worktree ready at <full-path>
Tests passing (<N> tests, 0 failures)
Ready to implement <feature-name>

快速參考

情況 動作
已在連結的 worktree 中 跳過建立(步驟 0)
在子模組中 視為一般儲存庫(步驟 0 防護)
有原生 worktree 工具可用 使用它(步驟 1a)
無原生工具 Git worktree 備援(步驟 1b)
.worktrees/ 存在 使用它(確認已忽略)
worktrees/ 存在 使用它(確認已忽略)
兩者都存在 使用 .worktrees/
兩者都不存在 檢查指令檔案,然後預設 .worktrees/
目錄未被忽略 加入 .gitignore 並提交
建立時權限錯誤 沙箱備援,在原地工作
基準測試失敗 回報失敗並詢問
無 package.json/Cargo.toml 跳過相依性安裝

常見錯誤

與框架對抗

  • 問題: 當平台已提供隔離時仍使用 git worktree add
  • 修正: 步驟 0 偵測現有隔離。步驟 1a 優先使用原生工具。

跳過偵測

  • 問題: 在現有 worktree 內部建立巢狀 worktree
  • 修正: 在建立任何東西之前,務必執行步驟 0

跳過忽略驗證

  • 問題: Worktree 內容被追蹤,污染 git 狀態
  • 修正: 在建立專案本地 worktree 之前,務必使用 git check-ignore

假設目錄位置

  • 問題: 造成不一致,違反專案慣例
  • 修正: 遵循優先順序:明確指令 > 現有專案本地目錄 > 預設

在測試失敗時繼續

  • 問題: 無法區分新錯誤與既有問題
  • 修正: 回報失敗,取得明確許可後再繼續

紅旗

絕不:

  • 在步驟 0 偵測到現有隔離時建立 worktree
  • 當你有原生 worktree 工具(例如 EnterWorktree)時使用 git worktree add。這是 #1 錯誤 — 如果有,就使用它。
  • 跳過步驟 1a 直接跳到步驟 1b 的 git 指令
  • 未確認 worktree 已被忽略(專案本地)就建立
  • 跳過基準測試驗證
  • 在測試失敗時未經詢問就繼續

務必:

  • 先執行步驟 0 偵測
  • 優先使用原生工具而非 git 備援
  • 遵循目錄優先順序:明確指令 > 現有專案本地目錄 > 預設
  • 確認專案本地目錄已被忽略
  • 自動偵測並執行專案設定
  • 驗證乾淨的測試基準