当我想还原文件更改时,我使用git checkout -- path/to/file.ext。但是我现在必须以某种方式执行两次命令。
第一次 checkout 后git diff什么都没有显示,但在我的舞台上该文件仍列为已修改。
仅在第二次 checkout 后,文件才从舞台中删除。
这是预期的行为吗?

最佳答案

命令:

git checkout -- path/to/file.ext

path/to/file.ext的内容从登台区域复制到工作树。它不会更改存储在暂存区中的内容,并且运行两次应该没有任何区别:从暂存区复制到工作树,然后再从暂存区复制到工作树,应该导致第二个副本上的工作树内容与第一个副本上的工作树内容相同。

请注意,文件有第三个版本,我们应该真正将其称为第一个版本,即当前提交中的副本。当您 checkout 一些提交时,Git:
  • 将存储在该提交中的每个文件的内容复制到您的暂存区域,并(同时)
  • 将每个此类文件的内容复制到您的工作树中。

  • 这意味着该文件始终具有三个 Activity 版本:
  • HEAD:path/to/file.ext:这是只读的,以特殊的,压缩的,仅Git的形式永久存储在提交中。例如,使用git show HEAD:path/to/file.ext查看它。
  • :path/to/file.ext:这是可读/写的,不是永久的。它以特殊的压缩Git-only形式存储在临时区域(也称为索引,有时也称为缓存)中。该文件与第一个文件之间的区别在于,您可以覆盖该文件,而索引/临时区域副本中的内容将成为您下一次提交的内容。使用git show :path/to/file.ext查看此副本。
  • 使用git add path/to/file.ext将工作树版本复制到索引/临时区域。
  • 使用git checkout -- path/to/file.ext将索引/临时区域版本复制到工作树中。
  • 使用git reset path/to/file.extHEAD:path/to/file.ext版本从提交复制到索引/暂存区域,而不会影响工作树版本。
  • 最后,是工作树版本path/to/file.ext。该文件以计算机的正常格式存储,因此您和计算机都可以使用该文件。

  • (如果要将文件的HEAD版本复制到索引/临时区域和工作树中,则可以使用git checkout HEAD path/to/file.ext做到这一点。)

    请注意,当您运行git status时,实际上将运行两个差异:
  • HEAD与索引:这里的所有不同之处都是“暂存提交”。
  • 索引与工作树:这里的不同之处是“未上演提交”。

  • 您永远不会直接看到索引/暂存区:仅与HEAD提交相比,或与工作树相比,才可以看到它。这是有道理的,因为在一个大型项目中,索引/暂存区始终有成千上万个文件,但通常只有少数几个与当前提交或工作树或两者不同。

    关于git - GIT结帐-两次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51168974/

    10-12 00:03
    查看更多