“git checkout - *”返回“错误:pathspec与git已知的任何文件都不匹配”

时间:2015-01-22 06:59:02

标签: git

正如问题所述,如果我想放弃工作目录中的更改,请运行命令git checkout -- *,但git会返回信息error: pathspec 'databaseName.tmp' did not match any file(s) known to git.。我不是git master,我不知道如何解决它。有什么想法吗?

1 个答案:

答案 0 :(得分:15)

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

git checkout -- databaseName.tmp

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

同样, git不知道你使用了星号*字符,它看到的只是一个文件名列表,包括任何顶层忽略未存储在git 中的文件。

令人困惑的是,如果您以某种方式管理 2 将文字星号*传递给git, git 将展开*,但使用不同的文件名集: git已知的文件名。那会做你想要的。

但是有一种更简单的方法:git将通过检查它知道该目录中的所有文件来递归检出目录。因此,不要使用*,而只需使用.来请求git检出当前目录:

git checkout -- .

如果git知道./a./b但不知道./databaseName.tmp,则会查看./a./b,而不会尝试对{{./databaseName.tmp做任何事情1}}。 3


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

2 事实上,它很容易管理,例如,只需在星号前面插入反斜杠\git checkout -- \*。或者,使用单引号或双引号,这两个引号都可以防止shell globbing。单引号也会抑制shell变量扩展,而双引号允许变量扩展但抑制全局变量。

3 这里值得指出一个微妙的区别:*扩展到不以.开头的文件名,同时要求git签出.会导致它检出目录中的所有文件,包括名称以.开头的文件。因此,git checkout -- \*git checkout -- *撤消对名为.secret的文件的更改,例如,git checkout -- . 撤消此类更改。