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