如果没有当前分支,那么`git reset --mixed`在索引方面做了什么

时间:2017-08-21 08:36:51

标签: git

据我所知,当我在没有任何参数和路径的情况下运行git reset时,默认为--mixed git手册描述为:{/ p>

  

重置索引但不重置工作树(即更改的文件是   保留但未标记为提交)并报告未提交的内容   更新。

我想知道它将它重置为什么?我假设它使用git read-tree将一些树读入索引文件,但它在哪里找到那棵树?其他一些选项可以解释在HEAD文件中找到树,该文件指向提交或分支,因此可以解析树哈希。

但是,我已使用git read-tree aa23将树放入索引,目前我的HEAD文件包含以下内容:

ref: refs/heads/master

但是还没有创建分支。 该树包含两个文件:

$ git ls-files -s
100644 a1deaae8f9ac984a5bfd0e8eecfbafaf4a90a3d0 0       f1.txt
100644 9b96e21cb748285ebec53daec4afb2bdcb9a360a 0       f2.txt

当我运行git reset时,我没有收到任何错误,git status报告没有更改,git ls-files -s报告没有文件。那么索引被重置为什么?

1 个答案:

答案 0 :(得分:3)

在未出生的分支上运行git reset时,Git明确使用semi-secret empty tree作为the target of the reset

unborn = !strcmp(rev, "HEAD") && get_sha1("HEAD", oid.hash);
if (unborn) {
        /* reset on unborn branch: treat as reset to empty tree */
        hashcpy(oid.hash, EMPTY_TREE_SHA1_BIN);
} else if (!pathspec.nr) {

如果顶级树为空,则重置任何路径 P 的索引条目的正确(至少在概念上)结果是从索引中删除 P