似乎无法放弃Git中的更改


124

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

# 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
不会git checkout HEAD -- index.htm(从最后提交的状态检查出来,而不是从指数退房)的作品?
2009年

3
git checkout HEAD -- index.htm为我工作!
Ben Tideswell

Answers:


52

这困扰了我一段时间,几乎我签出的每个回购都有我无法放弃的更改。长话短说,我尝试了以上所有方法,但没有任何效果。这是我使事情恢复正常的操作(在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

7
在尝试了上述所有内容之后,这是唯一对我
Anders

谢谢!就像安德斯(Anders)所说的那样,该解决方案也对我有用。我用#autocrlf代替了autocrlf
David

37

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

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

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

* git版本1.9.3


35

git diff文件上显示哪些更改?在Windows上,我已经看到行尾出现问题,导致这样的问题。在这种情况下,看看是什么设置,你有git config core.autocrlfgit config core.safecrlf。这里有一些有关这些设置的文档

我要说的是,如果您要git svn用于与Subversion集成,请确保autocrlf已将其关闭。据我所知,它在此配置中已损坏,并且在使您checkout还原所有更改后,大多数工具都认为文件已更改。

如果您在哪里遇到问题git checkout,然后git status显示文件仍被修改,并且git diff文件在文件的每一行上都被修改,那么这就是您所看到的问题。

核心文件

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

核心安全

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


core.autocrlf = true尚未设置core.safecrlf。Windows是否应将其设置为true?两者有什么区别?

我要说的是,如果您使用的是git svn,请不要同时关闭它们。我添加了更多细节。
1800信息

4
我假设他的意思是至少旋转90度
vijrox

2
当我将core.autocrlf和core.safecrlf都设置为true时,我可以通过运行'git reset --hard HEAD'丢弃有问题的文件中检测到的更改。
Aleksey

19

我认为你需要通过 -f

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

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

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

git checkout -f master

7
将-f传递给什么?希望能使答案完整
PandaWood '16

@Matt我的目的不是要结帐其他分支。答案是从2009年开始的,所以我真的不记得了,但是从这个问题来看,我想我想传递-f给结帐– <filename>,就像git checkout -f -- filename
hasen

@hasen您需要澄清的三个评论,这就是为什么我添加“例如”的原因。该示例不排除其他使用-f
Matt H

为我工作。git checkout -f master扔了“已经在'主人'”,但更改不见了。
基督教徒

11

可能是行尾,如@ 1800信息所示,但另一种可能性是差异(这是防止您使用checkout命令还原这些文件)是文件模式之一。这就是我发生的事情。在我的git版本上,您可以使用

git diff index.htm

它将显示文件模式更改。即使使用-f选项,它仍然不允许您使用checkout还原它们。为此使用

git config core.filemode错误

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

[核心]

filemode = false

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

git reset HEAD index.htm

该文件应消失。

(我从如何使git忽略模式更改(chmod)update-file-permissions-only-in-git的答案中获得了所有这些信息)


6

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

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


2

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

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


1

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

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

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


1

我有同样的问题,以上评论均无济于事。事实证明,我的文件系统不区分大小写(默认为OSX,但Windows的行为可能相同),并且在同一目录中存在大小写不同的文件。由于在我的计算机上,两个名称都指向同一个文件,所以无论我做什么,git status始终显示出修改。解决问题:

  • 我不得不从另一台计算机上删除其中一个文件,然后将其推送到仓库

  • 完全删除整个本地版本

  • 从头开始做git clone


0

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

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

有效的解决方案:

  1. 进入安全模式
  2. 舍弃档案

重新启动是一个痛苦的过程,但是比尝试100件事更快。


0

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


0

我最后做了git stash一个git stash clean,然后删除了一些。在.git /或〜/ .git文件中没有看到任何自动cr / lf配置。


0

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

因此,我调用了该目录并在其中运行了git status。它处于HEAD分离状态。然后我就git checkout master在那里跑了 那对我来说是正确的。但这对于此处要求的确切情况没有帮助。


0

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

git status update

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


0

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


0

我的.gitattributes具有以下内容:

* text=auto eol=lf

要解决此问题,请编辑.gitattributes以删除该行,以放松行尾。然后git reset --hard HEAD还原文件和.gitattributes文件。


0

对我来说,这个问题涉及下载Git-LFS图像的组合,该图像是通过Netlify CMS上传的,并且由其Netlify Large Media处理程序提供不同的服务。

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

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

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

希望这可以帮助同伴。


-1

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

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

希望它也能帮助其他人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.