141

从命令行看到以下内容后:

# On branch RB_3.0.10
# 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:   index.htm

我试图通过键入以下命令来放弃我的更改:

git checkout -- index.htm

但是当我重新运行 git status 时,它看起来完全一样。结帐似乎不起作用。难道我做错了什么?我在 windows/cygwin 上使用 GIT 1.6.1.2。

# On branch RB_3.0.10
# 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:   index.htm
4

23 回答 23

73

这一直困扰着我一段时间,我检查的几乎每个 repo 都有我无法丢弃的更改。长话短说,我尝试了以上所有方法,但没有任何效果。这就是我为使事情恢复正常所做的(在 Mac 上):

Completely remove the autocrlf & safecrlf settings from ~/.gitconfig
Completely remove the autocrlf & safecrlf settings from your repo's local config ./.git/config
git rm --cached -r .
git reset --hard
于 2016-09-28T09:26:38.843 回答
44

这是我的经验,在中设置以下变量.git/config

[core]
    autocrlf = false
    safecrlf = false
    eol = crlf

然后运行$ git checkout HEAD .,它可以工作。但$ git checkout -- .不是,奇怪!

* git 版本 1.9.3

于 2014-08-15T05:35:38.587 回答
36

文件上显示了哪些更改git diff?在 Windows 上,我看到了导致此类问题的行尾问题。在这种情况下,请查看您对git config core.autocrlf和的设置git config core.safecrlf这里有这些设置的一些文档。

我会说,如果您正在使用git svn与 subversion 集成,那么请确保autocrlf已关闭。据我所知,它只是在此配置中损坏了,并且当您执行 acheckout以还原任何更改时,它使大多数工具认为文件已更改。

如果您在执行操作时发现问题git checkout,然后git status显示文件仍在修改,并且git diff在文件的每一行都显示文件已修改,那么这就是您看到的问题。

核心.autocrlf

如果为 true,则在从文件系统读取时,让 git 将文本文件行尾的 CRLF 转换为 LF,并在写入文件系统时反向转换。该变量可以设置为输入,在这种情况下,转换仅在从文件系统读取时发生,但文件在行尾用 LF 写出。目前,考虑“文本”的路径(即服从autocrlf机制)纯粹基于内容来决定。

核心.safecrlf

如果为 true,则让 git 检查转换由 core.autocrlf 控制的 CRLF 是否可逆。Git 将验证命令是否直接或间接修改了工作树中的文件。例如,提交一个文件然后签出同一个文件应该会在工作树中产生原始文件。如果 core.autocrlf 的当前设置不是这种情况,git 将拒绝该文件。该变量可以设置为“警告”,在这种情况下,git 只会警告不可逆的转换,但会继续操作。...

于 2009-10-15T23:47:27.510 回答
24

我认为你需要通过-f

从手册页(man git-checkout,GIT-CHECKOUT(1)):

-f, --force
即使索引或工作树与 HEAD 不同也继续。
这用于丢弃本地更改

例如,丢弃当前分支上的更改并切换到不同的分支:

git checkout -f master
于 2009-10-19T02:14:34.430 回答
14

正如@1800-information 所暗示的那样,它可能是行尾,但另一种可能性是差异(阻止您使用 checkout 命令恢复这些文件)是文件模式之一。这就是发生在我身上的事情。在我的 git 版本上,您可以使用

git diff index.htm

它会向您显示文件模式更改。但是,即使使用 -f 选项,它仍然不会让您使用 checkout 还原它们。为此使用

git config core.filemode false

或通过添加更改您的文本编辑器中的 git .config

[核]

filemode = false

完成此操作后,您可以使用

git 重置头索引.htm

并且文件应该消失。

(我从How do I make git ignore mode changes (chmod)?updates-file-permissions-only-in-git的答案中得到了所有这些)

于 2012-06-13T15:42:48.223 回答
6

你在 OSX 还是 Windows 上?如果是这样,问题可能是有两个同名的文件,但大小写不同。例如。index.htm 和 Index.htm

Windows 和默认情况下 OSX 使用不区分大小写的文件系统,这与区分大小写的 git 冲突。

于 2014-07-02T07:42:13.233 回答
3

我遇到了这个问题,在尝试了以上所有方法之后,没有任何效果。

对我有用的是删除文件所在的目录,然后git status确保该目录中的所有文件现在都标记为已删除。在那之后,我只是做了git checkout -f,一切都恢复了正常。

于 2016-06-15T18:45:47.200 回答
2

我的问题在这里有点相似,我刚刚发现 git 正在跟踪文件权限的更改。我尝试丢弃并重置分支,但文件仍然存在。运行git config --get --local core.filemode,如果为真,则需要将其设置为假以关闭文件权限跟踪。跑步git config --local core.fileMode false应该可以解决。你可以在这里阅读更多

于 2020-08-28T08:10:27.743 回答
2

我遇到了同样的问题,上面的评论没有任何效果。事实证明,我的文件系统不区分大小写(osx 默认,但 windows 的行为可能相同),并且在同一目录中存在大写和小写的文件,具有不同的内容。由于在我的计算机上,两个名称都指向同一个文件,无论我做什么, git status 总是显示修改。要解决问题:

  • 我不得不从另一台计算机上删除其中一个文件并将其推送到 repo

  • 完全删除整个本地版本

  • 从头开始做 git clone

