git复位vs git复位头

git复位vs git复位头,git,git-reset,unstage,Git,Git Reset,Unstage,每次暂存文件时,Git都会为您提供有用的说明,以防您需要解除文件的暂存: (使用“git重置磁头…”来取消分级) 然而,体面的人只是说: git重置 这似乎更简单,为什么会有区别呢?默认参数没有区别: 所有形式的/默认为头 该消息最初不包括HEAD:,但由于默认值并不总是已知的,因此帮助消息会明确说明应该重置哪个提交 HEAD出现在: 当给出时,git checkout不会切换分支。 它从索引文件或从命名的(通常是提交)更新工作树中的命名路径 这意味着git checkout--path将用已经

每次暂存文件时,Git都会为您提供有用的说明,以防您需要解除文件的暂存:

(使用“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