概述
git worktree 命令允许你同时使用和/或管理多个工作树。
那么什么是工作树呢?你已经在使用一个,只是你可能不知道。或者你可以将其称为“工作副本”。
当你以经典方式克隆存储库(或使用创建新存储库git init
)时,git 将创建所谓的“主工作树”:
1..git
它克隆文件夹中的“裸”存储库
2.它在裸存储库之上创建了一个主工作树;你可能已经知道的只是“克隆存储库的文件夹”
例如:
代码语言:javascript复制$ 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 中拥有的东西”方法或隐藏管理地狱。
同时检查一个以上的分支不是梦想吗?这就是为什么。
工作树
让我们尝试与之前相同的示例,但使用工作树:
代码语言:javascript复制$ 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向裸存储库注册新工作树的方法来完成的:
代码语言:javascript复制$ 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 文件夹,比裸存储库高一级;