什么是Git Worktree?

在一个仓库里,同时打开多个“分身”,每个分身对应不同分支。

它有什么用呢?

同时在多分支上工作,很适合当前 vibe coding 的形式。

古法编码时则可以避免频繁的checkout和可能需要的stash


Git WorkTree


基础使用

使用一个demo演示。

1.初始化仓库

bash
git init
# -b main

echo "hello" > app.txt

git add app.txt

git commit -m "init on main"

现在仓库中就有一个主worktree了。

bash
git worktree list

2.基于main分支创建两个worktree

bash
git worktree add ../wt-a -b feature-a main
git worktree add ../wt-b -b feature-b main

也可以选择在项目目录中创建隐藏文件夹 .worktree,然后创建.worktree/wt-a,在使用superpowers时会出现这样的推荐。

此时再执行:

bash
git worktree list

就可以看到三条结果。


3.各自独立开发

bash
cd ../wt-a
echo "feature a" >> app.txt
git add app.txt
git commit -m "feat: update in feature-a"
bash
cd ../wt-b
echo "feature b" >> app.txt
git add app.txt
git commit -m "feat: update in feature-b"

合并操作与普通git操作无异,merge/rebase

提一嘴merge和rebase的区别:

merge 是在目标分支(如 main)上,把另一个分支合并进来。

rebase 是在当前分支(如 feature)上,把它的提交重放到目标分支之后。人话就是假装是从main的最新提交开始开发。

失败示例

同一个分支不能被多个 worktree 同时使用

bash
git worktree add ../wt-main-copy main

会出现:

bash
Preparing worktree (checking out 'main')
fatal: 'main' is already checked out at '/path/wt-demo'