含义
版本回归正如字面意思:回滚到某一个版本;
场景
假设有这个场景,在日常开发中,你负责的产品已经迭代了9个版本(为了方便描述,便于理解,假设所有迭代都在一个分支上开发),今天正在开发一个新的迭代的时候,老板说了,因客户需求由某种原因,现在需要回滚到第8个版本,这个时候该git reset --hard 版本号出场了
第一步,获取版本号
git log
输出如图补充下,假设时间比较久远,记不清那个版本是什么内容了,这个时候,git commit -m '版本信息描述',版本信息就显得尤为重要了,事实上,在开发中commit的规范,在各大公司中也都是很重要的规范

第二步,回滚到指定版本
这个时候比如想要回滚到 efb3e3 这个版本,可以执行如下命令
git reset --hard e7b3e3c3c1f952a62f0c30e835fc69101cb6a2c1
可以看到,已经会滚到这个版本
这个时候,又有新问题了,在你会滚之后,老板又想让你会滚到之前的版本,这个时候怎么处理?可以看到上图1-2,git log的时候已经没有上一个版本的了记录了,这个时候 git reflog出场了
第三步
执行如下
git reflog
输出如下图内容:会把所有的版本记录都展示出来

之后在执行如下
git reset --hard e7b3e3c3c1f952a62f0c30e835fc69101cb6a2c1
git log

可以看到,版本又滚动了指定内容
本地撤销
已修改,但未暂存
意思就是在本地编辑器中你写的代码还未进行git add或者说最近一次的add之后都未add ,也就是文件在工作区
并且这个时候想查看本地文件可以执行git diff
git diff 显示工作区已经修改但未提交至暂存区的文件和已经提交至暂存区文件的修改,简单来说就是检查工作区与暂存区之间的差异
当你本地修改了一些代码,但是还未进行add,此时如果想修改就可以执行
$ git checkout . # 撤销当前文件夹下所有的修改
$ git checkout filepath1/filename1 filepath2/filename2 # 撤销某几个文件的修改
其中filepath1、filepath2为相对于当前终端执行git 命令的文件路径
已暂存,但未提交
意思add了但是未commit的时候,也就是文件在暂存区
git diff --cached 这个命令显示暂存区和本地仓库(上一次commit之后的代码)的差异,
git diff 这个命令显示工作区与暂存区之间的差异
所以也就是说,在add之后执行gif diff 是看不到任何变化的,这时候想看到改了什么就要执行git diff --cached
这个时候想撤回可以执行
方法1
$ git reset # 暂存区的修改恢复到工作区,但是工作区的代码是不会变化的
$ git reset --soft #和git reset一致,回到已修改状态,修改的内容仍然在工作区中
接下来看demo
假设有个修改在app文件内,
查看文件状态
git status

然后add下到暂存区,在看下状态
git add .
git status

可以发现文件已经git被追踪管理
这时候想撤销
git reset
git status

可以清晰的看到文件已经重暂存区撤销,这时候查看下,本地代码是依旧没有变化的,如果这个时候还想使工作区代码也撤回在执行git checkout . 就好了
方法2
撤回的同时工作区的代码撤回
$ git reset --hard # 回到未修改状态,清空暂存区和工作区
相当于
git reset
git checkout .