mixed:回退版本号,重置 stage。作用于 repository 和 stage
hard :回退版本号,重置 stage,重置工作区源码。作用于 repository,stage 和 workspace
我们简单展示下 repository 的版本号,我们以此为 demo 分别尝试三个级别的 reset
git log version D (HEAD) <-- HEAD指针 version C (HEAD^) version B (HEAD^^) version A (HEAD~3)
命令格式:
git reset [--soft|--mixed|--hard] version_no <filename>
--soft:只是单纯的移动 repository 的 HEAD指针 到制定版本号。stage 和工作区没有任何变化。
# 将 HEAD 指针回滚至上一版本 使用 git log 你会发现提交日志退回到了上一版本号 git reset --soft HEAD^ #版本号现状 version C <-- HEAD指针 version B version A
--mixed:默认选项,移动 repository 的 HEAD指针 到指定版本号,同时用此版本重置 stage 区,所以可能会让工作区的某些文件处于 unstage 状态(当工作区的文件与 repository 中的版本不一致时)。注意,这里是可以指定文件的。soft 本身和文件无关,hard 则是不能单独指定文件,只能全部重置。
# HEAD指针 还是指向 HEAD git reset HEAD^2 <filename> #版本号现状 version B <-- HEAD指针 version A
HEAD指针 指向 version B,并且 stage 已经被 version B 的文件重置,工作区则不受影响。
这里有个很实用的小技巧:
git reset version_no <filename> & git checkout -- <filename>
这两个命令组合在一起可以让工作区的指定文件回滚到 repository 中对应的 version_no 版本。
如果 version_no 是 HEAD 的话那就可以回滚文件到最新一次的提交。
--hard:谨慎使用!!!移动 repository 的 HEAD指针 到指定版本号,同时用此版本重置 stage 区 和 工作区源码。这里要特别注意,工作区的源码也会被覆盖重置掉,你的修改会全部丢失。简单来说就是将代码彻底恢复到指定版本。hard 是没办法指定文件的,要么回滚,要么全回滚。
# HEAD指针 还是指向 HEAD git reset --hard HEAD^3 #版本号现状 version A <-- HEAD指针
此时,HEAD指针 指向 version A,并且 stage 和 工作区的文件已经被 version A 的文件重置。整个项目的状态完全回到提交 version A 时按下回车键的那一刻。
rm
git rm 不同于直接使用 rm,git rm 会删除工作区 和 stage 区的内容。注意:这里你没办法再使用 git checkout -- <filename> 来回滚操作了,因为工作区也没有 filename 文件了,没办法与 repository 做关联,只能使用 git reset HEAD <filename> 来重置 stage 中的此文件,然后 git checkout -- <filename>










