【问题标题】:Git cannot undo modified filesGit 无法撤消修改过的文件
【发布时间】:2012-09-30 08:52:38
【问题描述】:

我只想回到一个干净的工作目录,就像我上次提交后一样。 Git 向我报告了我没有进行的大量文件修改,所以我怀疑这与行尾有关。

我已经尝试了所有常见的嫌疑人来做到这一点:

git reset --hard git commit -- . git stash git clean -fd

无论我做什么,git status 总是显示与已修改相同的文件。我能做些什么?我有未提交的更改隐藏在另一个分支中,所以我不想只是炸毁所有内容,而只是“回滚”我的主分支。

编辑:输出

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   demo/index.html
#   modified:   demo/js/app.js
#   modified:   demo/js/libs/jquery.1.7.1.js
#   modified:   demo/js/libs/matchMedia.js
#   modified:   demo/js/libs/modernizr.js
#   modified:   demo/js/loadr.js
#   modified:   dist/enquire.js
#   modified:   src/include/intro.js
#
no changes added to commit (use "git add" and/or "git commit -a")

然后我尝试建议的内容以及我能找到的所有其他内容:

WickyNilliams at Nick MBA in ~/Repositories/enquire on master*
$ git checkout -- .
WickyNilliams at Nick MBA in ~/Repositories/enquire on master*
$ git reset --hard
HEAD is now at d70fee4 added meta tag to test demo on mobile #10
WickyNilliams at Nick MBA in ~/Repositories/enquire on master*
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   demo/index.html
#   modified:   demo/js/app.js
#   modified:   demo/js/libs/jquery.1.7.1.js
#   modified:   demo/js/libs/matchMedia.js
#   modified:   demo/js/libs/modernizr.js
#   modified:   demo/js/loadr.js
#   modified:   dist/enquire.js
#   modified:   src/include/intro.js
#
no changes added to commit (use "git add" and/or "git commit -a")

如您所见,尽管回滚,但没有任何变化。

然后我按照建议运行了一个 diff 忽略所有空格,并且怀疑忽略空格时似乎没有区别 - 所以我猜这是行尾!我能做些什么来解决这个问题?我已将 autocrlf 设置为 true 无济于事。

【问题讨论】:

  • 您是否尝试过询问git diff 以了解修改是什么?
  • 是的,我已经做到了,这基本上是说每一行都发生了变化,这就是为什么我认为与行尾有关。奇怪的是,我所有的工作都是在一台计算机上的一个操作系统上完成的,所以不确定这是怎么发生的
  • 这种情况是否发生在您重置后在文本编辑器中打开文件之前?我曾经发现,由于我几个月前设置的一些疯狂的偏好,我的 IDE 在没有我要求的情况下为我“有用”地改变了行尾......
  • 你能发布git status输出的相关部分吗?

标签: git rollback git-stash git-reset


【解决方案1】:

贡献我的案例: 有一个文件的状态为modified,我无法使用git reset --hard 重置此文件。以上命令都没有帮助我,该文件始终处于修改状态。
更有趣的是,即使在新克隆之后,这个问题仍然存在!但是git给了我一个提示:

... bla bla bla git clone ....
Resolving deltas: 100% (37818/37818), done.
warning: the following paths have collided (e.g. case-sensitive paths
on a case-insensitive filesystem) and only one from the same
colliding group is in the working tree:

  'a/b/c/Myfile.kt'
  'a/b/c/MyFile.kt'

事实证明,在区分大小写的文件系统 (linux) 上,有人不小心提交了两个同名文件,但在不同的情况下和不同的内容。当我在不区分大小写的文件系统(macOs、windows)上打开这个 repo 时,git 认为这是同一个文件,并且总是将它显示为从 MyFile.ktMyfile.kt 或从 Myfile.ktMyFile.kt.

所以,我只是删除了一个不相关的文件,只留下了一个。

【讨论】:

    【解决方案2】:

    就我而言,无论顺序如何,git checkout -- .git reset --hardgit clean -fd . 都没有帮助 - 仍然存在一个“已修改”的目录。所以我已经切换到特定目录并从这里运行git checkout -- .。不知道为什么我必须首先更改目录的根本原因,但它有助于摆脱这些修改。

    【讨论】:

    • 谢谢——这有帮助。为什么这样的事情总是发生在我身上?
    【解决方案3】:

    如果 Git 认为您的文件由于尝试自动规范化行尾而被修改(如果 git diff 显示差异,但 git diff --ignore-all-space 没有),您的最佳解决方案可能是关闭行尾为您的项目修改。如果您的团队对一组给定的文件都使用相同的平台(Windows、Linux 等),这将非常有效。

    要关闭项目的行尾修改,请在存储库的根目录中打开或创建 .gitattributes。确保文件包含这一行:

    * -text
    

    如果文件存在并且* 的设置不同,例如* text=auto,则将其替换为上述行。

    【讨论】:

      【解决方案4】:

      尝试this github article 的“重新规范化存储库”部分中说明的方法确保您的 EOL 设置具有合理的值(对于您的操作系统和存储库策略)

      【讨论】:

      • 确实 git rm --cached -r .git reset --hard 为我工作之前
      • 在这两个语句之间我必须做一个 git add -A,但这对我也有效。
      【解决方案5】:

      如果您只想将文件更改回上次提交后的状态,只需执行git checkout [file] 即可获取特定文件。但是git reset --hard 应该对整棵树都这样做。如果您认为这只是行尾,请执行git diff,然后执行git diff --ignore-all-space。如果第一个 diff 显示更改而第二个没有,那么至少您知道您遇到了行尾问题,在这种情况下,您可能需要查看 git and line endings 的描述。

      【讨论】:

      • 谢谢,忽略空间显示文件中没有差异,因此必须是行尾。会关注github文章。希望避免专门用于修复行尾的提交,但我想我必须这样做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 2010-10-16
      • 2011-08-18
      • 2015-08-05
      • 2014-06-13
      • 1970-01-01
      相关资源
      最近更新 更多