操作失误不要慌,这个命令给你的Git一次反悔的机会
今天我们来介绍git当中两个非常非常好用的工具,git show和reflog。
这两个命令虽然不是必知必会,但是如果熟练使用可以极大地帮助我们查看代码仓库的问题,以及在我们操作失误的时候拯救我们。可以理解成应急技能,一般情况下用不到,关键时候会的话可以救命的那种。
git show
首先来聊聊git show,它解决了我们日常开发场景当中非常常见的一个问题,就是回看某一个提交的内容。我们通过git log只能阅读到commit的时候输入的提示语。但有些开发者不遵守规范,或者是提示语写得非常简略,我们很难get到其中的内容,还是得需要手动checkout过去查看内容,这就非常的不方便。
而有了git show工具之后,我们可以直接通过git show命令查看到代码层面的改动。
git show接收一个参数,表示具体的commit id,比如:
git show 40a91193d
那么git会自动展示出这个commit下所有的改动内容:

这个大家都很好理解,但是有一个小问题,就是我们怎么知道我们要看的提交的id呢?所以我们需要先查到commit id,才能git show,否则盲目乱show一通也很花时间。
查找commit id,我们之前介绍过,这里再简单提一下。一般来说有两种参数非常好用,第一种是--stat参数,它可以列举出每一个commit具体到文件级别的改动:

第二个参数是pretty=oneline,它可以将git的提交记录压缩成一行,方便我们快速查找提交时的备注。

我们之前介绍过,在git实现的内部,分支其实只是一个指向节点的指针。所以我们也可以用git show + 分支名的方法来查看某一个分支的改动,这样查找出来的改动是这个分支最后一个提交节点的。
比如:
git show test
展示的就是test这个分支最后一个提交的改动,如果我们想要查看test分支倒数第二个节点的改动呢?这就需要我们使用祖先引用了。我们之前也介绍过,我们有两种方法可以表示一个节点的祖先。第一种方法是使用^这个符号,它表示某个节点的父节点。这个符号是可以重复引用的,比如我们要选择倒数第三个节点,就可以写成test^^。
第二种方法就是使用~,它和^的意思是一样,一样表示父节点,但是它可以后面跟一个数字表示嵌套。举个例子,比如test^^它等价于test~2。
所以比如我们想要查看test分支倒数第三个节点的提交,我们只需要这样就可以了:
git show test~3
git reflog
今天我们要介绍的第二个功能叫做reflog,这是一个非常非常有用的功能,很多次救了我的命。
reflog是reference log的缩写,含义是引用日志,它会记录下HEAD节点和分支引用所指向的历史。我们可以使用git reflog命令来查看引用日志:

