为了账号安全,请及时绑定邮箱和手机立即绑定

git status显示修改,git checkout - <file>不会删除它们

git status显示修改,git checkout - <file>不会删除它们

Git
万千封印 2019-08-14 17:31:06
git status显示修改,git checkout - <file>不会删除它们我想删除对我的工作副本的所有更改。运行git status显示修改的文件。我没做什么似乎删除了这些修改。例如:rbellamy@PROMETHEUS /d/Development/rhino-etl (master)$ git status# On branch master# Changed but not updated:#   (use "git add <file>..." to update what will be committed)#   (use "git checkout -- <file>..." to discard changes in working directory)##       modified:   Rhino.Etl.Core/Enumerables/CachingEnumerable.cs#       modified:   Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs#       modified:   Rhino.Etl.Tests/Rhino.Etl.Tests.csproj#       modified:   Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs#no changes added to commit (use "git add" and/or "git commit -a")rbellamy@PROMETHEUS /d/Development/rhino-etl (master)$ git checkout -- Rhino.Etl.Core/Enumerables/CachingEnumerable.csrbellamy@PROMETHEUS /d/Development/rhino-etl (master)$ git status# On branch master# Changed but not updated:#   (use "git add <file>..." to update what will be committed)#   (use "git checkout -- <file>..." to discard changes in working directory)##       modified:   Rhino.Etl.Core/Enumerables/CachingEnumerable.cs#       modified:   Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs#       modified:   Rhino.Etl.Tests/Rhino.Etl.Tests.csproj#       modified:   Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs#no changes added to commit (use "git add" and/or "git commit -a")rbellamy@PROMETHEUS /d/Development/rhino-etl (master)$ git checkout `git ls-files -m`rbellamy@PROMETHEUS /d/Development/rhino-etl (master)$ git statu
查看完整描述

3 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

可能导致此行为的问题有多个:

行结束规范化

我也遇到过这类问题。它归结为git自动将crlf转换为lf。这通常是由单个文件中的混合行结尾引起的。该文件在索引中被规范化,但是当git再次对其进行非规范化以将其与工作树中的文件区分开来时,结果是不同的。

但是,如果要解决此问题,则应禁用core.autocrlf,将所有行结尾更改为lf,然后再次启用它。或者您可以通过执行以下操作完全禁用它:

git config --global core.autocrlf false

您也可以考虑使用文件而不是core.autocrlf.gitattribute。这样,您可以确保使用repo的每个人都使用相同的规范化规则,从而防止混合行结尾进入存储库。

还要考虑设置core.safecrlf来警告你是否希望git在执行不可逆的规范化时发出警告。

git 联机帮助说:

CRLF转换有可能破坏数据。autocrlf = true将在提交期间将CRLF转换为LF,在结账时将LF转换为CRLF。无法通过git重新创建在提交之前包含LF和CRLF混合的文件。对于文本文件,这是正确的做法:它校正行结尾,这样我们在存储库中只有LF行结尾。但对于意外归类为文本的二进制文件,转换可能会破坏数据。

不区分大小写的文件系统

在不区分大小写的文件系统上,当存储库中存在具有不同大小的相同文件名时,git会尝试检出两者,但只有一个文件系统最终结束。当git尝试比较第二个时,它会将它与错误的文件进行比较。

解决方案是切换到不区分大小写的文件系统,但在大多数情况下这是不可行的,或者重命名并在另一个文件系统上提交其中一个文件。


查看完整回答
反对 回复 2019-08-14
?
青春有我

TA贡献1784条经验 获得超8个赞

我在Windows上遇到了这个问题,但是我没有准备好调查使用的后果config --global core.autocrlf false我也不准备放弃我的藏品中的其他私人分支和好东西,并从一个新的克隆开始。我只需要完成一些事情。现在。

这对我有用,因为你让git完全重写你的工作目录:

git rm --cached -r .git reset --hard

(请注意,在原始问题的评论中建议之前,运行只是git reset --hard不够好,也没有明确rm的文件reset


查看完整回答
反对 回复 2019-08-14
?
侃侃无极

TA贡献2051条经验 获得超10个赞

另一个可能对人有用的解决方案,因为没有一个文本选项适合我:

  1. .gitattributes一行替换内容:* binary。这告诉git将每个文件视为二进制文件,它无法执行任何操作。

  2. 检查违规文件的消息是否消失; 如果不是,你可以git checkout -- <files>将它们恢复到存储库版本

  3. git checkout -- .gitattributes.gitattributes文件恢复到其初始状态

  4. 检查文件是否仍未标记为已更改。


查看完整回答
反对 回复 2019-08-14
  • 3 回答
  • 0 关注
  • 1809 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信