Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用:“;git更新索引--跳过工作树“;存档。现在可以';不换分行_Git - Fatal编程技术网

使用:“;git更新索引--跳过工作树“;存档。现在可以';不换分行

使用:“;git更新索引--跳过工作树“;存档。现在可以';不换分行,git,Git,我添加了一个带有git更新索引的文件——skip worktree,它非常有效。但现在我无法更改分支: “无法完成该操作,因为以下文件已有更改”,它显示了我更新索引的文件 我在一次提交中更改了该文件。之后,我意识到我应该更新索引,所以我对索引进行了更改,然后恢复了提交。然后我又做了些改变。现在我处于这种情况下…可以为索引中的任何文件名条目设置两个标志:假定未更改和跳过工作树。这些标志有不同的意图-假设unchanged用于速度特别慢的文件系统,而skip worktree用于稀疏签出,但这两个标

我添加了一个带有git更新索引的文件——skip worktree,它非常有效。但现在我无法更改分支:

“无法完成该操作,因为以下文件已有更改”,它显示了我更新索引的文件


我在一次提交中更改了该文件。之后,我意识到我应该更新索引,所以我对索引进行了更改,然后恢复了提交。然后我又做了些改变。现在我处于这种情况下…

可以为索引中的任何文件名条目设置两个标志:
假定未更改
跳过工作树
。这些标志有不同的意图-
假设unchanged
用于速度特别慢的文件系统,而
skip worktree
用于稀疏签出,但这两个标志通常产生相同的效果:文件保留在索引中,但当Git将索引中的内容与工作树中的内容进行比较时,Git通常只假设索引中的文件与工作树中的文件匹配,或者不匹配

就目前而言,这很好,但在一些重要的情况下,这并没有帮助 请记住,索引可能是构建下一次提交的最佳描述。因此,它包含来自当前提交的每个文件的copy1。只要您只是基于当前提交进行新的提交,该副本就可以保持原状。您刚刚通过运行
git commit
进行的新提交在新提交中保存了该文件的另一个副本(或者更确切地说,再次使用它,请参见脚注1)。新提交将成为当前提交,并且索引将继续保存同一文件的相同副本。无论对文件的工作树副本执行什么操作,索引副本都将继续与当前提交副本匹配

但是,一旦您使用
git checkout
(或新的
git开关
)切换分支,情况就会发生变化。现在,您将选择一个不同的提交作为当前提交。如果另一个不同的提交包含该文件的不同副本,该怎么办

为了切换到另一个分支上的另一个提交,Git必须将文件的现有副本从索引中删除,而是将该文件的新版本复制到索引中。在某种程度上这是可以的,但当Git这样做时,Git也会覆盖文件的工作树副本

我们已经确定您正在更改工作树副本,而没有将更改的文件提交到新提交。这就是为什么您首先要设置标志:这样您所做的新提交将使用索引中的旧副本,而不是工作树中的当前副本。因此,工作树副本与您所做的每个新提交中的提交副本不匹配

Git现在告诉您,通过切换提交,Git将销毁您在工作树中的副本。如果你想保留那份副本,最好保存它!你可以把副本保存在任何你想保存的地方。保存该文件的副本后,例如,
cp path/to/file/tmp/save
-您可以:

  • 删除工作树文件,或
  • 使用
    git update index--no skip worktree
    清除标志,然后使用
    git checkout--path/to/file
    git reset--hard
    覆盖工作树副本
因此,工作树中的
path/to/file
与索引中的
path/to/file
副本匹配,或者根本不存在。现在,
git checkout
可以安全地用目标提交的副本替换
path/to/file
的索引副本,并用目标提交的副本填充工作树中的
path/to/file
。所以现在git checkout将很高兴,并且能够切换到该提交。而且,如果您想要将要被删除的工作树副本,那么,您已经将其保存在
/tmp/save
中,这样就可以了

请注意,这两种方法之间的区别在于文件的索引副本中是否仍设置了
假定未更改
标志。我更喜欢清除旗帜,因为有一个棘手的角落情况。如果要切换到
otherbranch
顶端的提交中根本没有file
path/to/file
,会发生什么情况?在这种情况下,
git checkout
操作将从索引和工作树中删除
path/to/file
。一旦文件不再存在于索引中,Git就无法在其上保留
假定未更改的标记。文件根本就不存在;不能在不存在的条目上设置标志位

(如果目标提交确实包含该文件,并且您希望再次设置该标志,则只需再次设置该标志即可。)



1从技术上讲,它包含对文件的冻结、Git化数据的引用。这与任何其他副本共享,因此如果文件确实与当前提交匹配,则不会使用额外的空间。也就是说,将其视为一个副本是有点错误的,但是除非您开始使用blob hash id的
git update index
,否则将其视为一个副本无论如何都是可行的。

您需要还原标志才能切换
git update index--no skip worktree
,并且肯定会隐藏更改。为什么我需要还原标志?设置标志是我想要的。所以我必须在切换后再次设置标志?