"git checkout -- *" returns "error: pathspec did not match any files known to git"

"git checkout -- *" returns "error: pathspec did not match any files known to git"

如前所述,如果我想放弃工作目录中的更改,我 运行 命令 git checkout -- * 但 git returns 信息 error: pathspec 'databaseName.tmp' did not match any file(s) known to git.。我不是git高手,不知道怎么解决。有什么想法吗?

作为 genisage ,您明确要求 git 签出文件 databaseName.tmp,就好像您输入了:

git checkout -- databaseName.tmp

这是因为在 git 有机会看到您的命令之前,您输入的 * 由 shell 处理。 shell 将 * 替换为当前工作目录中的所有文件名,1 然后完成后,然后 运行 git,但没有任何迹象表明您输入的实际命令中包含 *,而不是所有这些名称。

同样,git 不知道您使用了星号 * 字符,它看到的只是一个文件名列表,包括 未存储在 git.

中的任何顶级忽略文件

令人困惑的是,如果您设法2 将文字星号 * 传递给 git,git 将扩展 *,但 具有一组不同的文件名: git 已知的文件名。那会做你想要的。

不过,有一个更简单的方法:git 将递归地检出目录,方法是检出它在 目录中知道的所有文件 。因此,不使用 *,只需使用 . 请求 git 检出当前目录:

git checkout -- .

如果 git 知道 ./a./b 但不知道 ./databaseName.tmp,这将检查 ./a./b 而不会尝试用 ./databaseName.tmp.3

做任何事情

1更准确地说,文件名不以前导点开头的文件 .

2其实也很容易管理,例如,只需在星号前插入一个反斜杠\git checkout -- \*。或者,使用单引号或双引号,它们都可以防止 shell 通配。单引号也抑制 shell 变量扩展,而双引号允许变量扩展但抑制通配。

3值得指出这里的细微差别:* 扩展为不以 . 开头的文件名,而询问 git 检出 . 会导致它检出目录中的所有文件, 包括 名称以 . 开头的文件。因此,git checkout -- \*git checkout -- * 都将 而不是 撤消对名为 .secret 的文件的更改,例如,而 git checkout -- . 撤消此类更改。