使用单独的git-worktree,为什么我不能检查与主工作副本中相同的分支?如果我尝试,我会收到错误:
fatal: 'mybranch' is already checked out at '/path/to/repo'
我可以看到,如果我从一个工作树上签入,另一个最终将处于一个独立的HEAD状态,但是那个很糟糕,为什么我甚至不能查看同一个分支?
答案 0 :(得分:12)
我可以看到,如果我从一个工作树登记,另一个最终会处于分离的HEAD状态
实际上,不会,这就是问题!
每个工作树都有自己的HEAD
和自己的索引(也就是临时区域或缓存)。所有人共享实际的底层存储库,以及基础分支提示文件,例如.git/refs/heads/mybranch
。
然后,假设两个不同的工作树(我将它们都与主要仓库分开以便没有明显的“首选”)都HEAD
指向mybranch
,并从两个工作树中的一个提交:
repo$ cd ../worktree1
worktree1$ ... hack away ...
worktree1$ git add bar1 bar2 && git commit -m 'foo some bars'
现在发生的情况通常是:Git将索引写入一个或多个树,使用新树写入新提交,并将任何提交mybranch
解析为其父提交,并更新mybranch
指向新提交。 worktree1
的索引现在与新提交匹配。现在我们这样做:
worktree1$ cd ../worktree2
worktree2$ ... modify unrelated file, not bar1 or bar2 ...
worktree2$ git add unrelated && git commit -m 'unrelated change'
现在发生的事情是Git编写索引...等待, 索引? 哪个指数?那么, 索引 - worktree2
中的索引。哪个文件没有从worktree1
修改和添加。 (它确实有两个bar
文件,除非它们是全新的,但它有旧版本。)好的,所以Git将索引写入一个或多个树,写一个使用新树的新提交和任何提交mybranch
解析为其父级,并更新mybranch
以指向新提交。
提交链现在看起来像这样:
...--o--1--2
其中1
是../worktree1
中的提交,而2
是worktree2
中的提交。两个工作树中的名称mybranch
都指向提交2
。两个工作树中的名称HEAD
包含ref: refs/heads/mybranch
。当然,两个工作树中的索引文件是不同的。
提交1
的内容是worktree1
中索引中的内容。它包含您对bar1
和bar2
所做的更改。
提交2
的内容是worktree2
中索引中的内容。它包含您在unrelated
中所做的更改,但没有在文件bar1
和bar2
中进行了更改。实际上,您在worktree2
中提交的提交已恢复这两个文件!
如果您愿意让一个或两个工作树处于“分离的HEAD”状态,您可以使用git checkout --detach mybranch
或git checkout refs/heads/mybranch
以这种方式检查它们。现在,其中至少有一个将HEAD
直接指向提交,而不是指向分支名称,Git应该允许两个工作树签出相同的提交。