在默认参数方面没有区别(与git reset man page):
<tree-ish>/<commit> 在所有形式中默认为HEAD。
该消息最初不包含 HEAD:commit 3c1eb9c, Jan. 2007, git 1.5.0-rc1,但由于默认值始终不已知,因此帮助消息清楚地表明了您应该进行哪个提交重置。
HEAD 出现在commit 367c988, Nov. 2007, Git 1.5.4:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
torek 指出实际差异in the comments:
通过指定HEAD,您可以保证HEAD 之后的第一个单词被作为路径名。
例如,假设您运行git reset zorg。 zorg 是树状结构,例如标签名称,还是路径名称,./zorg?
Git 的回答是:如果git rev-parse 可以将其转换为树 ID,则它是树形的,否则它是路径。
您可以写git reset -- zorg 或git reset HEAD zorg 以确保git 将其视为路径。
在“Deleting a badly named git branch”中查看有关双连字符语法 (--) 的更多信息。
OP skube 加上in the comments:
顺便说一句,他们确实建议使用它来丢弃工作目录中的更改
(即git checkout -- <file>)。
它似乎与git reset HEAD <file> 不一致。
虽然git reset man page 清楚地表明git reset <tree-ish> -- <paths> 中缺少树状结构意味着HEAD,但git checkout <tree-ish> -- <paths> 并非如此。
git checkout <tree-ish> -- <pathspec>
当给定<paths> 时,git checkout 不会切换分支。
它会从索引文件或命名的<tree-ish>(大多数通常是提交)。
这意味着git checkout -- path 将使用已经暂存的内容(git add'ed)覆盖工作树。
而git reset -- PATH(是 git reset 的混合形式)将使用 HEAD 包含的内容重置 索引(有效地取消暂存添加的内容)
git reset 和 git checkout 不使用相同的默认值,并且:
- 您可以表示
git reset <tree-ish> <file> 的默认树:HEAD。
因此git reset HEAD <file>;
- 但是当您没有为
git checkout 提供树时,您无法表示默认参数:它是索引。
因此git checkout -- file。
-- 必须用在git checkout 的情况下,因为只有一个参数,并且需要明确参数代表文件。
注意git checkout HEAD files 不同:torek 提到in the comments
git checkout HEAD path 从HEAD 提交(树状)复制到索引,然后复制到工作目录。
注意:对于 Git 2.23+,2019 年 8 月,您可以改用 git restore
见the examples:
恢复索引中的文件以匹配 HEAD 中的版本(这与使用 git-reset 相同)
$ git restore --staged hello.c
手册页:
git restore --staged hello.c 不指定源,仅恢复索引 (--staged):它(默认情况下)使用 HEAD 作为源。
默认情况下,工作树和索引的恢复源分别是索引和 HEAD。
--source 可用于指定一个提交作为恢复源。
其他例子:
您可以同时恢复索引和工作树(这与使用git-checkout 相同)
$ git restore --source=HEAD --staged --worktree hello.c
或者更实用但可读性较差的简短形式:
$ git restore -s@ -SW hello.c
git restore 是一个更自然的命令名称,没有歧义。