简单解释一下这个展示出来的日志,它最左侧一列表示commit id。它的第二列表示的是分支,也就是这个提交属于哪一个分支。第三列表示的是相对位置,也就是它相对于现在HEAD指针的位置。最后一列是信息,它记录的是HEAD指针移动的情况。
当我们使用reset或者是checkout等命令的时候,都会在这里留下记录。当我们想要反悔了,我们可以通过reflog迅速找到正确的位置。
这个经常出现,比如我们checkout到了一个过去的节点查看了一些代码,或者是使用了reset了过去的节点。当你查看完了想要回去的时候,你会发现你回不去了。使用git log只会展示再之前的日志,因为git log是以HEAD节点往前输出的。所以这个时候我们就只能查看reflog,找到我们checkout过来的commit id,然后再通过checkout将HEAD指针移动过去。
也就是说reflog给了你一次后悔的机会,这也是我们之前说的,只要是提交过的代码,一般情况下都不会丢失,因为我们还可以通过reflog进行查找。
今天的文章就到这里,怎么样,你学会了吗?如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发)
本文使用 mdnice 排版
{{uploading-image-815671.png(uploading...)}}
操作失误不要慌,这个命令给你的Git一次反悔的机会的更多相关文章
- 用xshell操作linux系统的常用命令
(1)命令ls——列出文件 ls -la 给出当前目录下所有文件的一个长列表,包括以句点开头的“隐藏”文件 ls a* 列出当前目录下以字母a开头的所有文件 ls -l *.doc 给出当前目录下以. ...
- 你一定要知道的关于Linux文件目录操作的12个常用命令
写在前面: 1,<你一定要知道的关于Linux文件目录操作的12个常用命令>是楼主收集的关于Linux文件目录操作最常用的命令,包括文件或目录的新建.拷贝.移动.删除.查看等,是开发人员操 ...
- Git操作简单入门及相关命令
说明:本文内容主要来自文末参考链接内容,此文仅作学习记录.如有转载,请到文末参考链接处. 1 基本概念理解 1.1 Git介绍 Git是分布式版本控制系统. 集中式VS分布式,SVN VS Git. ...
- shell编程系列23--shell操作数据库实战之mysql命令参数详解
shell编程系列23--shell操作数据库实战之mysql命令参数详解 mysql命令参数详解 -u 用户名 -p 用户密码 -h 服务器ip地址 -D 连接的数据库 -N 不输出列信息 -B 使 ...
- git plumbing 更加底层命令解析-深入理解GIT
原文: http://rypress.com/tutorials/git/plumbing 本文详细介绍GIT Plumbing--更加底层的git命令,你将会对git在内部是如何管理和呈现一个项目r ...
- android Git命令家底儿及Git数据通信原理详解
声明:本文为CSDN原创投稿文章,未经许可,禁止任何形式的转载. 现在大部分使用的都是SVN,也有一部分迁移了Git,虽然挺好的,不过还有其它很多版本控制的工具,并没有谁最好用,最重要的是适合自己的公 ...
- Windows Git Bash命令行下创建git仓库并更新到github
大二的时候就听过老师说有一个叫git的版本管理工具,当时只是听老师说说而已,也没有去使用它,因为当时用过svn,就感觉自己没多少东西需要git管理. 最近几天,我经常在开源中国看别人的帖子,看到别人对 ...
- git 命令 查看历史提交 git log
怎么理解git commit 命令 git commit 相当于 我们虚拟机快照操作,每次执行commit命令 相当于对本地仓库做一次快照,保存了当时仓库的状态, git commit -m 加上的& ...
- 在本地用命令行创建一个git仓库,并推送到远程
首先,进入的gitStore目录下(没有的话自己创建一个) 1.git init 在gitStore目录下 初始化一个git仓库 2.git add 复制一个文件到gitStore目录下,然后执行gi ...
随机推荐
- sqlserver 分列
sql server 数据库中某张表(Person)的数据信息是: ID Address 1 平山花园-4单元-12幢-203 2 香山花园-3单元-22幢-304 现在有需求是,将地址信息显示形式改 ...
- Flutter 开发从 0 到 1(四)ListView 下拉加载和加载更多
在<APP 开发从 0 到 1(三)布局与 ListView>我们完成了 ListView,这篇文章将做 ListView 下拉加载和加载更多. ListView 下拉加载 Flutter ...
- MeteoInfoLab脚本示例:格点数据散点图
绘制格点数据的散点图,用scaterm函数. 脚本程序: f = addfile('D:/Temp/GrADS/model.ctl') ps = f['PS'][0,(10,60),(60,140)] ...
- C++中线程安全单例模式的正确实现方式
为什么说DCLP不是线程安全的 DCLP(Double Checked Locking Pattern),即双检锁模式: class Foo { public: static Foo* getInst ...
- 如何写好 C语言 main 函数!你准备好编写 C 程序了吗?
学习如何构造一个 C 文件并编写一个 C main 函数来成功地处理命令行参数. 我知道,现在孩子们用 Python 和 JavaScript 编写他们的疯狂"应用程序".但是 ...
- Pyrhon-OS库
import os 导入OS模块 print(os.getcwd()) #获取当前路径 print(os.listdir()) #当前路径下文件信息 关于路径 Windows 下的路径采用 (\) 在 ...
- 子网划分和VLAN
子网划分 IP地址的结构和分类 根据tcp/ip协议,连接在Internet上的每个设备都必须有一个IP地址,它是一个32位二进制数,为了方便人类识别,我们将它用点分十进制表示,每8位分为一段. IP ...
- SSM中 web.xml配置文件
<!--核心监听器 当tomcat(web容器,应用服务器,web服务器)启动的时候创建spring 工厂类对象,绑定到tomcat上下文中 --> <listener> &l ...
- JUC---07解决集合线程不安全
一.ArrayList是线程不安全的,可以使用以下操作解决: 1.使用相同功能的集合类替换,比如Vector集合是线程安全的,他们实现的接口都是一样的,但是Vector类是在jdk1.0出现的,不推荐 ...
- 浅析软件测试人员如何对JVM进行内存溢出检测
一.什么是JVM,检测JVM的意义 JVM是java virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各 ...