前言

在之前的文章当中我们介绍了最基本的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. CentOS 7使用PuppeteerSharp无头浏览器注意事项

    环境: CentOS 7.6.1810 .net core 3.1 PuppeteerSharp 2.0.0 1.如网络部稳定可以提前下载需要的chromium 下载地址:https://storag ...

  2. js中模拟移动端长按效果

    我们都知道 js 是有onmousedown(鼠标按下事件)和onmouseup(鼠标抬起事件),刚开始我的思路是 鼠标抬起时间减去鼠标按下时间 var oDiv = document.getElem ...

  3. st表、RMQ和LCA

    int lca(int x,int y) { if(de[x]<de[y]) swap(x,y); int d=de[x]-de[y]; for(int i=log2(d);i>=0;i- ...

  4. 【Processing-日常3】等待动画1

    之前在CSDN上发表过: https://blog.csdn.net/fddxsyf123/article/details/79755976

  5. @ComponentScan比较

    ComponetScan 定义扫描规则 value:指定要扫描的包 excludeFilters=Filter[] 指定扫描的时候按照什么规则排除哪些组件. includeFilters=Filter ...

  6. OpenCV图像处理学习笔记-Day1

    OpenCV图像处理学习笔记-Day1 目录 OpenCV图像处理学习笔记-Day1 第1课:图像读入.显示和保存 1. 读入图像 2. 显示图像 3. 保存图像 第2课:图像处理入门基础 1. 基本 ...

  7. EM 算法 Expectation Maximization

  8. macOS使用ABP.vNext Core开发CMS系统(一) 让程序跑起来

    macOS使用ABP.vNext Core开发CMS系统(一) 让程序跑起来--2020年10月5日 国庆假期,陪老婆的同时也不能忘记给自己充充电,这不想搞个CMS系统,考虑自己的时间并不多,所以想找 ...

  9. 009 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 03 什么是变量?

    009 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 03 什么是变量? 什么是变量? 形象化的生活中的例子理解什么是变量以及变量的三个元素 我们可以根据客人要求 ...

  10. requests基本用法

    首先,确认一下:已安装 requests 从一些简单的示例开始吧. 发送请求 使用 Requests 发送网络请求非常简单. 一开始要导入 Requests 模块: >>> impo ...