似乎无法放弃Git的变化

时间:2009-10-15 23:34:23

标签: git revert

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

# 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

21 个答案:

答案 0 :(得分:35)

根据我的经验,在.git/config中设置以下变量:

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

然后运行$ git checkout HEAD .,它就可以了。但是$ git checkout -- .没有,奇怪!

* git version 1.9.3

答案 1 :(得分:34)

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

git diff对文件有什么变化?在Windows上,我看到了行尾的问题导致了这样的问题。在这种情况下,请查看git config core.autocrlfgit config core.safecrlf的设置。有一些documentation for these settings here

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

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

  

core.autocrlf

     

如果为true,则使git将文本文件中行尾的CRLF转换为LF   从文件系统中读取时,和   写入时反向转换   文件系统。变量可以设置为   输入,在这种情况下转换   只有在阅读时才会发生   文件系统,但文件被写出来   在行尾用LF。   目前,要考虑哪些路径   “文本”(即受到   autocrlf机制)纯粹是决定性的   根据内容。

     

core.safecrlf

     

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

答案 3 :(得分:12)

我认为你需要通过-f

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

  

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

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

git checkout -f master

答案 4 :(得分:9)

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

发现这一点
  

git diff index.htm

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

  

git config core.filemode false

或通过添加

在文本编辑器中更改git .config
  

[芯]

filemode = false

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

  

git reset HEAD index.htm

,文件应该消失。

(我从How do I make git ignore mode changes (chmod)?updating-file-permissions-only-in-git

的答案得到了所有这些

答案 5 :(得分:4)

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

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

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

我正在libGDX开展一个Android Studio项目,我想放弃我所做的所有更改,没有任何对我有用,我提出的解决方案就是全部投入更改为新分支

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

然后您可以删除TRASH分支。

答案 8 :(得分:0)

遇到了同样的问题,我有 core.autocrlf=false 配置。

事实证明我遇到的问题是我将 * text eol=lf 添加到 .gitattibutes 文件,并将其提交到存储库,而没有将所有现有文件中的 CRLF 转换为 LF。因此,即使在 repo 的另一个新克隆中,这些文件也显示为已修改。 git status 报告文件被修改 有点奇怪,即使它们在 git 工作目录和阶段区域中具有相同的 CRLF。在我看来,修改 意味着如果添加并提交文件,则会根据当前配置进行一些非空更改。

所以我git add所有文件并提交(确认提交包含CRLF->LF的转换),并没有再得到修改文件报告。

答案 9 :(得分:0)

许多答案可以解决许多问题之一。因此,您可能必须尝试一些,直到找到问题所在。因此,我将结合自己的经验。

就我而言,问题是我的~/.gitattributes中有一个全局~/.gitconfig文件。当我最终检查该文件时,我能够找到有问题的扩展名并进行手动更正。

特别是对于我正在处理的有问题的回购,*.bat必须是-text eol=crlf而不是text eol=crlf

答案 10 :(得分:0)

我的问题在这里有点相似,我刚刚发现git正在跟踪文件权限的更改。我尝试丢弃并重置分支,但文件仍然存在。运行git config --get --local core.filemode,如果为true,则需要将其设置为false以关闭对文件权限的跟踪。运行git config --local core.fileMode false应该可以解决。您可以阅读更多here

答案 11 :(得分: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添加一个更本地的过滤器,并以某种方式覆盖那里的lfs的过滤器规则。

希望这可以帮助同伴。

答案 12 :(得分:0)

我的.gitattributes具有以下内容:

* text=auto eol=lf

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

答案 13 :(得分:0)

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

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

  • 完全删除整个本地版本

  • 从头开始进行git克隆

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

git status update

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

答案 16 :(得分:0)

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

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

希望它也可以帮助其他人。

答案 17 :(得分:0)

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

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

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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

答案 20 :(得分:0)

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

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

有效的解决方案:

  1. 进入安全模式
  2. 放弃文件
  3. 重新启动很痛苦,但这比尝试100件事情要快得多。