学会这三个命令,你就不再是git只会用三板斧的菜鸟了

liumengyanysu 2020-10-22

 前言

在之前的文章当中我们介绍了最基本的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展示,所以用一个官方的例子展示给大家:

相关推荐