git提示我有未提交的更改,但我看不到它们。

15

我正在执行这个命令来删除第二个文件(第一个是JetBrains的 .idea 文件夹,现在已经在 .gitignore 中了),但我无法成功:

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch gf5/console/basic.php' --prune-empty --tag-name-filter cat -- --all
Cannot rewrite branches: You have unstaged changes.

当Git没有列出"unstaged"文件时,我怎样知道Git指的是哪些文件,以及如何解决这个问题?

PS:这个问题不是关于存储(stash),我没有存储任何东西,也从未在这个仓库上执行过存储操作。

注意:我运行了git status并收到以下输出:

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   gf5/console/basic.php

Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)

//(and a whole long list of files)

1
git status 返回了什么? - Kyle
3个回答

14

啊哈!!我弄清楚了发生了什么事。请阅读最后几句话以获得一些见解。

答案是首先要做:

git status

这会显示以红色标记的修改文件,我猜测这意味着它们在 git 中被视为已经“删除”。然后我执行了以下操作:

git add --all

接着我使用SourceTree提交了所有暂存的文件(抱歉我并没有一路使用命令行)。然后我继续将更改推送到服务器,但那只是可选的。

上述命令成功执行。

当我尝试在另一个文件上运行上述命令时,我遇到了同样的问题。因此,我再次运行了git status,结果发现我刚从历史记录中删除的文件仍然存在,所以你需要这样做:

git rm /previous_file_you_just_removed_from_history.php

另外需要澄清的是,filter-branch 命令会从所有提交中删除该文件的历史记录,但不会删除您对该文件所做的更改。也就是说,已删除的文件仍然是在此之前您对其进行的所有更改的总和。我希望这有助于让其他人更清楚地理解这个概念。


2
不,不是“删除”,只是修改了。 - sloppypasta

0

我曾经遇到过同样的问题,即在克隆后所有文件都显示为已修改,并发现原因是(在我的情况下)Tortoise Git 在检出和提交时自动修改了每个文件的行尾。

为了防止这种行为,禁用存储库设置窗口下的 AutoCrLf 设置(Git -> Config Source [Local] -> AutoCrlf),如 this question. 中所述。


-1

如果需要排除更多文件:

我使用了那个命令,但是后来发现还有更多的文件需要包含。然后,我尝试逐个添加它们,但是收到了一条消息,说无法覆盖备份文件。

所以这个方法对我来说似乎可行:

$ git filter-branch --tree-filter 'rm -rf fullpath_file1 fullpath_file2 ... fullpath_file_n' -f HEAD

你应该提到它会从磁盘中删除你的文件,而不仅仅是从 Git 历史记录中删除。 - pooria

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