前言

在之前的文章当中我们介绍了最基本的git add、git commit和git push的用法以及基本原理,还介绍了gitignore文件的设置方法,从而让我们可以使用git add .来添加我们想要的文件,而不必要手动区分。

今天我们继续来介绍几个git当中常用并且重要的命令,它们分别是git diff,查看提交历史的git log。

git diff

git diff是一个非常好用的命令,很多大牛都用它查看代码的改动,因为它的确非常方便。git diff命令可以查看当前工作区与暂存区的差别,也就是说可以查看到当前我们修改或者是添加的,但是还没有add进暂存区的代码。它会列出改动前后的对比,方便我们进行查看和修改。

比如我随便找了个repo运行了一下git diff,后面没有加上任何参数,我从结果当中截取了一个片段如下:

由于我配置了zsh,它会高亮显示修改前后的内容对比。比如在上面这个例子当中,我们删除了一行,添加了两行。我们可以很方便地查看前后的改动,方便我们检查修改的逻辑是否有出错。

git diff + 文件路径

当然git diff如果不加任何参数的话,会默认展示所有的文件改动,有时候我们改动的量比较大,看起来也会比较累。这个时候我们可以加上文件名,查看一下某一个文件具体的改动。比如上面例子当中的改动,发生在一个shell文件当中,我可以直接运行git diff shell/prepare_data.sh,也就是这个shell文件对应的路径,会发现其他的改动都看不到了。

git diff --cached

前面说了,我们在不加任何参数的情况下查看的是工作区(add命令之前)的代码和暂存区的差别,如果我们已经把所有代码都add进来了,那么当我们运行git diff是不会显示任何东西的。比如我们在刚才的仓库先把所有代码提交一下,再来运行git diff结果如下:

可以看到刚才所有的改动都没了,这是因为我们已经把代码提交到暂存区了,不加参数的时候是比较的工作区和暂存区的差别。这个时候我们再想看diff,想看的其实是暂存区和本地git仓库的差别,也就是已经add了还没commit的改动。这个时候我们可以通过--cached参数来实现,--cached参数后面同样可以再跟上文件名,查看某一个具体的文件。

比如当我们执行git diff --cached shell/prepare_data.sh之后,刚才的改动就又重新展示出来了。

其他用法

除了刚才提到的方法之外,git diff还有一些其他的用法。比如还可以和一个确定的提交,另外一个分支进行比较。这些命令相对不太常用,我们简单列举一下:

# 比较工作区和某一个提交的差别
git diff <commitid> # 比较工作区和某一个提交某一个文件的差别
git diff <commitid> <filepath> # 比较暂存区和某一个提交的差别
git diff --cached <commitid> # 比较暂存区和某一个提交某一个文件的差别
git diff --cached <commitid> <filepath>

git log

git log大家可能有所耳闻,即使没有也不难从名字当中猜出用途,它可以展示出当前分支上所有的提交。

比如当我在存放git文章的repo下运行git log,就可以查看到之前的提交记录:

log当中有两处比较重要的信息,我都用红笔高亮了出来。其中一个是commit后面跟着的一长串,这个是commit id,它在git仓库当中是唯一的,我们可以用它来锁定一个commit。比如刚才上面提到的git diff和某一个commit比较,传入的commitid就是这个。

我们没必要复制全部的id,因为太长了,实际上git有自动补全功能,我们一般复制前面几位就可以了。比如git diff dfd55就足够了,git会根据我们输入的几位查找到符合条件的commit,一般来说前几位就足够锁定一个commit了。

第二个关键信息就是提交信息,也就是我们每次commit -m之后后面输入的字符串,也就是表示这个commit当中的改动改动了什么,这个是开发者写的,也是比较关键的提示信息。

git log -p

当我们运行git log的时候只会展示提交相关的信息,是不会把每一次改动的内容都展示出来的,一则没有必要,二则未免太多了。但是有的时候我们会希望看到每一个commit当中改动的究竟是什么,如果通过git diff一个一个查看也太麻烦了。这个时候就可以用上参数来实现这点,只需要在git log后面加上-p,它就会展示出每一个commit中的改动

其实我们从头部的日志信息也可以看得出来,它底层也是通过git diff实现的。由于commit当中的改动量可能很大,所以我们这样查看到的内容也会非常多。我们可以在-p后面再加上一个-n表示我们想要查看的最近几条commit信息,比如git log -p -2查看的就是最近两条提交信息。

git log --stat

有的时候(比如HR根据代码确定绩效)我们只是想要查看每一次commit到底有多少改动量,而不想知道具体的改动是什么,这个时候就可以使用stat参数。

它会告诉我们这个commit中每一个文件做的改动有多少,方便我们查看具体到文件的变更。

git log --pretty

pretty这个参数是一个神器,它可以支持让我们自己diy我们想要看到的log展示。比如常用的是git log --pretty=oneline,这里的oneline是一种格式,表示单行展示,也就是会把commit展示的信息压缩成一行。

我们可以看到它省略了author、时间等信息,仅仅保留了commitid和comment信息。这种一般用在排查问题的时候,想要快速找到某一个commit。除了oneline之外,官方还提供了其他几种format,比如short、full、fuller这三种,这三者展示的信息略有差别,大家可以自行尝试一下。

最后介绍一种牛叉的用法,就是我们自己来定义我们想要的输出结果。举个例子,比如我想要看到的log日志当中应该包含commitid,提交时间,作者以及comment。那么我们就可以自己定义出一种格式:%h - %ad - %an - %s。这样我们执行的命令就是:

git log --pretty=format:"%h - %ad - %an - %s"

得到的结果会是:

