删除暂存文件并重置为原始版本

Jim*_*Jim 1 git git-reset git-stage

如果我在暂存区域中有一个文件(显示在 中git diff --cached)并且我想完全删除它,我该怎么做?
正在做

git reset HEAD -- file  
git checkout -- file  
Run Code Online (Sandbox Code Playgroud)

是的,但是这 2 个操作有 1 个命令吗?

tor*_*rek 7

是的:

git checkout HEAD -- file
Run Code Online (Sandbox Code Playgroud)

诀窍。

有很多背景的较长版本

关于这一点,有很多(有时太多)事情需要了解。首先,指数(又称临时区域高速缓存)持有的所有的文件将要提交的所有时间。事实上,索引的每个文件都意味着文件将以其在索引中的形式提交。这就是为什么你必须一直这样做:Git 不会将它从工作树复制到索引中,覆盖旧的索引版本,直到你告诉 Git 这样做。git add file

当您最初检出某个提交时,索引通常也包含该提交中每个文件的副本。有一些例外(有关详细信息,请参阅在当前分支上存在未提交的更改时检查另一个分支以获取详细信息),但通常初始设置是:

  HEAD      index     work-tree
-------------------------------
README.md  README.md  README.md
file1.txt  file1.txt  file1.txt
Run Code Online (Sandbox Code Playgroud)

依此类推,每个文件的所有三个版本都匹配.

但是,每个副本之间存在一些细微但重要的差异:

  • 提交中的副本 inHEAD是只读的。没有什么可以改变这个副本。(当然,HEAD它本身可以更改为另一个不同的提交;不同的提交可以有不同的文件副本,或者根本没有文件。)文件的提交副本位于一个特殊的 Git-only 中格式。

  • 索引/暂存区中的副本是读/写的。不过,这个副本也是特殊的 Git-only 格式。您可以随时将该文件的不同版本复制到索引中,甚至可以删除索引条目。

  • 工作树中的副本采用您计算机的正常格式。您可以用它做任何您喜欢的事情,而不受您的计算机施加的任何限制。

是什么git status呢孔,它的许多事情之一做的那样-是要运行2周的比较:

  • 是什么在HEADVS什么在索引中。无论有什么不同,Git 都会将其列为暂存以进行提交。

  • 索引中的内容与工作树中的内容。无论有何不同,Git 都将其列为未暂存以进行提交。

这意味着您不必费力浏览所有相同内容的庞大列表;你只会看到不同的地方

git add = 从工作树复制到索引

使用将工作树版本复制到索引中。这很简单!当然,Git 就是 Git,还有更多种类的,但我们暂时先忽略它们。:-)git add pathgit add

git reset = ...好吧,这很复杂

git reset命令做了太多不同的事情。但是,如果您坚持使用git reset -- path,它会简化很多:这意味着HEAD提交复制到索引。工作树副本保持不变。

git checkout = 复制自……嗯,也很复杂

这个git checkout命令,比如git reset,做了太多不同的事情。但是,如果您坚持使用这两种形式,我们会得到两件很容易解释的事情:

  • git checkout -- path 从索引复制到工作树。

  • git checkout HEAD -- pathHEAD提交复制到索引,然后从索引复制到工作树。

这里缺少一个选项:没有简单的方法可以HEAD绕过索引从提交复制到工作树。(有几种方法可以做到这一点,但它们有一些警告。)

你不能在HEAD版本上写,所以没有办法复制到HEAD. 相反,您将运行git commit,它进行新的提交,永远冻结索引副本(每个文件的!)。新的提交,然后变成HEAD承诺。当您运行 时,所有文件都已在索引中处于最终形式这一事实git commitgit commit使速度如此之快的部分原因。