于 2019-09-30T10:54:10.007 回答
1

我的 .gitattributes 具有以下内容:

* text=auto eol=lf

要解决此问题,请编辑.gitattributes以删除放松行尾的这一行。然后git reset --hard HEAD恢复文件和.gitattributes文件。

于 2020-06-09T19:43:46.407 回答
0

遇到同样的问题,我有core.autocrlf=false配置。

事实证明,我遇到的问题是我添加* text eol=lf.gitattibutes文件中,并将其提交到 repo,而没有在所有现有文件中将 CRLF 转换为 LF。因此,即使在 repo 的另一个新克隆中,这些文件也会显示为已修改。git status报告文件被修改有点奇怪,即使它们在 git 工作目录和阶段区域中具有相同的 CRLF。在我看来,修改意味着如果文件被添加并提交,将基于当前配置进行一些非空更改。

于是我把git add所有的文件都提交了(确认提交包括CRLF->LF的转换),再也没有得到修改文件的报告。

于 2021-01-09T03:56:18.290 回答
0

我有一个类似的问题,它不允许我丢弃不存在或已更改的文件。我在工作中使用 Visual Studio,我发现在应用程序运行时切换分支时会发生这种情况。

git checkout并试图丢弃没有帮助。它不起作用,或者它只会告诉我我没有得到许可。

有效的解决方案:

  1. 进入安全模式
  2. 丢弃文件

重新启动很痛苦,但这比尝试 100 件事情要快。

于 2015-10-14T19:26:23.547 回答
0

其中许多答案解决了许多问题之一的问题。因此,您可能必须尝试一些,直到找到问题所在。所以,我会把我自己的经验加入其中。

就我而言,问题是~/.gitattributes我的~/.gitconfig. 当我最终检查该文件时,我能够找到有问题的扩展名并手动纠正它。

特别是对于我正在处理的有问题的 repo,*.bat需要 be-text eol=crlf而不是text eol=crlf.

于 2020-09-28T16:58:16.373 回答
0

我最终做了 agit stash后跟 agit stash clean来摆脱一些。在 .git/ 或 ~/.git 中没有看到任何自动 cr/lf 配置。

于 2017-07-20T15:36:30.430 回答
0

有一个简单的解决方案。如果发生这种情况(通常来自意外的 Windows 关闭或内存转储)并且您无法丢弃更改甚至在分支之间切换(Git 说您没有足够的权限);在文件夹选项的Windows环境中。show all hidden files and folders转到您的 GIT 目录(应以 开头.git)并删除该"index.lock"文件。那么Git应该让你做任何你想做的事。

于 2015-12-27T08:55:47.647 回答
0

我正在做一个libGDX项目Android Studio,我想放弃我所做的所有更改,但没有什么对我有用,我想出的解决方案是将所有更改提交到一个新分支

git checkout -b TRASH
git add .
git commit -m "discarded changes"
git checkout master

然后您可以根据TRASH需要删除分支。

于 2018-06-02T11:18:56.977 回答
0

对我来说,这个问题是通过下载通过 Netlify CMS 上传并由他们的 Netlify 大型媒体处理程序提供不同服务的 Git-LFS 图像组合起来的。

我的解决方案是从我的注释中删除/删除这些行,~/.gitconfig使它们如下所示,然后git status再次检查。

# [filter "lfs"]
#   clean = git-lfs clean %f
#   smudge = git-lfs smudge %f
#   required = true

或者,您可以通过 a.gitconfig在 repo 根目录中添加更多本地过滤器,并以某种方式覆盖那里的 lfs 过滤器规则。

希望这可以帮助一个人。

于 2020-06-15T18:55:25.000 回答
0

有时在Windows文件中正在被另一个程序使用,所以 git 不能用它做任何事情。首先,您必须关闭 Visual Studio 或任何打开文件以执行或写入的程序。

于 2022-01-19T17:13:58.910 回答
0

就我而言,我无法丢弃与目录相关的更改。例如,当我运行 git diff 时,我会看到: -Subproject commit fdcccccccccccccccccccccccccccccccccccccc +Subproject commit f1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

所以我调用了那个目录并在那里运行了一个 git status 。它处于 HEAD 分离状态。然后我就跑git checkout master进去了。这对我来说是正确的。但这对于此处询问的确切情况没有帮助。

于 2017-09-18T21:16:22.993 回答
0

我在 Windows 中遇到了权限问题,必须这样做icacls containingFolder /reset /t /l /c,然后双击该文件夹以取回我的权限。

于 2019-05-08T23:58:12.500 回答
0

这是一个老问题,但仍然与我有关。直到在办公室四处询问才找到答案,发现问题出在子模块上。当它们被更新并且您自己的存储库没有反映这些更改时,它会显示为存在差异,重置头部没有帮助。如果是这种情况,请运行:

git status update

应该有助于解决问题(在这种特殊情况下)

于 2017-10-31T20:20:18.030 回答
0

就我而言,我的文件扩展名是.txt,所以我添加了

*.txt       eol=crlf

在 .gitattributes 文件中为我解决了这个问题。

于 2022-03-01T07:57:22.470 回答
-1

我也遇到了一些类似的问题,以下步骤帮助了我:

git commit -am 'temp commit'
git pull origin master
git reset head~1
git reset head --hard

希望它也可以帮助其他人。

于 2017-10-05T10:56:56.730 回答