问题
After seeing the following from the command line:
# 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
I am trying to discard my changes by typing the command:
git checkout -- index.htm
but when I re-run git status, it looks exactly the same. The checkout doesn\'t seem to be working. Am I doing something wrong? I am using GIT 1.6.1.2 on windows/cygwin.
# 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:
This has been bothering me for a while, almost every repo I'd check out had changes that I couldn't discard. Long story short, I tried all of the above, nothing worked. This is what I did to get things back to normal (on a 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
回答2:
Here is my experience, set following variables in .git/config
:
[core]
autocrlf = false
safecrlf = false
eol = crlf
then run $ git checkout HEAD .
, and it works. but $ git checkout -- .
not, strange!
* git version 1.9.3
回答3:
What changes does git diff
show on the file? On windows, I've seen issues with line-endings causing issues like this. In that case, look at what settings you have for git config core.autocrlf
and git config core.safecrlf
. There is some documentation for these settings here.
I would say, if you are using git svn
for integration with subversion, then do make sure autocrlf
is turned off. From what I can tell it is just broken in this configuration and it makes most of the tools think files have been changed, when you have done a checkout
to revert any changes.
If you are seeing a problem where you do git checkout
, and then git status
shows the file is still modified, and git diff
shows the file is modified on every line in the file, then this is the problem you are seeing.
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. ...
回答4:
I think you need to pass -f
From the man page (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.
For instance, discard changes on the current branch and switch to a different branch:
git checkout -f master
回答5:
It might be line endings, as @1800-information suggests, but another possibility is that the difference (that's preventing your from reverting these files with a checkout command) is one of file mode. This is what happened to me. On my version of git you can discover this by using
git diff index.htm
And it will show you file mode changes. It still won't let you revert them, though, using checkout, even with the -f option. For that use either
git config core.filemode false
or change your git .config in your text editor by adding
[core]
filemode = false
After you do this, you can use
git reset HEAD index.htm
and the file should disappear.
(I got all of this from the answers to How do I make git ignore mode changes (chmod)? and updating-file-permissions-only-in-git)
回答6:
Are you on OSX or Windows? If so, the problem probably is having two files of the same name, with different case. eg. index.htm and Index.htm
Windows, and by default OSX, uses a case insensitive file system, which conflicts with the case sensitive git.
回答7:
I had this issue and after trying all of the above, nothing worked.
What worked for me was to delete the directory that the file was in, then did git status
and made sure that all the files in that dir are now marked as deleted. After that I simply did git checkout -f
and everything was back to normal.
回答8:
I was working on a libGDX
project on Android Studio
and I wanted to discard all the changes that I have done, and nothing was working for me, the solution I came up with was to commit all the changes into a new branch
git checkout -b TRASH
git add .
git commit -m "discarded changes"
git checkout master
and then you can delete the TRASH
branch if you want.
回答9:
I've had a similar issue, where it wouldn't allow me to discard files which either does not exist or has been changed. I use Visual Studio at work, and I found that this happens when switching branches while the app is running.
git checkout
and trying to discard did not help. It wouldn't work or it would just tell me that I do not have permission.
Solution that worked:
- Go into Safe Mode
- Discard files
Restarting is a pain, but this worked faster than trying out 100 things.
回答10:
There is a easy solution. If this happens (normally from unexpected windows shutdown or memory dump) and you cannot discard your changes and even switch between branches (Git says you don't have enough permission); in Windows
environment show all hidden files and folders
from folder options. Go to your GIT directory (should be start with .git
) and delete the "index.lock"
file. Then Git should let you do whatever you want to do.
回答11:
I ended up doing a git stash
followed by a git stash clean
to get rid of some. Didn't see any auto cr/lf configurations in .git/ or ~/.git stuff.
回答12:
In my case I could not discard changes related to a directory. e.g. when I ran a git diff I would see this:
-Subproject commit fdcccccccccccccccccccccccccccccccccccccc
+Subproject commit f1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
So I called that directory and ran a git status in there. It was in a HEAD detached state. And then I just ran a git checkout master
in there. That set things right for me. But this is not helpful for the exact scenario asked in here.
回答13:
I also faced somewhat similar problem and the following steps helped me out:
git commit -am 'temp commit'
git pull origin master
git reset head~1
git reset head --hard
Hope it helps other people as well.
回答14:
This is an old question, but was still relevant to me. I did not find my answer until asking around the office, and discovered that the problem was with submodules. When they are updated, and your own repository does not reflect those changes, it shows up as having differences, reseting the head doesn't help. If this is the case, run:
git status update
That should help fix things (in this particular case)
回答15:
I had a permissions problem in Windows and had to do icacls containingFolder /reset /t /l /c
and then double-click the folder to get my permissions back.
回答16:
I had the same problem, nothing from the above comments worked. It turned out, that my filesystem is not case sensitive (osx default, but windows probably behaves the same) and a file was present with both uppercase and lowercase in the same directory, with different content. Since on my computer both names pointed at the same file, git status always showed a modification, no matter what I did. To resolve the problem:
I had to remove one of the files from another computer and push it to repo
delete the whole local version completely
do git clone from scratch
来源:https://stackoverflow.com/questions/1575682/cant-seem-to-discard-changes-in-git