git reset
至少会更改当前分支(HEAD
)的指向。--mixed
和--soft
的区别在于是否改变了索引(index)。
如,我们有如下commits:1
- A - B - C (master)
此时,HEAD
指向C
并且索引也匹配了C
。
git reset --soft
当我们使用git reset --soft B
,master
(也就是HEAD
)指向了B
,但是索引仍然有C
的改动,git status
显示这些改动是staged的。此时如果再运行git commit
,我们会得到一个新的commit,它的改动同C
是一样的。
git reset --mixed
如果我们使用git reset --mixed B
(--mixed
是默认的选项。再一次地,master
和HEAD
都指向了B
,但是索引也同时匹配了B
。此时如果运行git commit
,则没有改动会被提交。因为索引和HEAD
是匹配的。在工作目录中,我们还有这些改动,但是这些改动是unstaged。为了提交他们,我们需要运行git add
然后再提交。
git reset --hard
git reset --hard
和--mixed
对于HEAD
和索引的改动是一样的。但是,--hard
同时也改变了工作目录。
所以,效果相当于这些改动,永久地消失了。
在运行git reset --hard
前,最好git status
查看下当前的工作目录。
图示: