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

rbe*_*amy 213 git revert working-copy git-status

我想删除对我的工作副本的所有更改.
运行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.cs

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 `git ls-files -m`

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 reset --hard HEAD
HEAD is now at 6c857e7 boo libraries updated to 2.0.9.2 and rhino.dsl.dll updated.

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")
Run Code Online (Sandbox Code Playgroud)

Ria*_*son 204

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

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

git rm --cached -r .
git reset --hard
Run Code Online (Sandbox Code Playgroud)

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

  • 我已经尝试过这个和其他问题的多个建议.这是唯一对我有用的修复方法.我没有属性文件,我已经开始使用core.autocrlf为false. (8认同)
  • 改变`core.autocrlf`之后的另一个成功没有任何影响. (7认同)
  • 即使使用`core.autocrlf false`在Windows上出现此问题.没有别的办法,这个答案有效. (7认同)
  • 这不适合我.所以,我通过创建一个新的分支来做更加丑陋的方式来实现这些变化,因为它们对我来说毫无用处.[java] git checkout -b a-branch-to-commit-bad-crlf-files [/ java] [java] git commit -am"提交坏crlf文件"[/ java] (4认同)
  • 有时像这样的问题让我真的很想念SVN. (3认同)
  • 注意句号“。” 在__ git rm --cached -r .__结尾 (2认同)

Ikk*_*kke 125

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

行结束规范化

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

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

git config --global core.autocrlf false
Run Code Online (Sandbox Code Playgroud)

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

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

git 联机帮助说:

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

不区分大小写的文件系统

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

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

  • 好的......这样做了......现在git status显示没有变化.我已经阅读了autocrlf设置,我似乎无法做到正确. (8认同)
  • 解决区分大小写问题的一个更明智的解决方案是**不要在您的存储库中包含多个名称仅因大小写不同而不同的文件夹**。 (3认同)
  • 要查找仅由字母大小写不同的文件名,可以运行`git ls-tree -r --name-only HEAD | tr AZ az | 排序| uniq -d`.要列出此类文件的大写和小写名称,请运行`git ls-tree -r --name-only HEAD | fgrep -i -f <(git ls-tree -r --name-only HEAD | tr AZ az | sort | uniq -d)| sort -i` (3认同)

zeb*_*h49 98

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

  1. .gitattributes一行替换内容:* binary.这告诉git将每个文件视为二进制文件,它无法执行任何操作.
  2. 检查违规文件的消息是否消失; 如果不是,你可以git checkout -- <files>将它们恢复到存储库版本
  3. git checkout -- .gitattributes.gitattributes文件恢复到其初始状态
  4. 检查文件是否仍未标记为已更改.

  • 在最终找到成功之前我尝试过很多东西.谢谢! (3认同)
  • 花了几个小时处理这个,这个解决方案终于为我工作了! (3认同)

Mar*_*eal 69

对于遇到此问题的未来人员:更改文件模式也可能具有相同的症状. git config core.filemode false会解决它.

  • 执行此操作后,您可能需要执行`git checkout .` (3认同)
  • 为了将来参考:要知道这是否是您需要的修复(而不是其他答案中的其他修复),请使用`git diff`,它将显示模式更改的文件,如"旧模式100755 /新模式100644". (3认同)
  • 为我工作而无需再次结账 (2认同)

Ric*_*tte 31

这让我很疯狂,特别是如果没有网上找到的任何解决方案,我无法解决这个问题.这是我如何解决它.不能拿这里的学分,因为这是同事的工作:)

问题的根源:我最初安装的git没有在Windows上进行自动换行.这导致我初始提交GLFW没有正确的行结束.

注意:这只是本地解决方案.克隆回购的下一个人仍然会遇到这个问题.可以在此处找到永久解决方案:https: //help.github.com/articles/dealing-with-line-endings/#re-normalizing-a-repository.

设置:Xubuntu 12.04 Git仓库与glfw项目

