如果我在暂存区域中有一个文件(显示在git diff --cached
中)并且我想完全删除它,我该怎么办?
做
git reset HEAD -- file
git checkout -- file
这样做但是这两个动作有1个命令吗?
答案 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 -- path
从HEAD
提交到索引,然后从索引到工作树。
这里缺少一个选项:没有简单的方法可以绕过索引从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 .