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

时间:2015-05-09 14:07:15

标签: git git-reset

通读了Mark Dominus's articleScott Chanon's article后,我认为git reset abcd --soft不会影响索引,但是,以下显示了它。

重置前

回购中的

c1.txtc2.txtc3.txt,索引中的c4.txt。全部在工作目录中:

历史:

$ git log --oneline --decorate
b91d91b (HEAD, master) C3
231a5df C2
7e7b2d7 C1

索引:

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

        new file:   c4.txt

工作目录:

$ ls
c1.txt  c2.txt  c3.txt  c4.txt

轻轻地重置为C2提交

$ git reset 231a --soft

$ git log --oneline --decorate
231a5df (HEAD, master) C2
7e7b2d7 C1

索引已更改

$ 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

我认为会发生什么

从斯科特的文章中,他说:

  

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

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

似乎c3.txt已与c4.txt一起移入索引。

2 个答案:

答案 0 :(得分:3)

基本的误解似乎是关于索引是什么。索引不是一组差异,它是一组文件。 git status显示的不是索引,而是最后一次提交和索引之间的差异。

git reset --soft之前,索引包含文件c1.txtc2.txtc3.txtc4.txt。因此,在git reset --soft之后,索引仍包含相同的文件。 git status会以不同方式报告,但由于索引已更改,因此提交已更改。

答案 1 :(得分:0)

来自git docs的引用:

  

根本不触摸索引文件或工作树(但将头重置为,就像所有模式一样)。 这会留下所有已更改的文件&#34;要提交更改&#34;,因为git status会将其设置为。

这意味着您的提交将被删除,但仅限于&#34;要提交的更改&#34;。因此,您必须再次运行git reset <file>才能完全删除它们。对于将来的提交,您可能需要--mixed模式(git reset --mixed 231a)。文档:

  

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