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 |
根据我的经验,在
1 2 3 4 | [core] autocrlf = false safecrlf = false eol = crlf |
然后运行
* git版本1.9.3
我会说,如果您使用
如果您发现
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, --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冲突。
我有这个问题,在尝试了以上所有之后,没有任何效果。
对我有用的是删除文件所在的目录,然后执行
我正在研究
1 2 3 4 | git checkout -b TRASH git add . git commit -m"discarded changes" git checkout master |
然后你可以删除
我在Windows中遇到了权限问题,必须执行
这是一个老问题,但仍然与我有关。在办公室周围询问之前我没有找到答案,发现问题出在子模块上。当它们被更新,并且您自己的存储库没有反映这些更改时,它会显示出有差异,重置头部无济于事。如果是这种情况,请运行:
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分离状态。然后我就在那里跑了一个
我最后做了一个
有一个简单的解决方案。如果发生这种情况(通常来自意外的Windows关闭或内存转储)并且您无法丢弃更改甚至在分支之间切换(Git表示您没有足够的权限);在
我有一个类似的问题,它不允许我丢弃不存在或已被更改的文件。我在工作中使用Visual Studio,我发现在应用程序运行时切换分支时会发生这种情况。
有效的解决方案:
重启很痛苦,但这比尝试100件事要快。