git reset --soft 似乎改变了索引

Ban*_*San 3 git git-reset

通读了Mark Dominus 的文章Scott Chanon 的文章后,我认为这git reset abcd --soft不会影响索引,但是,以下内容表明确实如此。

重置前

c1.txt, c2.txt,c3.txt在回购中,c4.txt在索引中。全部在工作目录中:

历史:

$ git log --oneline --decorate
b91d91b (HEAD, master) C3
231a5df C2
7e7b2d7 C1
Run Code Online (Sandbox Code Playgroud)

指数:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   c4.txt
Run Code Online (Sandbox Code Playgroud)

工作目录:

$ ls
c1.txt  c2.txt  c3.txt  c4.txt
Run Code Online (Sandbox Code Playgroud)

轻柔地重置为 C2 提交

$ git reset 231a --soft

$ git log --oneline --decorate
231a5df (HEAD, master) C2
7e7b2d7 C1
Run Code Online (Sandbox Code Playgroud)

索引已更改

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   c3.txt
        new file:   c4.txt


$ ls
c1.txt  c2.txt  c3.txt  c4.txt
Run Code Online (Sandbox Code Playgroud)

我以为会发生什么

从 Scott 的文章中,他说:

reset 会做的第一件事是移动 HEAD 指向的东西.... 如果你添加标志 --soft,这是它唯一会做的事情。使用--soft,重置将简单地停在那里。

所以,我认为索引(我希望我已经理解为git status上面输出中显示的内容)不会改变,也就是说,它仍然包含c4.txt. 上面的输出显示它实际上包含c3.txtc4.txt

似乎c3.txt已被移入索引旁边c4.txt

小智 5

根本的误解似乎是关于指数什么。索引不是一组差异,而是一组文件。什么git status节目是不是指数,但最后的区别承诺和索引。

你之前git reset --soft,该指数包含的文件c1.txtc2.txtc3.txtc4.txt。所以在你之后git reset --soft,索引仍然包含那些相同的文件。git status会以不同的方式报告这一点,但这不是因为索引发生了变化,而是因为提交发生了变化。