gpt4 book ai didi

git - 为什么两个 git 工作树不能 checkout 同一个分支?

转载 作者:太空狗 更新时间:2023-10-29 13:17:12 24 4
gpt4 key购买 nike

使用单独的 git-worktree ,为什么我不能 checkout 与主工作副本中相同的分支?如果我尝试,我会得到错误:

fatal: 'mybranch' is already checked out at '/path/to/repo'

我可以看到,如果我从一个工作树 checkin ,另一个将以分离的 HEAD 状态结束,但这有那么糟糕吗,为什么我什至不能 checkout 同一个分支?

最佳答案

I can see that if I check in from one worktree, the other would end up in a detached HEAD state

实际上,它不会,这就是问题所在!

每个工作树都有自己的 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 中的提交,2worktree2 中的提交>。在两个工作树中,名称 mybranch 都指向提交 2。在两个工作树中,名称 HEAD 都包含 ref: refs/heads/mybranch。当然,两个工作树中的索引文件是不同的。

提交1内容worktree1 中索引中的任何内容。它包含您对 bar1bar2 所做的更改。

提交2内容worktree2 中索引中的任何内容。它包含您在不相关 中所做的更改,但没有在文件bar1bar2 中所做的更改.实际上,您在 worktree2 中所做的提交 还原了 这两个文件!

如果您愿意让一个或两个工作树处于“分离的 HEAD”状态,您可以使用 git checkout --detach mybranch 以这种方式检查它们git checkout refs/heads/mybranch.现在至少其中一个将 HEAD 直接指向提交,而不是分支名称,Git 应该允许两个工作树有相同的提交 checkout 。

关于git - 为什么两个 git 工作树不能 checkout 同一个分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39665570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com