git checkout - <files>不会丢弃更改?

Hig*_*ife 21 git macos git-checkout

我的工作目录中有我正在尝试丢弃的更改(重置为当前索引的文件版本),但是,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")
Run Code Online (Sandbox Code Playgroud)

运行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
Run Code Online (Sandbox Code Playgroud)

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

操作系统:OSX 10.6 Git:1.7.10.2

Hig*_*ife 22

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


vin*_*oxx 8

你试过了吗

git config --global core.autocrlf false
Run Code Online (Sandbox Code Playgroud)

要么

git config --global core.filemode false
Run Code Online (Sandbox Code Playgroud)

  • 为什么要尝试呢? (5认同)

Chr*_*her 5

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

git config core.ignorecase false
Run Code Online (Sandbox Code Playgroud)

这允许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
Run Code Online (Sandbox Code Playgroud)

现在git status显示没有区别test:

git status -s
 ?? Test
Run Code Online (Sandbox Code Playgroud)

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

git add Test && git commit -m "uppercase T"
git ls-files
 Test
 test
Run Code Online (Sandbox Code Playgroud)

什么ls报道?为什么,只是'测试',自然:

ls
 Test
Run Code Online (Sandbox Code Playgroud)

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

echo garbage>Test
git status -s
 M Test
 M test
Run Code Online (Sandbox Code Playgroud)

真是一团糟.