为什么不"git reset HEAD"撤消我未提交的,未分级的更改?

Nilzor 17 git

我以前能够通过执行"Discard"功能来撤消SourceTree的更改,该功能在引擎盖下生成此命令:

git -c diff.mnemonicprefix=false -c core.quotepath=false reset -q HEAD -- myproj.csproj 
git -c diff.mnemonicprefix=false -c core.quotepath=false checkout HEAD -- myproj.csproj

突然间这不起作用.我做丢弃,没有错误发生,重新审视视图,但文件仍然"修改".然后我尝试在命令行中使用以下相同的结果:

c:\myproject> git reset HEAD

Unstaged changes after reset:
M       myproj.csproj

为什么它仍然被列为未分阶段的变化?

我已经验证该文件确实可写(没有进程持有锁)

更新

git checkout 也不起作用:

C:\myproject>git checkout myproj.csproj

C:\myproject>git status
# On branch master
# 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:   myproj.csproj
#
no changes added to commit (use "git add" and/or "git commit -a")

更新2 还试过:

  • git checkout --
  • git checkout -- .
  • git checkout HEAD

,这些都没有解决我的问题

更新3 - 更近一步:

结账时,.csproj确实恢复到了正确的版本,签出的版本使用了不同的换行编码.虽然登记版本有CR-LF(0D-0A)用于换行,但签出只有LF(0A).因此git认为文件在每一行都是不同的.为什么这个?

更新4:添加了SourceTree发布的第二行git-commands.我没有注意到第一次,这就是为什么我认为git reset HEAD会做任何事情.这并没有改变基础问题仍然与CR/LF相关的事实(我认为)

总结 我从未找到问题的解决方案,但我通过签入文件"解决"了它.我的原始问题没有包含SourceTree确实发出正确命令来回滚我想要的信息,因此大多数答案都解决了这个问题.在真正的问题是,目前还不清楚,但我的主要理论是,这是CR/LF有关.

Thushan.. 9

如果需要删除本地更改,请运行以下命令

git checkout -- file_name

git reset HEAD 不会删除本地更改.


Collin K.. 7

我怀疑你的存储库中有CRLF行结尾保存的文件,然后是你的配置改变的方式,以便git开始规范化行尾字符(core.autocrlf设置为true,或者.gitAttributes文件已添加或更改).当我遇到这个问题时,结果发现包含的.gitAttributes文件* text=auto已添加到我的仓库中.

(EOL规范化意味着git会在其数据库中将行尾字符写为LF,无论您在工作副本中使用什么).

启用它后,Git不会自动检查您的文件以查看它们是否需要EOL规范化.你必须明确告诉它检查你的所有文件,否则你最终会遇到这种情况:你的存储库中的文件仍然有CRLF行结尾,git只会注意到它应该触及每个文件时将它们规范化.因此,下次您对文件进行一些更改时,git会使用LF行结尾将文件写入其数据库.

当git通过读取操作触摸文件时会发生此问题.假设您对具有CRLF行结尾的文件进行了更改,然后尝试放弃更改.Git将从其数据库中读取干净的副本,看它是否有CRLF行结尾,然后将该文件标记为已修改.该文件实际上并未被修改,但是git说它想要将EOL字符的更改写入其数据库.每次您尝试放弃更改,检出该文件,甚至进行硬重置时都会发生这种情况.这就是为什么似乎不可能撤消这些修改.

您应该让git规范化所有文本文件的行结尾,因此不会继续弹出此问题(有关如何执行此操作的说明,请参阅/sf/ask/17360801/).如果可能,您甚至可能希望修改历史记录,以便在更改.gitAttributes设置的同时对行结尾进行规范化.

如果您无法修改历史记录,则可能会遇到需要检查仍具有CRLF行结尾的旧版本文件的情况.您可能会遇到无法丢弃且不想提交的已修改文件列表.在这种情况下,您可以使用此解决方法来实质上使git忘记它想要修改这些文件:

  1. 看看旧版本
  2. 关闭行尾标准化
  3. git reset
  4. 重新启用行尾标准化