今天我们来介绍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一次反悔的机会的更多相关文章

  1. 用xshell操作linux系统的常用命令

    (1)命令ls——列出文件 ls -la 给出当前目录下所有文件的一个长列表,包括以句点开头的“隐藏”文件 ls a* 列出当前目录下以字母a开头的所有文件 ls -l *.doc 给出当前目录下以. ...

  2. 你一定要知道的关于Linux文件目录操作的12个常用命令

    写在前面: 1,<你一定要知道的关于Linux文件目录操作的12个常用命令>是楼主收集的关于Linux文件目录操作最常用的命令,包括文件或目录的新建.拷贝.移动.删除.查看等,是开发人员操 ...

  3. Git操作简单入门及相关命令

    说明:本文内容主要来自文末参考链接内容,此文仅作学习记录.如有转载,请到文末参考链接处. 1 基本概念理解 1.1 Git介绍 Git是分布式版本控制系统. 集中式VS分布式,SVN VS Git. ...

  4. shell编程系列23--shell操作数据库实战之mysql命令参数详解

    shell编程系列23--shell操作数据库实战之mysql命令参数详解 mysql命令参数详解 -u 用户名 -p 用户密码 -h 服务器ip地址 -D 连接的数据库 -N 不输出列信息 -B 使 ...

  5. git plumbing 更加底层命令解析-深入理解GIT

    原文: http://rypress.com/tutorials/git/plumbing 本文详细介绍GIT Plumbing--更加底层的git命令,你将会对git在内部是如何管理和呈现一个项目r ...

  6. android Git命令家底儿及Git数据通信原理详解

    声明:本文为CSDN原创投稿文章,未经许可,禁止任何形式的转载. 现在大部分使用的都是SVN,也有一部分迁移了Git,虽然挺好的,不过还有其它很多版本控制的工具,并没有谁最好用,最重要的是适合自己的公 ...

  7. Windows Git Bash命令行下创建git仓库并更新到github

    大二的时候就听过老师说有一个叫git的版本管理工具,当时只是听老师说说而已,也没有去使用它,因为当时用过svn,就感觉自己没多少东西需要git管理. 最近几天,我经常在开源中国看别人的帖子,看到别人对 ...

  8. git 命令 查看历史提交 git log

    怎么理解git commit 命令 git commit 相当于 我们虚拟机快照操作,每次执行commit命令 相当于对本地仓库做一次快照,保存了当时仓库的状态, git commit -m 加上的& ...

  9. 在本地用命令行创建一个git仓库,并推送到远程

    首先,进入的gitStore目录下(没有的话自己创建一个) 1.git init 在gitStore目录下 初始化一个git仓库 2.git add 复制一个文件到gitStore目录下,然后执行gi ...

随机推荐

  1. 54.Qt-将界面程序封装成动态库DLL

    1.生成dll 然后选择创建共享库: 创建好后,修改pro文件,改为下面两句(这样就可以创建界面了):  然后修改sharedlib.h: #ifndef SHAREDLIB_H #define SH ...

  2. Springboot项目集成JPush极光推送(Java SDK)

    1.由于项目的需求,需要在Android APP上实现消息推送功能,所以引用了极光推送(官网:https://www.jiguang.cn/, 文档:http://docs.jiguang.cn/) ...

  3. 快速解读linq语法

    在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在fore ...

  4. 提取swagger内容到csv表格,excel可打开

    swagger生成的页面api接口统计,有几种方法 直接在前端用js提取出来,较麻烦(不推荐,不同版本的页面生成的标签有可能不一样,因此可能提取不出来) //apilet a = document.g ...

  5. centos7虚拟机时间和本地时间相差8小时

    安装ntp和ntpdate 在安装centos7虚拟机的时候,已经将时区设置为了Asia/shanghai,但还是出现时间不准,相差了8小时 可以安装ntp和ntpdate,使用 NTP 公共时间服务 ...

  6. python 读取文件时报错UnicodeDecodeError

    python 读取文件时报错UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multib ...

  7. 初试Python

    01 Python简介 Python是一种跨平台的计算机程序设计语言.于1989年开发的语言,创始人范罗苏姆(Guido van Rossum),别称:龟叔(Guido). python具有非常多并且 ...

  8. 为Linux的文件管理器创建“在此打开终端”菜单

    有些Linux的GUI文件管理器没有右键菜单"在此打开终端",或者有却不能自行指定某种终端. 因为文件夹也有其MIME类型(inode/directory),通过文件关联的方式,把 ...

  9. linux(centos8):使用tree命令查看目录结构

    一,tree命令的用途 tree命令以树状图列出文件目录结构 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest 对应的源 ...

  10. nginx配置laravel lumen重写

    location / { try_files $uri $uri/ /index.php?$query_string;}