git复位vs git复位头
每次暂存文件时,Git都会为您提供有用的说明,以防您需要解除文件的暂存:git复位vs git复位头,git,git-reset,unstage,Git,Git Reset,Unstage,每次暂存文件时,Git都会为您提供有用的说明,以防您需要解除文件的暂存: (使用“git重置磁头…”来取消分级) 然而,体面的人只是说: git重置 这似乎更简单,为什么会有区别呢?默认参数没有区别: 所有形式的/默认为头 该消息最初不包括HEAD:,但由于默认值并不总是已知的,因此帮助消息会明确说明应该重置哪个提交 HEAD出现在: 当给出时,git checkout不会切换分支。 它从索引文件或从命名的(通常是提交)更新工作树中的命名路径 这意味着git checkout--path将用已经
(使用“git重置磁头…”来取消分级)
然而,体面的人只是说:
git重置
这似乎更简单,为什么会有区别呢?默认参数没有区别:
所有形式的/
默认为头
该消息最初不包括HEAD:,但由于默认值并不总是已知的,因此帮助消息会明确说明应该重置哪个提交
HEAD
出现在:
当给出
时,git checkout
不会切换分支。
它从索引文件或从命名的
(通常是提交)更新工作树中的命名路径
这意味着git checkout--path
将用已经暂存的内容覆盖工作树(git add
'ed)。
而git reset--PATH
(是git reset的混合形式)将使用HEAD包含的内容重置索引(有效地取消转移添加的内容)
git reset
和git checkout
不使用相同的默认值,并且:
- 您可以表示git reset的默认树:
HEAD
因此git复位头
李>
- 但是,如果不为
git checkout
提供树,则无法表示默认参数:它是索引。
因此git签出--file
--
必须在git checkout
案例中使用,因为只有一个参数,需要明确的是,该参数表示文件
请注意,git checkout头文件
不同:提到
git签出头路径
从HEAD
commit(树ish)复制到索引,然后复制到工作目录
注意:对于Git 2.23+,2019年8月,您可以使用
见:
恢复索引中的文件以匹配HEAD中的版本(这与使用git reset
相同)
手册页:
git restore--staged hello.c
不指定源,只还原索引():它使用HEAD作为源(默认情况下)
默认情况下,工作树和索引的还原源分别为索引和头。--source
可用于指定提交作为还原源
其他例子:
您可以恢复索引和工作树(这与使用git checkout
相同)
或者更实用但可读性较差的简短形式:
$ git restore -s@ -SW hello.c
git restore
是一个更自然的命令名,没有歧义。默认情况下,git reset
相当于git reset HEAD
引用手册页(我的重点):
git reset-将当前磁头重置为指定状态
git reset [-q] [<tree-ish>] [--] <paths>…
git reset (--patch | -p) [<tree-ish>] [--] [<paths>…]
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
git重置[-q][[-]…
git重置(--patch |-p)[[--][…]
git重置[--soft |--mixed[-N]|--hard |--merge |--keep][q][]
在第一种和第二种形式中,将条目从复制到索引。在第三种形式中,将当前分支头(head)设置为(可选)
修改索引和工作树以匹配。/
默认为所有形式的标题。
[……]
git reset [-q] [<tree-ish>] [--] <paths>…
git重置[-q][[-]…
此表单将所有索引项重置为其在的状态。(它不影响工作树或当前
分支机构。)
这意味着git reset
与git add
相反
从这里你可以看到,行为上没有实际的区别
这似乎更简单,为什么会有区别呢
由于它们都是相同的,您最好使用其中最短的版本。第一次,在任何提交之前,头部都不存在,然后我们得到:
$git reset HEAD stagedFile
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree
值得补充的是,通过指定
HEAD
可以保证HEAD
后面的第一个单词作为路径名。例如,假设运行git reset zorg
。zorg
是一棵树,比如标记名,还是路径名,/zorg
?git的答案是:如果git rev par,它就是一棵树se
可以将其转换为树ID,否则它就是一个路径。您可以编写git reset--zorg
或git reset HEAD zorg
,以确保git将其视为路径。@torek与往常一样非常正确。我已经在答案中包含了您的评论(带有附加链接)因此,如果git reset--
和git reset HEAD
在功能上是相同的,而且两者都比简单的git reset
安全一点,那么为什么git会建议使用HEAD
版本呢?当然,键入--
比键入HEAD
更容易。另外,他们确实建议我t用于放弃工作目录中的更改(即git签出--
)。这似乎不一致。@skube是因为Git希望您知道该语法在文件之前包含一个
。Git reset--
完全混淆了这一点。@torek OP指出了两条帮助消息之间有趣的不一致:Git reset HEAD
和Git checkout--
:为什么语法不同?N注意:现在您还有git restore--staged--afile,使用git 2.23(2019年8月)。请参阅
$ git restore -s@ -SW hello.c
git reset [-q] [<tree-ish>] [--] <paths>…
git reset (--patch | -p) [<tree-ish>] [--] [<paths>…]
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
git reset [-q] [<tree-ish>] [--] <paths>…
$git reset HEAD stagedFile
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree