概述

git worktree 命令允许你同时使用和/或管理多个工作树。

那么什么是工作树呢?你已经在使用一个,只是你可能不知道。或者你可以将其称为“工作副本”。

当你以经典方式克隆存储库(或使用创建新存储库git init)时,git 将创建所谓的“主工作树”:

1..git它克隆文件夹中的“裸”存储库
2.它在裸存储库之上创建了一个主工作树;你可能已经知道的只是“克隆存储库的文件夹”

例如:

$ git clone git@github.com:bsrz/mvvm.git
Cloning into 'mvvm'...
remote: Enumerating objects: 131, done.
remote: Counting objects: 100% (131/131), done.
remote: Compressing objects: 100% (79/79), done.
remote: Total 131 (delta 56), reused 109 (delta 38), pack-reused 0
Receiving objects: 100% (131/131), 474.84 KiB | 2.53 MiB/s, done.
Resolving deltas: 100% (56/56), done.

$ cd mvvm
$ ls -la
total 32
drwxr-xr-x  11 bsrz  staff    352 Feb 28 23:30 ./
drwxr-xr-x  25 bsrz  staff    800 Feb 28 23:30 ../
drwxr-xr-x  12 bsrz  staff    384 Feb 28 23:31 .git/
-rw-r--r--   1 bsrz  staff   2171 Feb 28 23:30 .gitignore
drwxr-xr-x   4 bsrz  staff    128 Feb 28 23:30 .img/
-rw-r--r--   1 bsrz  staff   1069 Feb 28 23:30 LICENSE
drwxr-xr-x   5 bsrz  staff    160 Feb 28 23:30 MVVM/
drwxr-xr-x   5 bsrz  staff    160 Feb 28 23:30 MVVM.xcodeproj/
drwxr-xr-x   4 bsrz  staff    128 Feb 28 23:30 MVVMTests/
drwxr-xr-x   4 bsrz  staff    128 Feb 28 23:30 MVVMUITests/
-rw-r--r--   1 bsrz  staff  22913 Feb 28 23:30 README.md

你可以看到该.git文件夹​​,上一层(即当前目录)包含提交到存储库的所有文件,即工作树或工作副本。

为什么?

你是否曾遇到过这样的情况,你修改了文件,有人(也许是你的领导)要求你调查生产代码中的错误?或者,也许你正在对数百(或数千!)个修改文件进行重大重构,但你被要求快速完成另一项任务?

如果是这样,那么你将熟悉“我将提交所有我在 WIP 中拥有的东西”方法或隐藏管理地狱。

同时检查一个以上的分支不是梦想吗?这就是为什么。

工作树

让我们尝试与之前相同的示例,但使用工作树:

$ mkdir mvvm # 1
$ cd mvvm # 2
$ git clone --bare git@github.com:bsrz/mvvm.git .bare # 3
Cloning into bare repository '.bare'...
remote: Enumerating objects: 131, done.
remote: Counting objects: 100% (131/131), done.
remote: Compressing objects: 100% (79/79), done.
remote: Total 131 (delta 56), reused 109 (delta 38), pack-reused 0
Receiving objects: 100% (131/131), 474.84 KiB | 2.43 MiB/s, done.
Resolving deltas: 100% (56/56), done.

1.首先创建将包含所有分支和裸存储库的目录
2.将目录更改为新创建的目录
3.这是这里的关键部分,你想克隆一个裸版本的存储库;这或多或少只是克隆了.git通常由经典克隆方法自动完成的文件夹

接下来,我们将创建主要工作树。这是通过使用git worktree add向裸存储库注册新工作树的方法来完成的:

$ cd .bare # 1
$ git worktree add ../main main # 2
Preparing worktree (checking out 'main')
HEAD is now at 0db2467 <commit message>
$ cd ../main # 3
$ ls -la # 4
total 36
drwxr-xr-x  11 bsrz  staff    352 Feb 28 23:53 ./
drwxr-xr-x   4 bsrz  staff    128 Feb 28 23:53 ../
-rw-r--r--   1 bsrz  staff     61 Feb 28 23:53 .git
-rw-r--r--   1 bsrz  staff   2171 Feb 28 23:53 .gitignore
drwxr-xr-x   4 bsrz  staff    128 Feb 28 23:53 .img/
-rw-r--r--   1 bsrz  staff   1069 Feb 28 23:53 LICENSE
drwxr-xr-x   5 bsrz  staff    160 Feb 28 23:53 MVVM/
drwxr-xr-x   5 bsrz  staff    160 Feb 28 23:53 MVVM.xcodeproj/
drwxr-xr-x   4 bsrz  staff    128 Feb 28 23:53 MVVMTests/
drwxr-xr-x   4 bsrz  staff    128 Feb 28 23:53 MVVMUITests/
-rw-r--r--   1 bsrz  staff  22913 Feb 28 23:53 README.md

1.将目录更改为裸存储库
2.将主要工作树添加到 mvvm 文件夹,比裸存储库高一级;🗒️ 这种结构纯属个人选择,你可以在任何你想要的地方克隆存储库,并在任何你想要的地方签出分支
3.将目录更改为新创建的工作树
4.存储库中提交的文件以与以前相同的方式显示
你可以像以前一样在主目录中工作。你可以检出其他分支,你可以存储修改过的文件,你可以提交文件,你可以变基,合并等等…

裸存储库的强大之处在于它们能够添加第二个、第三个、第 N 个工作树并检查其中的另一个分支。

$ cd ../.bare # 1
$ git worktree add --track ../my-awesome-branch -b my-awesome-branch # 2
Preparing worktree (new branch 'my-awesome-branch')
branch 'my-awesome-branch' set up to track 'main'.
HEAD is now at 0db2467 <commit message>
$ cd ../my-awesome-branch # 3

1.回到裸仓库
2.添加一个新的工作树,这次我们创建一个新的分支并跟踪它
3.将目录更改为新的工作树

现在,您可以在修改 my-awesome-branch 工作树(使用 my-awesome-branch 分支)的同时修改主工作树(使用主分支)。同样的功能适用于新的工作树:你可以检查其他分支,你可以存储修改后的文件,你可以提交文件,你可以变基,合并等等…

这里唯一需要注意的是,一个分支一次只能在一个工作树中签出。如果您尝试检出一个已经在不同工作树中检出的分支,您将收到此错误:

$ git checkout main
fatal: 'main' is already checked out at '/Users/bsrz/Developer/mvvm/main'

结论

虽然我并不经常使用这种方法,但我开始越来越多地使用它。让我的工作保持原样并在单独的文件夹中开始新工作的能力给了我很大的灵活性,并减少了很多“git 管理”工作。我不再需要不断地管理存储或保存补丁以备后用,这让我可以很快地花时间解决新问题。

⭐️ 好书推荐

《网络结构数据分析与应用》

在这里插入图片描述

【内容简介】

当今社会,网络结构数据普遍存在于各行各业。如何从这些数据中挖掘出价值,并且解决实际问题,成为学界和业界共同关注的研究方向。本书主要帮助读者初步了解网络结构数据,学习使用R语言进行实际数据分析。本书适合网络结构数据的初学者,相关专业的学生或对网络结构数据感兴趣的读者阅读。

📚 京东自营购买链接:《网络结构数据分析与应用》

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