重置概念
git重置就是将git log中的提交版本回退到前面一个提交版本,下图打印git log的数据显示:
可以看到当前处于b17fd1…提交ID,而我们如果想要回退到上一个版本即f5b8c…提交ID所处版本,这时候就需要使用重置命令
重置测试
首先我们进行如下提交
echo "git reset test" > reset.txt
git add reset.txt
git commit -m "git reset test commit"
然后查看commit提交日志
在当前工作目录中也自然会存在reset.txt文件,这时候如果我们想要回退到前面一个版本,也就是创建reset.txt文件之前,我们可以使用命令:git reset --hard HEAD^
,结果提交日志如下
下面将开始git reset的深入理解
重置:git reset的深入理解
重置命令git reset是git最常用的命令之一,同时也是最危险最容易误用的命令,首先来看看它的语法:
1.git reset [-q] [<commit>] [--] <paths>...
2.git reset [--soft| --mixed| --hard| --merge| --keep] [-q] [<commit>]
首先看commit参数,它是可选的,可以使用引用(如HEAD^)或者提交的ID做为值,表示对应的HEAD版本,如果省略则表示使用HEAD的指向作为提交ID(在前面就是使用HEAD^即上一次提交做为提交ID的)
第一种语法的作用是用指定提交状态下的文件来替换掉暂存区中对应的文件,即:git reset head index.txt相当于取消之前之前的git add index.txt命令时改变的暂存区,第一种语法不会重置引用
第二种语法则会重置引用,并且可以根据不同的参数有选择的对暂存区或者工作目录进行重置:
1.使用参数–hard:git三个区域都会发生改变:替换成指定提交状态下的文件
2.使用参数–soft:只会更改引用的指向,暂存区和工作目录不会发生改变(此时进行git commit等同于取消重置)
3.使用参数–mixed(默认):会更改引用的指向和暂存区,不会改变工作区
来具体看看下面命令的作用
git reset:等同于git reset head,默认是更改引用指向和暂存区的,不过这里重置到head相当于没有重置
git reset – index.txt:等同于git reset head index.txt,仅仅将index.txt的改动撤出暂存区,即进行git add index.txt命令的反向操作
git reset –hard HEAD^:重置三个区的修改,回退到head^版本即上一个版本
重置的重置
前面我们说重置命令是最危险的命令,这是因为重置一旦发生,它所重置的提交对应的所有数据都将不复存在,包括ID。而这个时候如果我们想要对重置操作进行重置,该怎么办呢?可以通过reflog来挽救错误的重置
git提供了一个git reflog命令,使用show子命令可以查看当前对版本库进行的操作,它用于查看日志文件,但是和查看日志文件最大不同在于显示的顺序,git reflog的第一条日志显示的是最近的更新操作。
在使用git reflog打印出了版本库的最近提交操作之后,我们依然可以使用git reset进行重置,不过和前面的重置命令有所区别,它的结构:git reset --hard <refname>@{<n>}
,表示重置到响应的日志位置
git reflog的输出中还提供了一个表达式:@{},表是引用refname之前第n次改变时的sha1哈希值。下面我们来进行git reflog简单的回退重置操作
git reflog测试
首先搭建已重置环境,系列git命令如下:
echo "git reflog test" > ref.txt
git add ref.txt
git commit -m "git reflog test commit"
git reset --hard head^
来看下git reset之前和之后的log日志(主要关注他的提交ID)