无法摆脱 "Changes not staged for commit"

25

我的repo似乎被锁定在这种状态下,我无法摆脱。即使我重置到HEAD~1,我仍然收到有关此单个文件已修改的通知。使用'add'和'checkout'均未起作用。我的core.autocrlf和core.safecrlf都未设置(为空)。

请参见下文:

$ git --version
git version 1.7.9.6 (Apple Git-31.1)

$ git status

# 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)
#
#       modified:   a_file_name.cpp
以下命令(分别运行)没有影响:
$ git checkout -- a_file_name.cpp
$ git reset a_file_name.cpp
$ git add a_file_name.cpp
$ git reset --hard
$ git clean -n
<nothing>
$ git clean -f
<nothing>

$ git status

# 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)
#
#       modified:   a_file_name.cpp

它继续进行......

我做错了什么?

回应 @Don 的建议(git rm)并没有变化,但是这就是情况:

$ git rm 
error: 'a_file_name.cpp' has local modifications
(use --cached to keep the file, or -f to force removal)
$ git rm -f a_file_name.cpp
rm 'a_file_name.cpp'
$ git status

# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    a_file_name.cpp
#
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    a_file_name.cpp
#

$ git commit -m"tmp"
[master 2a9e054] tmp
1 file changed, 174 deletions(-)
delete mode 100644 a_file_name.cpp

$ git status
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    a_file_name.cpp
#

基本上回到原点。


1
你的行尾设置是什么(autocrlfsafecrlf.gitattributes等)? - ellotheth
1
当你执行 git checkout -- a_file_name.cpp 时会发生什么?同时确保在运行此命令时与该文件处于同一目录中。 - Code-Apprentice
“a_file_name.cpp” 是你遇到问题的文件的实际名称,还是你为了这个问题而对其进行了清理? - CB Bailey
2
@FractalSpace:如果看起来像命令和输出的东西实际上是伪造的并且缺少关键细节,那么回答你的问题就很困难。 - CB Bailey
2
@FractalSpace:在这种情况下,如果您不在正确的目录中,我不明白为什么git status没有给出正确的相对路径,例如# modified: sub-dir/a_file_name.cpp。如果您可以重现此问题,则应记录错误。Git绝对不应该这样做。 - CB Bailey
显示剩余14条评论
5个回答

7
git commit -a -m "message"

-a选项将追踪的所有已修改文件都添加进去。

6
我用一个可行的方法来解决这个问题:
1. 重新创建我删除的文件。 2. 运行指令git add path/filename。 3. 运行指令git rm --cached path/filename。 4. 删除文件。 5. 运行指令git add .。 6. 如果不是在一个已经推送过的分支上,运行指令git commit --amend

是的,这对我有用,我进行了合并,发现有一个同名文件,所以其中一个被加上了 ~HEAD 的前缀。我手动删除了它并提交了合并。然后出现了一个幽灵文件,我无法添加或删除它...我还意识到未暂存的文件没有大写字母,但我的磁盘上的文件有大写字母... - Ambroise Rabier

2

您需要修改文件中的任何更改吗?git-reset 默认情况下会保留目录树中的文件。

git reset --hard

将重置并覆盖工作树中的文件与提交中的文件。

您是否在每个步骤后执行了git diff以查看是否实际存在任何更改?


2
git reset --hard没有影响。(此时,我不需要这个文件) diff 确实显示了一些更改。 - FractalSpace
你可以删除不需要的文件,或者在执行“git reset --hard”之前对每个未跟踪的文件执行“git add .”,以永久性地将其添加到版本控制中。 - Don Branson
你是否有权限问题?在任何检出、重置等操作后,文件是否会发生变化? - jeremy
@jeremy git fsck显示了一些悬空对象,执行了git gc。然而,没有任何变化。 - FractalSpace
@FractalSpace git rm 不会有帮助,因为它不是一个被追踪的文件。 - Don Branson
@DonBranson 权限原本是 644。改成了 755。结果还是一样。git rm 有有趣的结果。我在原来的问题上补充了一些内容以便更清楚,但基本上现状仍然没有改变。 - FractalSpace

2

确保在运行任何git命令时,您处于与文件相同的目录中。或者,您可以使用相对路径或绝对路径来处理与git命令一起使用的文件。从git status的输出应该指示文件所在的子目录。我觉得奇怪的是,您发布的输出没有显示这一点。


我发现从git项目的顶级目录而不是同一目录运行命令更有用。参考链接 - Josiah Yoder
@JosiahYoder 是的,你也可以这样做。 - Code-Apprentice

1
这可能是因为所涉及的文件大小写不同导致的。
在我的情况下,它是
README.md readme.md
Git 不允许您简单地使用 git add ... 更改大小写。
您可以通过执行以下操作来解决此问题:
git mv -f readme.md README.md

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