如何解决从索引中删除文件后 git commit -a 如何工作
假设我已跟踪文件 empty.txt
。
现在我使用 rm empty.txt
从工作目录中删除文件。
现在我正在使用 git rm empty.txt
从索引中删除文件,现在文件应该没有被跟踪,因为我已经从索引中删除了它。
在此之后,我使用了 git commit -a -m "remove empty.txt"
但它是如何工作的,因为 -a 参数用于跳过将跟踪文件显式添加到暂存区,但我已经从索引中删除了文件?
它应该未被跟踪。
解决方法
您可能有两种误解:
-
这与“跟踪”无关。
-
git 提交与更改无关。它是整个文件集的快照、照片,如索引所示,索引本身就是整个文件集的完整副本。
如果您拍摄一只狗站在两棵树之间的照片,那么这张照片包含一只狗和两棵树。这是一次提交。
如果狗走开而您又拍了一张照片,照片中包含两棵树,但不包含狗。你拍那张照片的时候它不在那里。这是另一个提交。
第二次提交的创建不涉及“删除”操作。这不是对第一张照片的修改。这只是一张照片。
在您创建的 git commit 的情况下,“what is”是索引,简单明了(默认情况下;有办法解决这个问题,通过说 git commit someFile
,但出于我们的目的而忽略它) .
好的,那么,谈谈你的问题的细节。你说:
我使用 rm empty.txt
现在我正在使用 git rm empty.txt
此后我使用了 git commit -a
所以:
-
如果您从工作树中删除文件,
git commit -a
也会在提交之前自动从索引中删除该文件(就像通过调用git rm --cached
)。该文件现在不在索引中,因此从它创建的提交丢失了该文件(就像狗一样)。 -
就您而言,您自己从工作树和索引中删除了文件。因此,就该文件而言,现在
-a
的git commit -a
部分与索引无关;你已经完成了这项工作。现在发生了完全相同的操作:文件现在不在索引中,因此从它创建的提交丢失了该文件(就像狗一样)。
最初我认为文档对此非常清楚,但经过测试,这里出现了一些奇怪的情况...
因此,在大多数情况下,-a
标志将跳过索引并应用您的工作树中的更改。删除文件是一种更改。我对(可能含糊不清的)文档的阅读表明该索引基本上会被忽略,除了不会添加新文件。
不过,在上一次提交中的文件从阶段中删除的情况下,有些奇怪。我的测试显示,在这种情况下,文件从新提交中删除,因为它从索引中删除;然后忽略工作树中的任何进一步更改(即,如果重新创建文件)。从这个意义上说,OP 观察到的内容是一致的 - 很难从阅读文档中得到这一点。
这太糟糕了,因为它破坏了一堆描述行为的看似真实的简单语句;但它是:
git init
touch file1
git add .
git commit -m "initial commit"
echo CHANGES > file1
git rm --cached file1
git status
# this will show a staged change to remove the file,and an untracked file
# with the CHANGES
git commit -a -mtest
...现在提交有一个空目录,file1
未被跟踪。考虑到这一点,问题中的情况只是工作树的变化与索引的变化相同的退化情况。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。