阅读视图

发现新文章,点击刷新页面。

译:自由实验你的代码—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 仓库提供了更大的灵活性。在需要时使用它们,再也不用为了检查另一个分支上的内容而匆忙保存工作状态。

英文原文

❌