无法取消暂存已提交的git文件

3
当我们将一个目录添加到git时,我们不小心已经添加了一些临时文件(以.~结尾),但是我们不想跟踪这些文件。之后,我们设置了一个包含*.~规则的.gitignore文件。这对所有新的临时文件都有效,但是我们无法删除已经提交的少数文件。当我们运行git rm --cached <file>命令时,它会将文件从modified:状态移动到deleted:状态,并显示:
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    FILE.~

但是当我们运行git reset HEAD FILE.~时,它仍然在文件列表中。

Unstaged changes after reset:
M       pd/FILE.~

您并非试图取消暂存任何内容;而是试图将文件删除暂存。 - Chris Martin
2个回答

3

你已经快完成了:在第一步之后停下来并提交!

git status 给出的消息是如何撤销您已经进行的更改(如果您错误地进行了更改)。运行 git rm --cached <file> 是正确的做法,这个命令会从暂存区中删除文件,但是会保留它在本地副本中的存在。Git status 试图提供帮助,让您知道如果文件状态不正确,需要执行哪些操作。在这种情况下,文件的状态是正确的,所以您可以继续提交。


文件最初被删除了,但是临时文件已经发生了变化,现在它以修改的状态重新出现了。 - KPK
我不确定你的意思是什么:你是否已经提交了删除操作? - Andrew Aylett

2
问题在于stage并不是你所想的那样。 上面这张图片来自Git Book,清晰地展示了文件状态。 你已经提交的临时文件实际上并没有被stage,但它们是被跟踪的。当你提交一个删除操作时,Git就会停止跟踪这些文件。`git status`命令会显示有一个将要被提交的变更,即删除该文件。使用`git commmit -a -m "Removed temp files"`命令可以真正地提交删除操作并使该文件不再被跟踪。 然而,这并不会从早期的提交中删除该文件,对此我推荐阅读Github Help: Remove Sensitive Data,因为它解释得非常清楚。 下面的命令可以完全从历史记录中清除旧文件,但这可能并不是必要的,只是作为额外的信息提供。

git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch ' \ --prune-empty --tag-name-filter cat -- --all


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