似乎无法放弃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 

git diff会在文件上显示哪些变化? 在Windows上,我看到了线结束的问题,导致这样的问题。 在这种情况下,看看你有什么设置你的git config core.autocrlfgit config core.safecrlf 。 这里有一些关于这些设置的文档 。

我会说,如果你正在使用git svn与颠覆集成,那么确保autocrlfclosures。 从我可以告诉它只是在这个configuration中被破坏,并且它使得大多数工具认为文件已经被改变,当你已经完成检出来恢复任何改变。

如果你看到一个问题,你做git checkout ,然后git status显示该文件仍然被修改,和git diff显示该文件中的每一行修改文件,那么这是你所看到的问题。

core.autocrlf

如果为true,则在从文件系统中读取文件时,将文本文件中的行尾的CRLF转换为LF,并在写入文件系统时将其转换为反向。 variables可以被设置为input,在这种情况下,转换只发生在从文件系统读取时发生,而文件在行尾被LF写出。 目前,要考虑“文本”(即受到autocrlf机制)的path是纯粹基于内容决定的。

core.safecrlf

如果为true,则使git检查是否可转换由core.autocrlf控制的转换CRLF。 Git会validation命令是直接还是间接地修改工作树中的文件。 例如,提交文件,然后检出相同的文件,应该在工作树中生成原始文件。 如果core.autocrlf的当前设置不是这种情况,那么git会拒绝这个文件。 variables可以设置为“警告”,在这种情况下,git只会警告不可逆的转换,但继续操作。 …

这是我的经验,在.git/config设置以下variables:

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

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

* git版本1.9.3

这一直困扰着我一段时间,几乎每一个我检查的回购有变化,我不能丢弃。 长话短说,我尝试了以上所有,没有任何工作。 这是我做了什么让事情恢复正常(在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 

这可能是行结尾,因为@ 1800信息表明,但另一种可能性是差异(这是阻止你用恢复命令恢复这些文件)是文件模式之一。 这是发生在我身上的事情。 在我的版本的git上,你可以通过使用来发现这个

git diff index.htm

它会显示你的文件模式的变化。 它仍然不会让你恢复他们,虽然,使用结帐,即使使用-f选项。 为了那个用途

git config core.filemode false

或者通过添加在你的文本编辑器中改变你的git .config

[核心]

 filemode = false 

做完这个之后,你可以使用

git reset HEAD index.htm

该文件应该消失。

(我从这些答案中得到了所有这些如何使git忽略模式更改(chmod)?和更新 -file -permissions-only-git )

我想你需要传递-f

从man page( man git-checkout ,GIT-CHECKOUT(1)):

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

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

 git checkout -f master 

你在OSX或Windows? 如果是这样,问题可能是有两个同名的文件,不同的情况。 例如。 index.htm和Index.htm

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

我有这个问题,尝试所有上述后,没有任何工作。

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

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

git checkout并试图放弃没有帮助。 它不会工作,或者只是告诉我,我没有权限。

解决scheme,工作:

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

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

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

我结束了做一个git stash然后一个git stash clean ,摆脱一些。 没有看到.git /或〜/ .git东西中的任何自动cr / lfconfiguration。

在我的情况下,我不能放弃有关目录的变化。 例如,当我运行一个git diff时,我会看到: -Subproject commit fdcccccccccccccccccccccccccccccccccccccc +Subproject commit f1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

所以我打电话给那个目录,在那里运行一个git状态。 这是在一个HEAD分离状态。 然后,我只是在那里运行一个git checkout master 。 这使事情适合我。 但是这对于这里提到的确切场景没有帮助。

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

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

希望它也能帮助其他人。

这是一个古老的问题,但仍然与我有关。 直到询问办公室时,我才find答案,发现问题出在子模块上。 当他们更新,而你自己的仓库不反映这些变化,它显示为有差异,重新设置头没有帮助。 如果是这种情况,请运行:

 git status update 

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