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

时间:2018-04-09 15:12:04

标签: git git-reset git-stage

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

git reset HEAD -- file  
git checkout -- file  

这样做但是这两个动作有1个命令吗?

3 个答案:

答案 0 :(得分:4)

是:

git checkout HEAD -- file

诀窍。

具有大量背景的更长版本

有很多(有时候太多)了解这个问题。首先,索引(也称为临时区域缓存)包含所有文件 - 始终在 提交。事实上,每个文件在索引中的存在意味着文件将以索引中的形式提交。这是为什么你必须一直做git add file:Git不会将它从工作树复制到索引中,覆盖索引版本,直到你告诉Git这样做。

当您最初签出一些提交时,索引通常会保存该提交中的每个文件的副本。有一些例外(详见Checkout another branch when there are uncommitted changes on the current branch),但通常情况下,初始设置为:

  HEAD      index     work-tree
-------------------------------
README.md  README.md  README.md
file1.txt  file1.txt  file1.txt

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

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

  • HEAD中提交中的副本是只读的。 Nothing 可以更改此副本。 (当然,HEAD本身可以更改为另一个不同的提交;不同的提交可以具有该文件的不同副本,或者可能根本没有该文件。)该文件的已提交副本位于一种特殊的Git格式。

  • index / staging-area中的副本是可读/写的。不过,此副本也采用特殊的Git格式。您可以随时将该文件的不同版本复制到索引中,甚至删除索引条目。

  • 工作树中的副本是您计算机的正常格式。您可以随意使用它做任何事情,但不受计算机施加的限制。

git status做的很多事情就是运行两个比较:

  • HEAD中的内容与索引中的内容有什么关系。无论不同是什么,Git列表为提交阶段。

  • 索引中的内容与工作树中的内容相比。无论不同是什么,Git列表都没有进行提交。

这意味着您不必浏览所有相同的所有内容的大量列表;你只能看到不同的

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

使用git add path将工作树版本复制到索引中。这非常简单!当然,Git是Git,git 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,这将进行 new 提交,永久冻结索引副本(每个文件!)。然后的新提交变为 HEAD提交。当您运行git commit时,所有文件都已在索引中的最终形式,这是使git commit如此之快的一部分。

答案 1 :(得分:0)

您可以使用git reset filename.txt

这将从暂存区域中删除名为filename.txt的文件。

您还可以使用git reset取消暂存所有文件。

祝你好运!

答案 2 :(得分:0)

要从登台区域删除单个文件,只需使用:

git reset HEAD -- <file>

要从登台区域中删除整个目录或文件夹,只需使用:

git reset HEAD -- <directoryName>

对于较新版本的Git,您还可以使用:git restore --staged <file>.

有时您可能还需要删除缓存:git rm -r --cached .