10

我只想回到一个干净的工作目录,就像我上次提交之后一样。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")

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

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

4

5 回答 5

6

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

于 2012-10-10T00:59:32.693 回答
4

在确保您的 EOL 设置具有合理的值(对于您的操作系统和 repo 策略)之后,尝试在此 github 文章 的“重新规范化 repo”部分中解释的方法

于 2012-10-10T08:22:36.830 回答
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.kttoMyfile.kt或 from Myfile.ktto的“修改” MyFile.kt

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

于 2021-08-13T08:00:53.540 回答
0

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

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

* -text

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

于 2016-08-24T00:58:48.557 回答
0

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

于 2020-06-21T06:50:28.850 回答