译:自由实验你的代码—Git worktree
编者注: Git worktree 是 Git 提供的一个强大功能,它允许你在同一个仓库中同时处理多个分支,而不会干扰当前的工作环境。1) 通过创建新的 worktree,你可以并行处理多个任务,比如修复紧急 bug 和开发新功能。2) worktree 与主工作区完全隔离,你可以独立提交、推送和归档更改。3) 使用 worktree 可以避免频繁切换分支带来的混乱,保持工作区的整洁。本文详细介绍了 worktree 的使用场景和操作方法,帮助你更高效地管理 Git 仓库。
什么是 Git worktree
Git worktree 是 Git 仓库的链接副本,允许你同时检出多个分支。worktree 与主工作副本的路径不同,但它可以处于不同的状态和不同的分支上。Git 中新的 worktree 的优势在于,你可以进行与当前任务无关的更改,提交更改,然后在稍后合并它,而不会干扰你当前的工作环境。
来自 git-worktree
手册页的典型示例是,当你正在为项目开发一个令人兴奋的新功能时,你的项目经理告诉你需要一个紧急修复。问题是,你的工作仓库(你的“worktree”)因为正在开发一个主要的新功能而处于混乱状态。你不想将修复“偷偷”插入当前的冲刺中,也不愿意暂存更改以创建一个新的分支来进行修复。相反,你决定创建一个新的 worktree,以便在那里进行修复:
$ git branch | tee
* dev
trunk
$ git worktree add -b hotfix ~/code/hotfix trunk
Preparing ../hotfix (identifier hotfix) HEAD is now at 62a2daf commit
上述命令的功能是从 trunk
分支创建一个名为 hotfix
的新分支,并将其作为一个独立的 worktree 放置在 ~/code/hotfix
目录中。此时,你可以将这个 worktree 当作主要的工作空间。你能够切换到该目录,进行紧急修复,提交修改,最后删除这个 worktree:
$ cd ~/code/hotfix
$ sed -i 's/teh/the/' hello.txt
$ git commit --all --message '紧急修复'
一旦你完成了紧急工作,你可以回到之前的任务。你可以控制何时将你的 hotfix 集成到主项目中。例如,你可以直接从它的 worktree 将更改推送到项目的远程仓库:
$ git push origin HEAD
$ cd ~/code/myproject
或者你可以将 worktree 归档为 TAR 或 ZIP 文件:
$ cd ~/code/myproject
$ git archive --format tar --output hotfix.tar master
或者你可以从单独的 worktree 中获取更改:
$ git worktree list
/home/seth/code/myproject 15fca84 [dev]
/home/seth/code/hotfix 09e585d [master]
从那里,你可以使用最适合你和你的团队的策略来合并你的更改。
列出活跃的 worktree
你可以使用 git worktree list
命令获取 worktree 的列表,并查看每个 worktree 检出的分支:
$ git worktree list
/home/seth/code/myproject 15fca84 [dev]
/home/seth/code/hotfix 09e585d [master]
你可以在任何一个 worktree 中使用这个命令。worktree 总是链接的(除非你手动移动它们,破坏 Git 定位 worktree 的能力,从而切断链接)。
移动一个 worktree
Git 在你的项目的 .git
目录中跟踪 worktree 的位置和状态:
$ cat ~/code/myproject/.git/worktrees/hotfix/gitdir /home/seth/code/hotfix/.git
如果你需要重新定位一个 worktree,你必须使用 git worktree move
;否则,当 Git 尝试更新 worktree 的状态时,它会失败:
$ mkdir ~/Temp
$ git worktree move hotfix ~/Temp
$ git worktree list
/home/seth/code/myproject 15fca84 [dev]
/home/seth/Temp/hotfix 09e585d [master]
删除一个 worktree
当你完成工作后,你可以使用 remove
子命令删除它:
$ git worktree remove hotfix
$ git worktree list
/home/seth/code/myproject 15fca84 [dev]
为了确保你的 .git
目录是干净的,在删除 worktree 后使用 prune
子命令:
$ git worktree prune
何时使用 worktree
使用标签、书签、自动备份等功能时,需自行跟踪数据,否则易管理混乱。Git worktree 也同理,别频繁创建,避免副本过多。建议按需创建,完成任务、提交工作后及时删除,保持简洁专注。
重要的是,worktree 为你管理 Git 仓库提供了更大的灵活性。在需要时使用它们,再也不用为了检查另一个分支上的内容而匆忙保存工作状态。