git权威指南总结三:git重置

来源:互联网 发布:域名如何别名解析 编辑:程序博客网 时间:2024/06/05 02:24

重置概念

git重置就是将git log中的提交版本回退到前面一个提交版本,下图打印git log的数据显示:

这里写图片描述

可以看到当前处于b17fd1…提交ID,而我们如果想要回退到上一个版本即f5b8c…提交ID所处版本,这时候就需要使用重置命令


重置测试

首先我们进行如下提交
echo "git reset test" > reset.txtgit add reset.txtgit 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.txtgit add ref.txtgit commit -m "git reflog test commit"git reset --hard head^
来看下git reset之前和之后的log日志(主要关注他的提交ID)

这里写图片描述
这里写图片描述

接着调用git reflog查看提交日志git reflog show master | head -5(列出最近五次提交日志)

这里写图片描述

然后我们调用git reset 命令进行回退重置git reset --hard master@{1}

这里写图片描述

最终我们发现,它回到了重置之前的提交


git checkout检出

最后,简单的介绍一下git checkout检出命令的使用,该命令和git reset命令一样,同样会重写工作区,检出命令有三种用法,这里不做解释,简单列出几个常用的检出命令:
git checkout branchName:检出分支,更新head以指向名为branchName的分支(同时更新对应的暂存区和工作区)
git checkout:打印出git三个区域之间的差异,经常用来查看三个区域之间是否有差异,查看具体的差异经常使用git diff [head|–cached]
git checkout head:同上
git checkout – filename:用暂存区中的filename文件覆盖工作区的对应的文件相当于命令git add filename的反向操作
git checlout – .或者git checkout .:用暂存区中的所有文件覆盖工作区的所有文件,这条命令最危险,是不可逆命令,建议谨慎操作
git checkout branch – filename:用branch分支指向的提交中的filename替换暂存区和工作区中相应的文件,当前head指向不会改变
原创粉丝点击