我用git-new-workdir一个git存储库有两个工作树.这通常很有效,但是如果在两个工作树中检出相同的分支,我会在提交某些内容后得到有趣的行为:
结果:
显示的更改与我在A中提交的提交相反.例如,如果A中的提交添加了一行,则B中的"要提交的更改"显示此行已被删除.
这里发生了什么?这是git-new-workdir的已知限制吗?有没有办法避免这个问题?或者我应该避免在两个副本中签出同一分支时检入?
我也有兴趣了解内部发生的事情(我对git的内部结构知之甚少).
注意:
我发现git reset--hard如果B在A中提交之前没有未提交的更改,那么只需在B中运行就可以轻松解决问题
.
但是,如果我在A中提交B中存在未提交的更改,则真正未提交的更改会与提交中的伪造更改混合在一起,并且似乎没有简单的方法可以解开它们.因此问题.
我认为这是预期的行为.来自http://nuclearsquid.com/writings/git-new-workdir/:
在您的一个工作目录中创建一个新的提交或分支,它们立即可用于所有工作目录.
当您在A中提交更改时,该提交也可用于B. 由于您刚刚在A中添加的行不在B中,因此您最近的提交似乎已经进行了更改.
我认为多个工作目录的目的是同时检出不同的分支.
截至 2015 年,此问题已过时。
git-new-workdir已被git worktree(在 Git V2.5 中引入,2015 年 7 月)取代。git worktree通过断然拒绝签出两个工作树中的同一分支来解决此问题中描述的问题:
$ git checkout myBranch
fatal: 'myBranch' is already checked out at '/tmp/otherworktree'
Run Code Online (Sandbox Code Playgroud)