一.产生背景
绝大部分的情况下我们都会使用git 来进行版本库的管理,某些时候因为一些误操作,我们会对其中的一个版本进行回滚, git 提供了两种回滚方案 reset 与revert 操作;
二.使用以及区别
git reset
可翻译为重做的意思,git reset 命令会把版本库和工作目录改变为已知状态,具体来说,它会调整HEAD 引用指向给定的提交;
git reset 有三种主要选项: --soft,--mixed,--hard;
--soft 会将HEAD引用指向给定提交,索引和工作目录的内容保持不变,具有最小影响;
--mixed (git reset 默认方式)会将HEAD引用指向给定提交,索引内容也跟着改变,工作目录内容保持不变。该命令将索引变成刚刚暂存该提交全部变化时的状态,同时会显示工作目录h还有什么修改;
--hard 会将HEAD引用指向给定提交,索引内容也跟着改变,工作目录也会随之修改(该选项是一个危险操作,意味着如果新版本有新的修改,通过使用git reset --hard commit 本地工作目录会丢失这些修改)
通过实际的例子可观测下,目前分别增加了3个文件,对应3个commitId,“add test3” 为当前最新提交,假设发现最新提交("add test3")有问题,想回滚到 "add test1" 这个时刻

-
使用git reset --soft 5feef0f8ced90e27e9248759a03b765153db2e40 :
03.jpeg
04.jpeg
可以看到head 指针指向了 “add test1” 的本次提交,工作区,暂存区保留了之前添加的索引文件,如果我们不想要 "add test3"最后一次的变动提交文件,可以通过git restore 命令 将对应的文件移除暂存区,然后git push推送;
2.重新模拟添加文件的产生的3个commitId 操作通过git log 查看:

还是刚才的回退到"add test1"的commitId ,使用git reset --mixed 5feef0f8ced90e27e9248759a03b765153db2e40 ,

git status 查看当前暂存区状态:

查看本地工作区:

head 指针指向了 "5feef"的commitId,暂存区的索引文件也发生了变化,工作区的文件并未发生变化;
3.最后模拟三个添加文件的commitId

使用 git reset --hard 5feef0f8ced90e27e9248759a03b765153db2e40

可以看到,这是最危险的操作,导致本地工作区,暂存区文件都会丢失;
git revert
用来产生一个新提交来抵消了给定提交的影响,它方便管理git 的版本变化链路,常用来撤销在历史记录中某个提交的影响;
通过增加3个文件的版本

假设历史版本"add test1" 有问题,不想要这个最早的版本,
执行git revert 5feef0f8ced90e27e9248759a03b765153db2e40,可以看到,git 会生成一个新commitId (它包含撤销 "add test1" 版本的提交,并且保留后续新版本的提交),,当前head 指针指向最新的commitId

本地工作区以及暂存区:

总结
相同点:
都是作为git 回滚的一种选择方案;
不同点:
1.git reset 操作,会通过修改head 指针指向要回滚到的commitId ,通过在工作区修正错误版本的文件,然后commit,或者如果不想要错误版本的文件,可以移除掉,再commit,相对来说,需要用户来关注并处理错误的版本文件,并且没有git 版本追踪的链路;
2. git revert 操作,通过生成新的commitId (它会全部撤销 错误版本的提交 且保留其他版本的文件),在git 版本管理上,便于追溯,在日常操作过程中更为方便;
网友评论