Fork me on GitHub

Git worktree

Git的工作流中,我们经常会遇到需要从当前分支临时切换到其他分支的情况,如果此时我们有未提交的改动的话,Git就会告诉我们无法切换分支。一般的,我们都是通过git stash命令来将改动先暂存起来,或者临时的进行一个commit在随后再reset回来。

但这种在同一个工作目录中切来切去,伴随着文件的修改新增删除,非常麻烦,如果不注意的话,还容易出错。

在更极端的情况下,如果我们正在当前分支下跑测试或者编译,我们想一边测试或者编译一边code呢,要怎么办,git办不到吗?

其实完全可以,git worktree命令,就是为了解决分支切来切去问题的。

它可以让我们为同一个仓库开多个工作目录,每个工作目录盛放不同的分支,同时它还可以自动的做好多分支的同步,在需要同时处理多个分支时,十分的便捷和好用。

这篇博客,就主要来介绍一下这条git命令。

ps: 大部分内容翻译自官方文档,有的地方为了便于理解,进行了内容的整理和优化。

概述

git worktree命令可以使一个git仓库同时存在多个工作目录,从而使你可以在同一时间将不同的两个分支分配在在两个不同的工作目录中。
具体的,通过git worktree add可以为当前所在仓库添加一个新的目录并迁出一个分支到其中,相对于我们通过git initgit clone初始化的git仓库所在的主工作目录,这个工作目录也可以称作关联工作目录
对于一个非空的git仓库而言,只能有一个主工作目录,但可以有任意个关联工作目录。关于工作目录的相关信息,都在.git/worktrees目录下。

当你在关联工作目录中完成了需要的分支修改之后,不再需要它时,可以通过git worktree remove来移除它。git会自动的将分支信息和改动同步到所有存在的工作目录中去。

当使用git worktree remove移除关联工作目录后,其在.git/worktrees中相应的工作目录记录文件也会在三个月后被自动的清除,或者你也可以在任意的工作目录中使用git worktree prune来清理已不存在的关联工作目录的记录文件。

简单示例

1
2
3
4
5
6
$ git worktree add -b hotfix ../temp master
$ cd ../temp
# ... 进行一些修改 ...
$ git commit -a -m 'hot fix for boss'
$ cd ../main
$ git worktree remove ../temp

通过git worktree add命令新建一个工作目录,在其中进行一些修改并提交后,切回主工作目录,直接删除新建的关联工作目录即可,关联工作目录中的分支信息和提交会自动的合并到主工作目录中。

具体命令

add [–lock] [-b][]

创建<path>目录并迁出从当前工作仓库中对应的<commit-ish>分支中创建的新分支<branch>到其中。
如果不传递<commit-ish>,同时也未指定-b或者-B新分支名,则会从当前分支新建一个以path命名的新分支迁出到关联工作目录中。
可选的commit-ish选项, 若无则默认使用当前主目录所在的分支来新建迁出到关联工作目录的分支。
可选的-b branch选项,指定新分支的分支名,若无则使用关联工作目录path的目录名作为新分支名。
可选的--lock选项,用于在创建工作目录之后自动lock

list [–porcelain]

列出当前仓库的所有工作目录。主工作目录始终位于第一条,其他关联工作目录跟随在其后。
可选的--porcelain选项,用于显示详细的工作目录信息。

lock [–reason]

如果一个关联工作目录被放置在移动存储设备或类似的会被移除的设备上,你可以使用git worktree lock来锁定工作目录记录文件防止git发现工作目录不存在时会自动清除掉它的记录文件。
可选的--reason选项,注解锁定工作目录的原因。

unlock

解除一个关联工作目录的记录文件的锁定

move

移动关联工作目录到其他目录位置。

prune [-n] [-v] [–expire

删除所有无用的关联工作目录记录文件(位于$GIT_DIR/worktrees下)
可选的-n选项,用于只显示将要删除哪些工作目录记录文件,而不执行真正的删除。
可选的-v选项,用于显示详细的删除信息。
可选的--expire <time>选项,用于只删除此时间之前的无用关联工作目录。

remove

删除一个关联工作目录。
-f选项,如果工作目录中有未提交的改动时,必须使用-f才能删除。

以上就是关于git worktree命令的一些介绍,感谢阅读。

----本文结束感谢阅读----