参考:https://blog.youkuaiyun.com/candyguy242/article/details/46043207
首先,解释几个定义:
HEAD(头):
指向当前branch最顶端的一个commit,该分支上一次commit后的节点
Index(索引):
也可以被认为是staging area(暂存区), 是一堆将在下一次commit中提交的文件,提交之后它就是 HEAD的父节点. (译注:git add添加的文件)
Working Copy(工作副本):
当前工作目录下的文件,(译注:一般指,有修改,没有git add,没有git commit的文件)
Flow(流程如下):
1.当你第一次checkout一个新的分支,HEAD指向该分支上最近一次commit。它和index和working copy是一样一样的。
2. 当你修改了一个文件,Git注意到了会说“哦,有些东西被改了”,你的working copy不再和index和HEAD相同了,所以当文件有改动,它会标记这些文件。
3. 然后,你执行git add命令,这条命令会将上面修改的文件缓存在index中,Git又说了“哦,你的working copy和index相同了,而他们俩和HEAD不同了”。
4. 当你执行git commit,Git创建了一个新的commit,HEAD这时指向这个新的commit,此时,HEAD & index & working copy又相同了,Git又开心了一次。
操作流程
一、用git reflog
命令查看coomit ID
二、恢复到reset
之前的状态
-
The
--hard
HEAD & index & working
copy同时改变到你要reset到的那个commit上。这个参数很危险,执行了它,你的本地修改可能就丢失了。git reset --hard <coomit ID>
-
The
--mixed
改变HEAD和index,指向那个你要reset到的commit上。而workingcopy文件不被改变。当然会显示工作目录下有修改,但没有缓存到index中。git reset --mixed <coomit ID>
-
The
-soft
参数只告诉Git将其他的commit重置到HEAD,就仅此而已。index和workingcopy中的文件都不改变。git reset --soft <coomit ID>