【Git】Git reset/revert的应用

课下来自己动手试试git的命令

主要尝试及记录

git reset --hard
git reset --soft
git revert

以上3个命令的具体作用及区别,这些命令主要用于撤销修改,但又各有些小区别

尝试准备

首先,为了制造合适的测试环境,我选择重新初始化一个本地git仓库来尝试,因为不涉及到push到远程仓库,所以也就不需要远程仓库了,这个本地仓库纯用于测试

了解HEAD

为了更加方便理解命令的作用不同,我们还需要了解一个HEAD的概念
HEAD简单来说,指的就是当前当前分支的最近一次提交后的版本,也就是说,HEAD代表的是最新的版本,根据这个概念,我们还可以知道HEAD就是指上一个版本,同理HEAD就是再上一个版本,因为(英文符号shift+6)不太方便,我们也可以以HEAD~x来表示距离最新版本的之前几个版本

建立本地仓库并添加文件

建立本地git仓库并创建提交a.md文件

横向对比

准备工作做好后,我们就来试试几个命令
首先,我们先对a.md进行3次编辑及提交以产生3个版本记录

对a.md进行3次编辑并提交
经过3次编辑提交的a.md

这里引入了一个log的新用法git log --oneline,这个log命令能够让我们相对直观的看到最近的版本记录并标识出提交版本号
在这个情况下,我们的工作区和暂存区都是干净的,我们不想要第三次提交了,我们来试试三个命令的不同

git reset --hard

使用git reset --hard HEAD^

这时候我们看到操作成功,我们来看一下对于文件产生了什么作用,首先查看a.md,并查看状态

git reset --hard HEAD^之后的a.md

reset --hard之后的status

我们能看到,reset --hard命令不仅将修改的文件变为了第二次提交的状态,并且不用我们再次commit
这时候我们再log --oneline看一下

git log --oneline

我们看到,我们的第三次提交记录被抹去了,也就是说,reset --hard的作用差不多是完全重置到某个版本并且销毁提交记录,本能的感觉到这个操作比较危险,我们来看一下历史的log

git reflog

可以看到我们当前的HEAD确实处于了第二次编辑提交的状态,按下不表,接着试试--soft

git reset --soft

之前的记录已经被毁了,但是通过查阅资料,我们是可以恢复的

git reflog及git reset --hard {版本号}

我们从git reflog中可以看到,第三次编辑并提交的版本号为0379f9d,所以我们用--hard+版本号参数的命令回到三次编辑并提交的状态,接着尝试--soft
同样的,我们不想要第三次提交,希望回退到第二次提交

git reset --soft HEAD^

看到操作成功了, 但是并没有什么提示,那我们看看git状态和a.md的状态吧

git status
a.md

我们看到了,--soft命令,仅仅是把我们的第三次‘commit’的操作给撤销了,a.md处于第三次编辑完成、add完成,但未提交的状态
简单来看,也就是说--soft命令是撤销指定版本内容的那一次commit,其他的东西都不改变,接着试试revert命令

git revert

我们再次使用git reflog查询版本号并回到三次编辑提交的状态,同样,还是不希望保留第三次编辑提交

git reset --hard

然后我们试试revert

git revert

在回到3次编辑提交的版本后,我进行了一次log查询及状态查询,状态显示没有待提交的的东西,但是在进行revert想回到第二次编辑的状态时,提示失败,失败后再查看状态看到了a.md的unmerged的提示,讲道理,我到这里已经有点懵逼了,就按照提示,我再进行了一次commit,并产生了一条“由于revert失败,提交一次第三次编辑的a.md”的修改版本记录,这一点有点摸不到头脑,回头还是会问一下老师,总之,我们继续
我们还会是向回到第二次编辑状态,尝试git revert

git revert

我们看到,操作成功了,并且自动打开了vim让我们编辑本次变动的提交信息,我们直接保存退出
操作成功后,查看status并查看a.md的状态

status及log
revert后的a.md

我们发现a.md被改变了,改成了一个奇怪的样子,到这里我已经完全懵逼了,,所以我觉得从头来一次纯净版本的revert
重新建立b.md并编辑提交3次

新建b.md

我们来直接试试revert到第二次编辑

git revert
revert后的b.md

我们看到这次的revert操作比较成功,但是由于目标是第二次编辑提交的版本,所以在revert的时候接连弹出了两个revert的commit信息输入框,完成后的log如下图,生成了两个新log,一个是回退到第三次编辑提交、一个是回退到第二次编辑提交
从这里有两步我们就可以看出,revert命令会讲文件修改为目标版本的上一个版本,也就是撤销了修改及add、commit

小结

其实到这里,我还是有点懵逼的,但是基本的效果大概有了一定了解

git reset --hard

毁灭性质的直接将版本重置到指定版本的状态,直接删除指定版本的commit内容,同时如果本地有修改内容话也会丢失
事了拂衣去,并不会留下通常能查到的版本记录,仅能在git reflog查询

git reset --soft

只告诉Git将其他的commit重置到HEAD,并不影响工作区文件
同样不会保留常规log

git revert

这其实算是一个进度往前走的逆向提交,也就是说HEAD版本及提交记录将会继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

大概就是这么多浅显理解,还有很多不足,希望能够在今后的常规使用中逐渐加深理解!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Add & Commit git init 初始化一个 Git 仓库(repository),即把当前所在目录变成...
    冬絮阅读 4,924评论 0 9
  • 一、基本概念: 注:对于git的分布式概念及其优点,不重复说明,自己百度或谷歌。本文中涉及到指令前面有$的,在cm...
    大厂offer阅读 1,456评论 0 3
  • 以下笔记主要参考gitgot,大致了解git使用和原理。 第一部分我们从个人的视角去研究如何用好Git,并且揭示G...
    carolwhite阅读 2,430评论 0 1
  • 其实使用git已经有两年多时间了,但是对Git的概念一直懵懵懂懂,平时常用的命令就那么几个,而且大部分的时候都是直...
    Claire_wu阅读 613评论 0 5
  • 天津最著名的打卡景点应该就是天津之眼了,一个建设在大桥上的摩天轮,估计也是仿造伦敦眼的概念,有意思的是天津之眼周边...
    溜溜达达走走阅读 336评论 0 0