24

我的工作目录中有一些我试图丢弃的更改(重置为文件的当前索引版本),但是git checkout -- <file>不会丢弃这些更改。我尝试手动删除文件 ( rm -r files) 然后运行git checkout -- .,这会再次显示文件已修改。

$ git checkout -- .
$ 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:   files/Hulk.png
#   modified:   files/Hulk_2.png
#
no changes added to commit (use "git add" and/or "git commit -a")

运行git diff显示文件已修改...

diff --git a/files/Hulk.png b/files/Hulk.png
index 1c256cb..1d37fe0 100644
Binary files a/files/Hulk.png and b/files/Hulk.png differ
diff --git a/files/Hulk_2.png b/files/Hulk_2.png
index 1c256cb..0717199 100644
Binary files a/files/Hulk_2.png and b/files/Hulk_2.png differ

注意:有些人说要运行git checkout .,但是这将达到与git checkout -- .. 这--只是 git checkout 命令中用于区分树状/提交点与文件/路径的符号。

操作系统:OSX 10.6 Git:1.7.10.2

4

11 回答 11

23

造成这种情况的原因是由于多个文件具有相同的名称但不同的情况。在不区分大小写的 OSX 中,不喜欢具有相同名称但大小写不同的多个文件。它将它们视为同一个文件。为了解决这个问题,我运行git mv(或只是mv)到一个临时文件名,添加了临时文件,这允许 git 删除旧的/错误命名的版本,然后再次提交以将它们重新命名。这也可以在允许具有相同名称的不同文件是不同情况的文件系统上更正。

于 2012-07-12T21:36:31.460 回答
9

你试过了吗

git config --global core.autocrlf false

或者

git config --global core.filemode false
于 2014-04-24T09:27:06.557 回答
6

根据您的评论,您必须将存储库配置为区分大小写:

git config core.ignorecase false

这允许 git 跟踪两个文件(尽管文件系统只显示一个,这非常令人困惑)。当 git 正确跟踪区分大小写时,以下是演示正在发生的事情的复制步骤:

git init /tmp/test && cd /tmp/test
git config core.ignorecase false
echo test>test && git add test && git commit -m "lowercase t"
mv test Test

现在git status显示与以下没有区别test

git status -s
 ?? Test

提交Test并使用git ls-files以查看我们现在正在跟踪的内容:

git add Test && git commit -m "uppercase T"
git ls-files
 Test
 test

报告什么ls?为什么,只是“测试”,自然:

ls
 Test

最后,当我们修改Test时会发生什么?

echo garbage>Test
git status -s
 M Test
 M test

真是一团糟。

于 2012-07-13T12:43:04.213 回答
2

采用 。代替 -

git checkout .
于 2012-07-12T19:13:48.763 回答
1

由于某种原因,同样的事情发生在我身上,但这不是区分大小写的问题。删除文件,然后更改分支解决了这个问题。

于 2015-01-16T17:31:29.187 回答
1

对我有什么帮助:(也改进了vinboxx的答案)

我已经通过.gitattributes以下方式进行了配置:

* text eol=crlf

(我希望 -X renormalize 在合并后自动使用正确的格式)

在临时评论该行以及设置之后git config core.autocrlf false。一切都恢复了正常。

于 2018-05-17T14:26:14.273 回答
0

如果要放弃所做的所有更改,只需使用

git checkout .
于 2012-07-12T19:13:50.920 回答
0

我遇到了同样的问题。我发现这两个有问题的文件有 DOS 行结束字符。我这样做是为了解决问题。

1-使用不同的克隆将行结尾更改为 UNIX 2-吹掉出现问题的克隆并重新克隆它。

于 2014-01-24T17:14:18.540 回答
0

为了避免下次出现这个问题,我决定将我的文件系统转换为区分大小写的。

我很惊喜地发现它在 Mac OS (10.13.4) 上非常简单。

可以快速创建具有不同文件系统的新磁盘卷:

  • 运行磁盘工具
  • 点击容器
  • 点击音量 (+)

我将新卷命名为“项目”并将格式设置为 APFS(区分大小写)。

之后,我将所有项目移至新卷。

于 2018-03-03T22:44:10.067 回答
-1

我使用了 git checkout -- 。

还有 git checkout 。

== 与操作员所说的相同,Mac OSX 10.7 和 Linux 都适用,两者都适用

使用 git 版本 1.7.7.5 (Apple Git-26) 和 git 1.7.1 编译

尝试不同的 repo,看看是否得到相同的结果。也许是 git 版本中的命令错误?

于 2012-07-12T21:05:21.160 回答
-2

当您使用“rm -r file”从文件系统中删除文件时,您不会从存储库中删除它。你需要在 git 中使用“git rm”做同样的事情

于 2012-07-12T19:20:38.610 回答