git reset

git reset mixed/soft/hard的区别

git reset至少会更改当前分支(HEAD)的指向。--mixed--soft的区别在于是否改变了索引(index)。

如,我们有如下commits:

1
- A - B - C (master)

此时,HEAD指向C并且索引也匹配了C

git reset --soft

当我们使用git reset --soft Bmaster(也就是HEAD)指向了B,但是索引仍然有C的改动,git status显示这些改动是staged的。此时如果再运行git commit,我们会得到一个新的commit,它的改动同C是一样的。

git reset --mixed

如果我们使用git reset --mixed B(--mixed是默认的选项。再一次地,masterHEAD都指向了B,但是索引也同时匹配了B。此时如果运行git commit,则没有改动会被提交。因为索引和HEAD是匹配的。在工作目录中,我们还有这些改动,但是这些改动是unstaged。为了提交他们,我们需要运行git add然后再提交。

git reset --hard

git reset --hard--mixed对于HEAD和索引的改动是一样的。但是,--hard同时也改变了工作目录。
所以,效果相当于这些改动,永久地消失了。

在运行git reset --hard前,最好git status查看下当前的工作目录。

图示:
git-reset图解