参考文章
git checkout HEAD : master/HEAD -> index -> work directory
index 暂存区有两行信息。分别用于比较本区与 工作目录和 本地仓库master 的变化。
当提交后,不再显示暂存区与本地仓库master 的变化。暂存区保持最后一次add 的状态。
当使用 checkout,会从暂存区获取信息。
当使用 checkout HEAD ,会从 本地仓库master 里获取内容,该内容会先进入 暂存区,再回到工作目录。
使用 git rm --cached -- 会删除暂存区的内容。但不会删除 本地仓库master 里的内容。此时无法使用 checkout 获取内容,但是可以使用 checkout HEAD 获取。
git reset -- 只会撤销已add到暂存区的文件到 unstage的空间,如果add 后没有commit,则意味着清空暂存区的内容。如果 add后立即 commit了,则执行下面"git reset HEAD "的操作,此时暂存区的内容不会清空。而要清空已经 commit的暂存区的内容,或着说完全清空(无论是否已经提交)需要使用 git rm --cached -- 。(第二种情况与执行下面的命令是一样的,但是前提是当前工作目录必须有这个文件。而直接执行下面的命令,当前目录可以没有此文件。)
git reset HEAD 会撤销已经提交的文件到暂存空间,再到 unstage的空间。所以如上所述,暂存区的内容不会清空。
如果需要 reset HEAD 后不保存到暂存空间,可以加 --soft。如果不仅需要保存到 stage空间,还要同步到 工作目录,可以加 --hard