①reset命令的三个参数对比:--hard、--soft、--mixed
git reset --hard 部分哈希值、git reset --hard HEAD^ 、 git reset --hard HEAD~3 。其中--hard可以为--soft、--mixed。
利用git help reset查询帮助文档,查看这三个参数的对比。
②--soft的描述:
--soft
Does not touch the index file or the working tree at all <不触碰暂存区和工作区。那么意思就是仅仅触碰本地库,在本地库移动一下HEAD指针。>(but resets the head to <commit>, just like all modes do). This leaves all your changed files "Changes to be committed", as git status would put it.
index file指的是暂存区,working tree指的是工作区。
③--mixed的描述:
--mixed
Resets the index but not the working tree<触碰index file暂存区,但不会去触碰working tree工作区。> (i.e., the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action.
If -N
is specified, removed paths are marked as intent-to-add (see git-add(1)).
一方面在本地库移动HEAD指针,并且重置了暂存区。
③--hard的描述:
--hard
Resets the index and working tree.<重置暂存区和工作区> Any changes to tracked files in the working tree since <commit> are discarded.
在本地库移动HEAD指针,并且重置暂存区和工作区。
④体验一下这三个参数:
第一:使用git reset --soft 部分哈希值
good.txt原来结尾的值是:qqqqqqqqq。
如果是git reset --hard 部分哈希值,则查看文件cat good.txt,里面的值是mmmmmmmmm结尾。
但是git reset --soft部分哈希值,查看文件cat good.txt,不变,还是之前的qqqqqqqqq结尾。
再查看状态:git status
git reset --soft 部分哈希值相当于:
本地库版本比暂存区和工作区版本都低
或者
本地库版本比暂存区和工作区版本都高
这个时候git status 的modified :good.txt是绿色的字。因为工作区和暂存区同步,相当于工作区已经将内容git add 文件名提交到暂存区了。但是暂存区的内容有提交给本地库。
而cat good.txt读取的是工作区的内容。所以工作区的内容不变。所以cat good.txt,值还是之前的qqqqqqqqq而不是移动的HEAD指针指向的内容mmmmmmmmm。
第二:使用git reset --mixed 部分哈希值
先用git reflog 显示以下内容:
但是查看工作区内容,cat good.txt,仍然是qqqqqqqqq,而不是hhhhhhhhh。也不是mmmmmmmmm。
因为mmmmmmmmm那一个移动HEAD指针是soft。工作区内容也没有变化。
本地库和暂存区比工作区版本都低
或者
本地仓库和暂存区比工作区版本都高
modified : good.txt变成红字。说明工作区和暂存区不一样。可以通过git add 文件名将工作区内容加入到暂存区。
第三:使用git reset --hard 部分哈希值
本地仓库、暂存区、工作区都同时进退版本,版本一致,内容一致。
但工作区之前也不是hhhhhhhhh,而是qqqqqqqqq。因为之前是--soft和--mixed在操作。
移动到ooooooooo。