[Note]git worktree用法

Leaphy 发布于 16 天前 最后更新于 16 天前 115 次阅读


一个 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 操作不会删除它。
此作者没有提供个人介绍。
最后更新于 2025-08-31