问题:无法重置glfw文件.无论我尝试什么,它们总是显示为经过修改.

解决了:

edit .gitattributes

Comment out the line:    # text=auto

Save the file

restore .gitattributes:   git checkout .gitattributes
Run Code Online (Sandbox Code Playgroud)


moo*_*moo 11

我有一个.bat文件有同样的问题(无法在未跟踪的文件中删除它).git checkout - 没有用,也没有在这个页面上的任何建议.唯一对我有用的是做:

git stash save --keep-index
Run Code Online (Sandbox Code Playgroud)

然后删除存储:

git stash drop
Run Code Online (Sandbox Code Playgroud)


小智 7

两次得到同样的问题!两次隐藏我做的一些改变,然后试图弹回它们.因为我有大量的文件被更改,所以无法弹出更改 - 但它们不是!它们完全一样.

我现在认为我已经尝试了上述所有解决方案而没有成功.试过后

git rm --cached -r .
git reset --hard
Run Code Online (Sandbox Code Playgroud)

我现在几乎修改了我的存储库中的所有文件.

在对文件进行差异化时,它说我删除了所有行,然后再次添加它们.

有点令人不安.我现在将避免将来藏匿..

唯一的解决方案是克隆一个新的存储库并重新开始.(最后一次)


nsg*_*nsg 6

尝试做一个

git 结帐 -f

这应该清除当前工作本地存储库中的所有更改


der*_*ekg 5

通常情况下,在GIT清除所有的修改和新文件将下列命令应该工作非常漂亮(是小心,这将删除所有的新文件+您可以创建文件夹和将所有修改过的文件恢复到您的状态电流提交):

$ git clean --force -d
$ git checkout -- .
Run Code Online (Sandbox Code Playgroud)

也许有时更好的选择是使用可选消息执行“git stash push”,如下所示:

$ git stash push -m "not sure if i will need this later"
Run Code Online (Sandbox Code Playgroud)

这也将清除您所有的新文件和修改过的文件,但如果您想恢复它们,您将把它们全部藏起来。GIT 中的存储会从一个分支转移到另一个分支,因此您可以根据需要在不同的分支中恢复它们。

作为旁注,如果您已经暂存了一些新添加的文件并想要删除它们,这应该可以解决问题:

$ git reset --hard
Run Code Online (Sandbox Code Playgroud)

如果以上所有内容对您都不起作用,请阅读下面对我有用的内容:

我之前遇到过这个问题几次。我目前正在我雇主提供的 Windows 10 机器上进行开发。今天,这种特殊的 git 行为是由我从我的“开发”分支创建一个新分支引起的。出于某种原因,在我切换回“开发”分支后,一些看似随机的文件仍然存在,并在“git status”中显示为“已修改”。

此外,那时我无法签出另一个分支,所以我被困在我的“开发”分支上。

这就是我所做的:

$ git log
Run Code Online (Sandbox Code Playgroud)

我注意到我今天早些时候从“develop”创建的新分支显示在第一个“commit”消息中,在末尾引用“HEAD -> develop, origin/develop, origin/HEAD, The-branch-i-created -今天早些时候”。

由于我真的不需要它,我删除了它:

$ git branch -d The-branch-i-created-earlier-today
Run Code Online (Sandbox Code Playgroud)

更改后的文件仍然出现,所以我做了:

$ git stash
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题:

$ git status
On branch develop
Your branch is up to date with 'origin/develop'.

nothing to commit, working tree clean
Run Code Online (Sandbox Code Playgroud)

当然$ git stash list会显示隐藏的更改,并且由于我很少并且不需要任何隐藏,因此我$ git stash clear删除了所有隐藏。

注意:我还没有尝试过在我之前有人建议这样做:

$ git rm --cached -r .
$ git reset --hard
Run Code Online (Sandbox Code Playgroud)

这可能也有效,下次遇到这个问题时我一定会尝试。