一个 Git【1】 仓库【2】默认有一个主工作树【3】(就是你 clone
下来的那个目录)。git worktree add
命令可以创建额外的链接的工作树,它们共享同一个 .git
仓库数据,但各自有独立的工作目录。
基本用法
1. 创建新的工作树
bash
# 语法:git worktree add <路径> <分支名>
# 在指定路径创建一个新的工作树,并签出指定的分支
# 示例 1:基于现有分支 feature/login 创建工作树
git worktree add ../myfeature feature/login
# 示例 2:创建一个新分支并签出到新的工作树
git worktree add -b hotfix/urgent ../hotfix main
# 这会在 ../hotfix 目录创建一个名为 hotfix/urgent 的新分支(基于 main),并签出到该目录
../myfeature
和../hotfix
是相对于主仓库目录的路径。你可以放在任何位置,通常习惯放在主仓库的同级目录。- 新目录会被创建,并且指定的分支【4】会被自动签出【5】到那里。
2. 列出所有工作树
bash
git worktree list
输出类似:
text
/path/to/main/project abcdef1 [main]
/path/to/project/myfeature 1234567 [feature/login]
/path/to/project/hotfix 89abcd0 [hotfix/urgent]
这会显示所有工作树的路径、当前签出的提交哈希【6】和分支名。
3. 在工作树中工作
你可以像在普通仓库目录中一样,在新的工作树目录中进行任何 Git 操作:
bash
cd ../myfeature
# 修改文件、提交、推送等
git add .
git commit -m "完成登录功能"
git push origin feature/login
4. 删除工作树
当你完成工作并不再需要某个工作树时:
a) 安全删除:
bash
# 首先,进入主工作树目录
cd /path/to/main/project
# 然后使用 remove 命令
git worktree remove ../myfeature
# 或者使用 --force 强制删除(如果工作树有未提交的更改,慎用)
git worktree remove --force ../myfeature
remove
命令会检查工作树是否干净(没有未提交的修改),如果有则会提示你。使用 --force
可以强制删除,但可能会丢失工作。
b) 手动删除(不推荐):
你也可以直接删除那个工作树目录(rm -rf ../myfeature
),但之后必须在主仓库中运行 git worktree prune
来清理旧的记录。推荐始终使用 git worktree remove
。
常用选项和场景
- 创建临时分支进行测试:bashgit worktree add【7】 -b【8】 test-experiment ../experiment main【9】 cd ../experiment # 尽情做一些危险的实验,如果搞坏了,直接删除整个 ../experiment 目录即可 # 实验成功后再合并回主分支
- 修复紧急 bug:
你正在dev
分支开发新功能,突然需要修复一个生产环境【10】的紧急 bug。bash# 在主仓库同级创建一个 hotfix 目录,并基于 main 分支创建一个 hotfix 分支 git worktree add -b hotfix-2024-0314 ../hotfix main cd ../hotfix # 修复 bug,提交,测试,合并... # 完成后,回到主仓库的 dev【11】 分支,你的工作上下文完全没被打断 - 锁定工作树(Git 2.37+):
如果工作树位于可移动设备【12】或网络共享【13】上,可以使用--lock
选项将其标记为已锁定。这不会阻止你使用它,但会在git worktree list
中显示为“锁定”,并且prune
操作不会删除它。
Comments NOTHING