kbwen / using-git-worktrees
Use Git worktrees to create parallel working directories safely; avoid branch-switch contamination.
0
SKILL.md2.1 KB
Using Git Worktrees
Overview
Git worktree allows mounting multiple working directories onto the same repository simultaneously, each mapped to a different branch. This is ideal for parallel development and hotfixes.
Workspace Selection Principles
- Manage them centrally outside the repo or in a dedicated folder (e.g.,
../wt-<task>). - Name them with task semantics (feature/hotfix + short name).
- Avoid confusing or overwriting existing workspaces.
Safety Checks
Detect nesting first — do not create a worktree from inside another worktree or a submodule:
- You are already in a linked worktree if
git rev-parse --git-dirdiffers fromgit rev-parse --git-common-dir(they match in the main worktree).cdto the main worktree before adding. - You are in a submodule if
git rev-parse --show-superproject-working-treeis non-empty. Operate on the intended repo, not the submodule.
- You are already in a linked worktree if
- Ensure the primary workspace is clean (prevent taking uncommitted changes).
- List existing worktrees first:
git worktree list. - Check that the target directory does not exist or is empty.
- Keep the worktree path out of the tracked tree — prefer a sibling dir (
../wt-<task>). If it must live inside the repo, verify it is ignored first:git check-ignore -q <path>(exit 0 = ignored). A non-ignored in-repo worktree pollutes the parent'sgit statusand can be committed by accident. - Confirm branch naming and tracking strategies.
Setup Workflow
Create a branch and add a worktree:
git worktree add ../wt-<task> -b <branch-name>
- Switch to the new directory and run a baseline test.
- Develop, commit, and verify independently in that directory.
Remove the worktree when finished (if no longer needed):
git worktree remove ../wt-<task>
Common Mistakes
- Committing in the wrong worktree.
- Deleting a worktree without confirming if the branch should be preserved.
- Chaotic directory naming, leading to unclear task mapping.