似乎不能丢弃 Git 中的更改

在命令行中看到以下内容后:

# 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 状态时,它看起来完全一样。收银台好像坏了。我做错什么了吗?我在 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
88499 次浏览

git diff在文件上显示了什么变化?在窗口上,我见过行结尾的问题导致这样的问题。在这种情况下,看看您对 git config core.autocrlfgit config core.safecrlf有什么设置。有一些 有关这些设置的文档请参阅此处

我想说的是,如果您正在使用 git svn来集成 subversion,那么请确保关闭 autocrlf。据我所知,它只是在这个配置中被破坏了,当您执行 checkout恢复任何更改时,它使得大多数工具认为文件已经被更改。

如果您看到执行 git checkout时出现问题,然后 git status显示文件仍然被修改,而 git diff显示文件在文件中的每一行都被修改,那么这就是您正在看到的问题。

Coreautocrlf

如果为 true,则使 git 将文本文件中行尾的 CRLF 转换为 LF 当从文件系统读取时,和 在写入到 变量可以设置为 输入,在这种情况下,转换 只有在读取 文件系统,但文件被写出 与低频在行的结束。 当前,需要考虑哪些路径 「文本」(即受《税务条例》 Autocrlf 机制)是纯粹决定的 根据内容。

Core Safecrlf

如果为 true,则使 git 检查是否按照 Core.autocrlf 是可逆的 Git 会的 验证命令是否在 工作树 间接地。例如,提交一个 文件,然后签出相同的 文件中的原始文件 工作树。如果不是这样的话 目前的设置 Core.autocrlf,git 将拒绝 变量可以设置为 “警告”,在这种情况下,git 只会 警告不可逆转的转换 但要继续行动。 ...

我认为你需要通过 -f

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

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

例如,放弃当前分支上的更改并切换到另一个分支:

git checkout -f master

如@1800信息所示,它可能是行结束符,但另一种可能性是文件模式的差异(这阻止您使用 checkout 命令恢复这些文件)。这就是发生在我身上的事。在我的 git 版本中,您可以通过使用

Git diff index.htm

它将显示文件模式的更改。但它仍然不允许您使用 checkout 恢复它们,即使使用-f 选项也是如此。也不是为了那个目的

Git config core.filemode false

或者在文本编辑器中通过添加

[核心]

filemode = false

这样做之后,你可以使用

Git 复位头索引

文件就会消失。

(我从 如何使 git 忽略模式更改(chmod) ?更新-文件-权限-仅在-git 中的答案中得到了所有这些)

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

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

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

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

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

* git version 1.9.3

我也遇到过类似的问题,它不允许我丢弃不存在或已经更改的文件。我在工作中使用 VisualStudio,我发现当应用程序运行时切换分支时会发生这种情况。

git checkout和试图丢弃没有帮助。它不会工作,否则它只会告诉我,我没有得到许可。

有效的解决方案:

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

重新开始是一件痛苦的事情,但是这比尝试100种方法更有效。

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

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

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

这已经困扰我一段时间了,几乎每一个回购,我会检查有变化,我不能丢弃。长话短说,我试了以上所有的方法,都没用。这就是我为了让一切回归正常所做的(在 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

我最后做了一个 git stash,然后是 git stash clean,去掉了一些。中没有看到任何自动 cr/lf 配置。Git/或 ~/。废物。

在我的例子中,我不能丢弃与目录相关的更改。例如,当我运行 git diff 时,我会看到: - 子项目提交 fdcccccccccccccccccccccccccccccccccccccccccccccccccccccc + 子项目提交 f1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

所以我调用了那个目录,在里面运行了一个 git 状态。它处于头部分离状态。然后我在里面做了 git checkout master测试。让我的生活回归正轨。但是对于这里要求的确切场景来说,这是没有帮助的。

我也遇到过类似的问题,下面的步骤帮助我解决了这个问题:

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

希望也能帮到其他人。

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

git status update

应该帮助解决问题(在这个特殊情况下)

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

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

然后你可以删除 TRASH分支,如果你想的话。

我在 Windows 中遇到了权限问题,必须执行 icacls containingFolder /reset /t /l /c操作,然后双击文件夹才能拿回我的权限。

我也遇到了同样的问题,上面的评论都不起作用。事实证明,我的文件系统不区分大小写(osx 缺省值,但 windows 的行为可能相同) ,并且在同一个目录中有一个大小写文件,其中包含不同的内容。因为在我的计算机上,两个名字指向同一个文件,git 状态总是显示一个修改,无论我做什么。为了解决这个问题:

  • 我不得不从另一台电脑上删除其中一个文件,然后把它推到回收站

  • 完全删除整个本地版本

  • 从零开始做 git 克隆

我的. gittribute 包含以下内容:

* text=auto eol=lf

为了克服这个问题,编辑 .gitattributes删除这一行放松行尾。然后 git reset --hard HEAD恢复文件和 .gitattributes文件。

对我来说,这个问题提出了一个组合下载的 git-LFS 图像,这是通过 Netlify 内容管理系统上传,由他们的 Netlify 大型媒体处理程序提供不同的服务。

我的解决方案是从 ~/.gitconfig中注释掉/删除这些行,使它们看起来像下面这样,然后再次检查 git status

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

或者,您可以通过在回购根目录中的 .gitconfig添加一个更本地的过滤器,并以某种方式覆盖 lfs 的过滤器规则。

希望这对你有帮助。

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

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

在我的例子中,问题是在我的 ~/.gitconfig中有一个全局 ~/.gitattributes文件。当我最终检查该文件时,我能够找到有问题的扩展名并手动修正它。

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

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

原来,我得到的问题是,在那里,我添加了 * text eol=lf.gitattibutes文件,并提交了它的回购没有转换 CRLF 到 LF 在所有现有的文件。因此,这些文件显示为修改,甚至在另一个新的克隆的回购。有点奇怪的是,git status报告的文件是 修改过的,即使它们在 git 工作目录和舞台区域都有相同的 CRLF。在我看来,修改过的意味着如果添加并提交了文件,那么基于当前配置将会有一些非空的更改。

因此,我 git add所有的文件并提交它们(确认提交包括 CRLF-> LF 的转换) ,并且不再获得修改后的文件报告。

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

在我的例子中,我的文件扩展名是 .txt,所以我添加了

*.txt       eol=crlf

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