版本回退Reset
先来介绍git命令回退,首先看下commit日志,你可以用命令 git log
查看,也可以在GitKraken查看
执行回退或者叫重置命令:
$ git reset <参数> <要回退到的版本>
这里要知道版本怎么填,在git中用 HEAD
表示当前最新版本,也就是上图log中的最后一次提交:
commit 3443e68f3fddef30c2667bdc3f80277651825ea1
回退到上一个版本就是 HEAD^
,上上个版本就是 HEAD^^
,一次类推,当然太多的话这样写就麻烦了,比如说前100个版本,可以这样写 HEAD~100
现在回退到上一个版本:
$ git reset --hard HEAD^
然后可以从GitKraken上看到版本回退了:
这里 --hard
是一个参数,还有两个常用的参数,先来看一张图:
这三个参数比较常用:
- –hard:直接将当前版本重置的干干净净,工作区和暂存区都完全重置,包括还没有提交的更改
- –soft:仅仅把HEAD只想要重置道德版本,将之前的版本保留在暂存区
- –mixed(默认参数):将之前的版本保留在工作区
所以用 --hard
的时候要小心
上图中红色箭头reset操作其实可以再加上一个从Stage/Index指向Working directory,也就是前面一节讲的从暂存区到工作区
说了这么多,对应在GitKraken上的操作在哪里呢?看下图:
在目标版本处右击就会看到,这里也只是列出了常用的三个参数。
还有两个参数是:--merge
和 --keep
,基本上不怎么用
不小心 –hard 了怎么办,还能不能回到之前的版本
不要着急,在命令行找到之前的log,找到你重置的版本的commit id
还是执行reset操作:
$ git reset --hard 99b95dbea... # 这个版本号可以不用填写完整,Git自动会去找,当然尽量多写几位
然后再去log中查看,可以看到之前被重置的版本又回来了
其实,在git内部有个指向当前版本的指针,当你执行回退操作的时候,只是把指针指向了另一个版本,所以你让HEAD指向哪个版本号,你就把当前版本定位在哪,这就方便多了。
当然还有一个问题,那就是假如我执行完回退操作后又把命令行关闭了,或者直接关机了,下次再来又想返回之前的版本怎么办?
不要急,还是有解决办法的,Git提供了一个命令 git reflog
用来记录你的每一次命令:
可以看到在重置之前的版本id为 99b95db
,那么现在可以执行git reset --hard 99b95db
来返回之前的版本。
不过以上的操作好像在GitKraken中不能进行,因为执行充值后log区域看不到之前版本的id,所以不能完全依靠它,我们有时候需要结合命令行使用。
本节小结
- git中的
HEAD
指向的版本就是当前的版本,使用命令git reset <--hard> commit ID
来改变HEAD
的指向。 - 通过
git log
命令可以查看提交历史,这里面有我们用到的commit ID,当然用GitKraken查看log会一目了然。 - 如果要返回之前的版本,但是之前的commit ID又给忘了,可以使用
git reflog
查看历史操作记录。
撤销、回退总结
至此,加上前两节的一些介绍,撤销、回退的常用常用操作已经介绍完毕,总结一下:
- 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,执行命令
git checkout -- <file>...
, 或者在GitKraken中点击Discard all changes
(如果是单个文件,就右击那个文件,点击Discard changes
)。 - 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD <file>...
,就回到了场景1,第二步按场景1操作,如果只是想从暂存区撤销,那只需执行第一步。 - 已经提交了不合适的修改到版本库时,想要撤销本次提交,就用本小结介绍的操作。