如图所示,我删除了一个文件名,其中包含一些UniCode字符,并将其添加到索引中。如何取消该动作?
更多说明:
如git status
所示,我上演了已删除的文件。但是我还没有承诺。
通过git checkout -- deleteFile
,它声称:
fatal: pathspec '03.08 T&D \347\224...' did not match any files.
通过`git rm --cached“ 03.08 T&D \ 347 \ 224 ...”声明:
fatal: pathspec '03.08 T&D \347\224...' did not match any files.
。
答案 0 :(得分:2)
这里的问题是文件名包含Unicode序列,表示文件名中的非ASCII字符:
$ printf '%b\n' '03.08 T&D \347\224\260\346\235\260 WeeklyReport.md'
03.08 T&D 田杰 WeeklyReport.md
当git status
打印文件名时,不确定是否可以在屏幕上生成中文脚本,因此它会写出会生成田和杰的UTF-8序列的八进制值,而不是打印它们。 [编辑:,如果将core.quotePath
设置为false
,则告诉Git可以打印此类字符而不用转义符替换它们。见下文。]
上面的printf
命令显示了一种表达文件名的方式,该方式允许您剪切和粘贴文件名。然后,您可以使用:
git checkout -- '03.08 T&D 田杰 WeeklyReport.md'
找回它。
git stash
呢?您使用的方法-运行git stash
-等于根据您已进行的更改进行提交,然后运行git reset --hard
。 git stash
所做的提交不在 any 分支上。运行git stash list
将显示git stash
所做的提交。您以后可以随便做什么。
从技术上讲,git stash
实际上进行了两个 分支上的提交,但是在这种情况下,其中只有一个做任何有用的事情:它保存了文件的删除,以防您确实确实意味着要删除它。复制起来并不是很困难(您可以再次删除文件),因此您可以简单地删除存储:
git stash drop
只要其中没有其他有价值的东西。
core.quotePath
同样,我在这里没有您的存储库,因此我只能对文件做出自己的猜测。这是我所做的:
$ mkdir tmp/tpath; cd tmp/tpath; git init
Initialized empty Git repository in .../tmp/tpath/.git/
$ echo text > '03.08 T&D 田杰 WeeklyReport.md'
$ git add .
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: "03.08 T&D \347\224\260\346\235\260 WeeklyReport.md"
$ git config core.quotePath false
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: 03.08 T&D 田杰 WeeklyReport.md
$ git commit -m initial
[master (root-commit) 5658907] initial
1 file changed, 1 insertion(+)
create mode 100644 03.08 T&D 田杰 WeeklyReport.md
如果您使用的是Windows或MacOS,请注意,某些UTF-8文件名可能会遇到各种翻译问题,类似于Linux用户可以创建两个分别名为readme
和{ {1}}并提交它们。如果您从不从Windows或MacOS系统迁移至 Linux,反之亦然,那么您就不会遇到问题,但是如果这样做,您可能会遇到问题。 (在README
或agréable
之类的文件名中带重音符号的字符通常是一个问题。Unicode有多种方式来拼写这些名称,但是MacOS特别要坚持将其拼写为 方式。)
答案 1 :(得分:1)
git checkout HEAD -- <filepath>
应该可以
答案 2 :(得分:0)
不知道原因。但是我通过
解决了它git stash
感谢您的回答。