为什么git-rm和git-add不是相反的操作?

3

文件可以被跟踪或未跟踪。我们通过执行“git add”开始跟踪文件。

现在假设我们想要停止跟踪一个文件。我会认为使用“git rm”是正确的方法。我期望通过“git rm”使文件变成“未跟踪”。然而,实际上我们完全删除了该文件。为什么?如何使文件只是未跟踪(而不是删除)?


1
可能是从存储库中删除文件但在本地保留它的重复问题。 - Tim Biegeleisen
使用git rm --cached命令可以将文件从Git仓库中删除,但保留在本地文件系统中。 - Tim Biegeleisen
1
我们开始通过执行git add来跟踪文件。-- 不完全正确。使用add命令,您将内容添加到暂存区以进行下一次提交。这与其他系统不同,在git中您添加的是内容而不是文件。 - miku
@miku,你如何开始跟踪文件?除了“git add”之外,我不知道其他的方法。我知道“git add”不仅仅是开始跟踪文件,但这并不能否定“git add”是开始跟踪的方式。 - Roman
3个回答

4
停止跟踪文件的命令是git rm --cached
请记住,Git 使用索引来准备下一次提交。您可以使用git add将工作树中的文件添加到索引中。
从项目中完全删除文件比取消跟踪文件更常见。这就是为什么git rm会彻底从项目中删除文件,即从工作目录和索引中都删除该文件。
为了仅从存储库中删除文件,实际上必须从索引中删除它(或者更好地说,将其标记为已删除),因为这是准备下一次提交的位置。 --cached 选项告诉 git rm 这一点。(请注意,其他命令也使用 --cached 来引用存储在索引中的文件的副本)。

2
为什么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的功能相关联。

0
为了将使用 git add 将文件添加到暂存文件列表中的文件取消暂存,您需要使用:
git reset HEAD <file>...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接