这正是我们想要的,这里的%h, %ad其实也是官方提供的参数,他们分别表示一种信息。比如%h表示短commitid,%ad表示提交时间,%an表示作者信息,%s表示提交时的comment。当然可选的参数不止这些,官方提供了一个表格,表格当中的参数都可以选择。

git log还有一种参数的用法是--graph,可以展示出提交的一个树形分支结构。也是非常非常好用的,但是我找不到合适的repo展示,所以用一个官方的例子展示给大家:

除了上面介绍的功能之外,git log还有一些其他的功能,相对来说不是很常用,就不赘述了。感兴趣的同学可以去查看一下官方文档,体会一下git命令的强大。

总结

怎么样,今天介绍的git diff和git log命令都学会了吗,是不是有一种看起来简单其实学起来还挺复杂的感觉?其实是非常正常的,因为git是面向所有开发者的,不同的开发者有不同的习惯,总有些人有些自己特殊的需求。所以git也就被设计的非常复杂和强大,可以实现各种功能,我们也没必要全部学会,根据日常的需要进行取舍,一部分重点学习,其他的泛泛了解即可。

衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发

原文链接,求个关注

本文使用 mdnice 排版

- END -

{{uploading-image-496861.png(uploading...)}}

学会这三个命令,你就不再是git只会用三板斧的菜鸟了的更多相关文章

  1. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  2. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  3. linux下查看当前用户的 三个命令

    linux下查看当前用户的 三个命令 1,whoami; 2,id -un; 3,who -H  可以列出当前所有的    NAME (用户名)    LINE (窗口列表)    TIME(开启时间 ...

  4. iOS:使用Github托管自己本地的项目代码方式三(命令行方式: Terminal Line)

    使用终端命令行将本地项目代码上传到github上进行托管 对于IOS开发者来说,Github的使用是必须要掌握的一种技能,而把项目由本地上传到Github有多种方式 1.开发工具Xcode配置Git, ...

  5. [转]Linux中set,env和export这三个命令的区别

    转自:http://www.2cto.com/os/201306/223758.html Linux中set,env和export这三个命令的区别   set命令显示当前shell的变量,包括当前用户 ...

  6. 三个命令解决ASTGO服务器重启后各种问题

    SSH 命令方式登录到服务器,依次执行下面三个命令. service httpd restart service mysqld restart safe_asterisk 前面两个命令提示无效,尝试从 ...

  7. Hexo系列(三) 常用命令详解

    Hexo 框架可以帮助我们快速创建一个属于自己的博客网站,熟悉 Hexo 框架提供的命令有利于我们管理博客 1.hexo init hexo init 命令用于初始化本地文件夹为网站的根目录 $ he ...

  8. 命令行操作svn和git和git

    前几天在写代码的时候电脑突然坏掉,老大交代的任务没完成,非常痛恨自己用svn或者git保存代码,相信很多程序员遇到过,硬盘坏掉,存在硬盘中的代码丢失,无法找回的问题,svn和git可谓程序员界的福音, ...

  9. git常用命令总结--廖雪峰老师Git教程命令总结

    学习了廖雪峰老师的Git教程之后的命令总结,重点关于git和远程仓库的东西. 如果没有学过,这是传送门 下面这个图很重要 一.git初始化本地仓库和配置 echo "想输入到文件的内容,一般 ...

随机推荐

  1. WPF相关UI库

    免费控件库: 1.Extended WPF Toolkit 官方拓展控件 http://wpftoolkit.codeplex.com/ 2.avalondock 可停靠布局(wpf toolkit包 ...

  2. Java操作Elasticsearch 之 [Java High Level REST Clientedit]

    1. 简述 Elasticsearch 是基于 Lucene 开发的一个分布式全文检索框架,向 Elasticsearch 中存储和从 Elasticsearch 中查询,格式是json. 向 Ela ...

  3. ZooKeeper学习(二)ZooKeeper实现分布式锁

    一.简介 在日常开发过程中,大型的项目一般都会采用分布式架构,那么在分布式架构中若需要同时对一个变量进行操作时,可以采用分布式锁来解决变量访问冲突的问题,最典型的案例就是防止库存超卖,当然还有其他很多 ...

  4. 刷题[SUCTF 2018]GetShell

    解题思路 进入upload,发现有源码,代码审计 代码审计 大概意思就是,读取我们上传的文件,截取第五位之后的内容,与黑名单不匹配才能上传成功 我传的是一个空的txt文件,发现会变成php文件,那好办 ...

  5. tomcat在linux下安装

    1.下载地址: https://tomcat.apache.org/download-90.cgi 2.上传linux 3.查看是否上传成功 4.解压: 5.进入后,查看README.md文件,可以查 ...

  6. Kubernetes K8S之存储Secret详解

    K8S之存储Secret概述与类型说明,并详解常用Secret示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 ...

  7. Oracle12c 使用总结

    /*创建临时表空间 */create temporary tablespace BBB tempfile 'D:\APP\oracle\oradata\orcl\BBB.dbf' size 500m ...

  8. Go-missing return at end of function

    where? Go程序中函数在执行的时候 why? 函数有返回参数,但是函数没有return关键字,报错 way? 添加return返回函数需要返回的参数

  9. python单元测试框架pytest

    首先祝大家国庆节日快乐,这个假期因为我老婆要考注会,我也跟着天天去图书馆学了几天,学习的感觉还是非常不错的,这是一篇总结. 这篇博客准备讲解一下pytest测试框架,这个框架是当前最流行的python ...

  10. Java知识系统回顾整理01基础04操作符04位操作符

    一.位操作符 位操作符在实际工作中用的并不常见,但是我比较纠结这些位操作.所以实际练习位操作符的每一个操作符的操作实例来理解其具体含义. 建议: 如果确实感兴趣,就看看,个人建议跳过这个章节. 真正工 ...