2

git-new-workdir曾经为一个 git 存储库拥有两棵工作树。这通常效果很好,但是如果在两个工作树中签出相同的分支,则在提交某些内容后我会出现有趣的行为:

  • 我从干净的工作树和“master”开始。
  • 我在工作树 A 中提交了一些东西。

结果:

  • 工作树 A 中的“git status”显示“干净”(如预期的那样)
  • 工作树 B 中的“git status”突然显示“要提交的更改”

显示的更改与我刚刚在 A 中所做的提交相反。例如,如果 A 中的提交添加了一行,则 B 中的“要提交的更改”显示该行已被删除。

这里发生了什么?这是 git-new-workdir 的已知限制吗?有没有办法避免这个问题?或者我应该避免在两个副本中签出同一个分支时签入?

我也有兴趣了解内部发生的事情(我对 git 的内部结构知之甚少)。

笔记:

我发现问题很容易通过 git reset--hard在 B 中运行来解决,如果 B 在 A 中提交之前没有未提交的更改。

但是,如果我在 A 中提交,而 B 中有未提交的更改,则真正的未提交更改与提交中的虚假更改混合在一起,并且似乎没有简单的方法可以解开它们。因此问题。

4

2 回答 2

5

我认为这是预期的行为。来自http://nuclearsquid.com/writings/git-new-workdir/

在您的一个工作目录中创建一个新的提交或分支,它们立即在所有工作目录中可用。

当您在 A 中提交更改时,该提交也可供 B 使用。由于您刚刚在 A 中添加的行不在 B 中,因此您似乎在最近一次提交后进行了更改。

我认为多个工作目录的目的是同时签出不同的分支。

于 2012-05-04T20:12:45.913 回答
5

截至 2015 年,这个问题已经过时。

git-new-workdir已被git worktree(2015 年 7 月在 Git V2.5 中引入)取代。git worktree通过断然拒绝检查两个工作树中的相同分支来解决此问题中描述的问题:

$ git checkout myBranch
fatal: 'myBranch' is already checked out at '/tmp/otherworktree'
于 2016-03-17T09:35:44.427 回答