文件可以被跟踪或未跟踪。我们通过执行“git add”开始跟踪文件。
现在假设我们想要停止跟踪一个文件。我会认为使用“git rm”是正确的方法。我期望通过“git rm”使文件变成“未跟踪”。然而,实际上我们完全删除了该文件。为什么?如何使文件只是未跟踪(而不是删除)?
文件可以被跟踪或未跟踪。我们通过执行“git add”开始跟踪文件。
现在假设我们想要停止跟踪一个文件。我会认为使用“git rm”是正确的方法。我期望通过“git rm”使文件变成“未跟踪”。然而,实际上我们完全删除了该文件。为什么?如何使文件只是未跟踪(而不是删除)?
git rm --cached
。git add
将工作树中的文件添加到索引中。git rm
会彻底从项目中删除文件,即从工作目录和索引中都删除该文件。--cached
选项告诉 git rm
这一点。(请注意,其他命令也使用 --cached
来引用存储在索引中的文件的副本)。git rm
不是git add
的相反操作?这似乎是在寻求一个意见——具体来说就是关于Git命令设计者的意见,这超出了SO的主题。唯一的事实回答是,它们之所以不这样做,是因为它们没有被设计成这样,正如适当的手册页面所记录的那样。git add
更新索引中的路径,以匹配工作树中的相应路径。这可能意味着追踪新文件(正如您在问题中定义的add
),有时会删除索引中的文件, 或者 替换另一个文件版本。考虑到这一点,add
可能看起来不像正确的名称;如果有什么,它会“添加更改”。但无论它是否是该命令的最佳名称,单个命令执行所有更新都是好事——不管它们是“添加文件”还是“删除文件”或其他一些东西。 git add .
是一个经常使用的命令,我不想用一系列命令来替换它,然后找出我删除的文件以便可以单独地rm
它们等等。由于add
是旧的命令,那么,如果您想定义“add
的反面”......那将是什么?将索引恢复到以前的状态?哪个以前的状态?如果我对foo
有已暂存和未暂存的更改,并且我说git add foo
,Git没有信息来执行特定add
的反向操作。其他答案进一步指出了“相反的添加”的歧义。有些人认为你的意思是“删除文件”(git rm --cached -- path
),而另一些人则认为你的意思是“删除更改”(git reset HEAD -- path
)。这是即使你明确表示你谈论“跟踪”和“取消跟踪”。git rm
更好地理解为*nix rm
命令的一个版本,增加了用于处理索引的功能,而不是与add
的功能相关联。git add
将文件添加到暂存文件列表中的文件取消暂存,您需要使用:git reset HEAD <file>...
git rm --cached
命令可以将文件从Git仓库中删除,但保留在本地文件系统中。 - Tim Biegeleisen