通读了Mark Dominus's article和Scott Chanon's article后,我认为git reset abcd --soft
不会影响索引,但是,以下显示了它。
c1.txt
,c2.txt
,c3.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
$ 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.txt
和c4.txt
。
似乎c3.txt
已与c4.txt
一起移入索引。
答案 0 :(得分:3)
基本的误解似乎是关于索引是什么。索引不是一组差异,它是一组文件。 git status
显示的不是索引,而是最后一次提交和索引之间的差异。
在git reset --soft
之前,索引包含文件c1.txt
,c2.txt
,c3.txt
和c4.txt
。因此,在git reset --soft
之后,索引仍包含相同的文件。 git status
会以不同方式报告,但由于索引已更改,因此提交已更改。
答案 1 :(得分:0)
来自git docs的引用:
根本不触摸索引文件或工作树(但将头重置为,就像所有模式一样)。 这会留下所有已更改的文件&#34;要提交更改&#34;,因为git status会将其设置为。
这意味着您的提交将被删除,但仅限于&#34;要提交的更改&#34;。因此,您必须再次运行git reset <file>
才能完全删除它们。对于将来的提交,您可能需要--mixed
模式(git reset --mixed 231a
)。文档:
重置索引但不重置工作树(即保留更改的文件但未标记为提交)并报告尚未更新的内容。这是默认操作。