课下来自己动手试试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个版本记录
这里引入了一个log的新用法git log --oneline
,这个log命令能够让我们相对直观的看到最近的版本记录并标识出提交版本号
在这个情况下,我们的工作区和暂存区都是干净的,我们不想要第三次提交了,我们来试试三个命令的不同
git reset --hard
使用git reset --hard HEAD^这时候我们看到操作成功,我们来看一下对于文件产生了什么作用,首先查看a.md,并查看状态
git reset --hard HEAD^之后的a.mdreset --hard之后的status
我们能看到,reset --hard命令不仅将修改的文件变为了第二次提交的状态,并且不用我们再次commit
这时候我们再log --oneline看一下
我们看到,我们的第三次提交记录被抹去了,也就是说,reset --hard的作用差不多是完全重置到某个版本并且销毁提交记录,本能的感觉到这个操作比较危险,我们来看一下历史的log
git reflog可以看到我们当前的HEAD确实处于了第二次编辑提交的状态,按下不表,接着试试--soft
git reset --soft
之前的记录已经被毁了,但是通过查阅资料,我们是可以恢复的
git reflog及git reset --hard {版本号}我们从git reflog中可以看到,第三次编辑并提交的版本号为0379f9d,所以我们用--hard+版本号参数的命令回到三次编辑并提交的状态,接着尝试--soft
同样的,我们不想要第三次提交,希望回退到第二次提交
看到操作成功了, 但是并没有什么提示,那我们看看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
我们看到,操作成功了,并且自动打开了vim让我们编辑本次变动的提交信息,我们直接保存退出
操作成功后,查看status并查看a.md的状态
我们发现a.md被改变了,改成了一个奇怪的样子,到这里我已经完全懵逼了,,所以我觉得从头来一次纯净版本的revert
重新建立b.md并编辑提交3次
我们来直接试试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的内容。
大概就是这么多浅显理解,还有很多不足,希望能够在今后的常规使用中逐渐加深理解!
网友评论