Git 是否可以检索添加到索引中的文件?

Git 是否可以检索添加到索引中的文件?,git,Git,当我阅读了大量关于如何使用git的资料时,我没有看到任何文章建议在需要时何时可以回滚。例如,我在我的工作目录中初始化了一个git目录,即gitinit 然后我将文件添加到git的索引中,即git add.。这已将所有文件添加到git的索引中。现在,我不再将文件提交到git的存储库,即git提交,而是对添加到索引中的一个文件进行更改。我意识到我犯了一个错误。我是否可以回滚到上一个状态,或者只有在提交文件后才能回滚到上一个状态?我的理解是,当我运行命令git add.时,会在git的对象存储中创建一

当我阅读了大量关于如何使用git的资料时,我没有看到任何文章建议在需要时何时可以回滚。例如,我在我的工作目录中初始化了一个git目录,即
gitinit

然后我将文件添加到git的索引中,即git add.。这已将所有文件添加到git的索引中。现在,我不再将文件提交到git的存储库,即git提交,而是对添加到索引中的一个文件进行更改。我意识到我犯了一个错误。我是否可以回滚到上一个状态,或者只有在提交文件后才能回滚到上一个状态?我的理解是,当我运行命令
git add.
时,会在git的对象存储中创建一个或多个文件的副本。我相信对象存储中的文件是压缩的。这是否意味着我可以从对象存储回滚?

是的,您可以。试一试

git checkout-index -f foo
从索引中签出
foo
。或按签出所有文件

git checkout-index -fa

使用
git checkout
而不指定树将从索引中签出。

使用

git checkout -- <file>
git签出--

放弃工作目录中的更改,同时保留对索引的更改。

我对这个问题很感兴趣,答案似乎是“是”,git add将文件的副本放在存储库中,即使存储库中没有提交,您也可以回滚该文件,下面的示例对此进行了测试

% mkdir test && cd test
% git init .
% echo "1" > test.txt
% git add test.txt
  - git status shows now "added" file
% echo "2" > test.txt
  - git status shows "added" and "modified" file, test.txt contains number 2
% git checkout test.txt
  - git status shows only "added" again, and test.txt contains the number 1

对不起,我是n00b。这到底意味着什么?通常使用
git checkout
签出分支、标记、头或特定提交。如果不使用该参数,则签出的内容将来自索引。什么是树检查:
foo
是我添加到索引中的文件吗?签出文件时会发生什么?它会覆盖我的更改吗?它合并了他们吗?是的。它将覆盖工作目录中的文件,而不是合并。它将覆盖它们。
-f
是为了在文件已经存在的情况下强制执行该操作。但实际上,我认为只使用
git checkout--foo
是一种更好的方法。我错过了。是我添加到索引中的文件名吗?