git 回滚 reset 与revert

2022-05-14  本文已影响0人  今夜秋风和

一.产生背景

绝大部分的情况下我们都会使用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" 这个时刻


01.jpeg
  1. 使用git reset --soft 5feef0f8ced90e27e9248759a03b765153db2e40 :


    03.jpeg
    04.jpeg

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


05.jpeg

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


06.jpeg
git status 查看当前暂存区状态:
07.jpeg
查看本地工作区:
08.jpeg

head 指针指向了 "5feef"的commitId,暂存区的索引文件也发生了变化,工作区的文件并未发生变化;

3.最后模拟三个添加文件的commitId


09.jpeg

使用 git reset --hard 5feef0f8ced90e27e9248759a03b765153db2e40


11.jpeg
可以看到,这是最危险的操作,导致本地工作区,暂存区文件都会丢失;

git revert

用来产生一个新提交来抵消了给定提交的影响,它方便管理git 的版本变化链路,常用来撤销在历史记录中某个提交的影响;

通过增加3个文件的版本


11.jpeg

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


12.jpeg
本地工作区以及暂存区:
13.jpeg

总结

相同点:

都是作为git 回滚的一种选择方案;

不同点:

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

猜你喜欢

热点阅读