关于还原:似乎无法放弃Git中的更改

Can't seem to discard changes in Git

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

1
2
3
4
5
6
# 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

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

1
git checkout -- index.htm

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

1
2
3
4
5
6
# 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


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

1
2
3
4
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/config中设置以下变量:

1
2
3
4
[core]
    autocrlf = false
    safecrlf = false
    eol = crlf

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

* git版本1.9.3


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

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

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

core.autocrlf

If true, makes git convert CRLF at the end of lines in text files to LF
when reading from the filesystem, and
convert in reverse when writing to the
filesystem. The variable can be set to
input, in which case the conversion
happens only while reading from the
filesystem but files are written out
with LF at the end of lines.
Currently, which paths to consider
"text" (i.e. be subjected to the
autocrlf mechanism) is decided purely
based on the contents.

core.safecrlf

If true, makes git check if converting CRLF as controlled by
core.autocrlf is reversible. Git will
verify if a command modifies a file in
the work tree either directly or
indirectly. For example, committing a
file followed by checking out the same
file should yield the original file in
the work tree. If this is not the case
for the current setting of
core.autocrlf, git will reject the
file. The variable can be set to
"warn", in which case git will only
warn about an irreversible conversion
but continue the operation.
...


我想你需要传递-f

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

-f, --force
Proceed even if the index or the working tree differs from HEAD.
This is used to throw away local changes.

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

1
git checkout -f master


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

git diff index.htm

它会显示文件模式的变化。但是,即使使用-f选项,它仍然不会让你使用checkout来还原它们。对于那个用途

git config core.filemode false

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

[core]

1
filemode = false

执行此操作后,您可以使用

git reset HEAD index.htm

并且文件应该消失。

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


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

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


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

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


我正在研究Android Studio上的libGDX项目,我想放弃我所做的所有更改,没有任何对我有用,我提出的解决方案是将所有更改提交到新分支

1
2
3
4
git checkout -b TRASH
git add .
git commit -m"discarded changes"
git checkout master

然后你可以删除TRASH分支。


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


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

1
git status update

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


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

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

希望它也能帮助其他人。


在我的情况下,我无法丢弃与目录相关的更改。例如当我运行git diff时,我会看到:

-Subproject commit fdcccccccccccccccccccccccccccccccccccccc
+Subproject commit f1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

所以我调用了那个目录并在那里运行了一个git状态。它处于HEAD分离状态。然后我就在那里跑了一个git checkout master。这对我来说是正确的。但是这对于这里提到的确切场景没有帮助。


我最后做了一个git stash,接着是一个git stash clean来摆脱一些。没有在.git /或?/ .git中看到任何自动cr / lf配置。


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


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

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

有效的解决方案:

  • 进入安全模式
  • 丢弃文件
  • 重启很痛苦,但这比尝试100件事要快。