git深入理解(四):git log详解

Show commit logs 用来查看commit日志

git log -h
usage: git log [<options>] [<revision-range>] [[--] <path>...]
   or: git show [<options>] <object>...

    -q, --quiet           suppress diff output
    --source              show source
    --use-mailmap         Use mail map file
    --decorate-refs <pattern>
                          only decorate refs that match <pattern>
    --decorate-refs-exclude <pattern>
                          do not decorate refs that match <pattern>
    --decorate[=...]      decorate options
    -L <n,m:file>         Process line range n,m in file, counting from 1
普通输出
$ git log

commit 818c5faf28d0a0e5c8133dbd77dd24e6e70db9bf (HEAD -> master)
Author: phprao <ruFMskQ0>
Date:   Tue Dec 8 10:49:12 2020 +0800

    aaaaaaa

commit 2e1b4bced0f0ce2c20362789be2878b36c6910f7
Author: phprao <ruFMskQ0>
Date:   Mon Dec 7 16:14:20 2020 +0800

    add t4

commit 8262ea4e39ea80dc56056a667e9dbdcd235efc08
Author: phprao <ruFMskQ0>
Date:   Mon Dec 7 15:22:32 2020 +0800

    add t3

commit f2b85bf7f7516a6a6a0768e44266d09414b03a2e
Author: phprao <ruFMskQ0>
Date:   Mon Dec 7 15:10:04 2020 +0800

    2

commit 01d308a7ef190b881969ea9b9112424819ab346a
Author: phprao <ruFMskQ0>
Date:   Mon Dec 7 14:24:03 2020 +0800

	first commit
简化输出
$ git log --oneline
818c5fa (HEAD -> master) aaaaaaa
2e1b4bc add t4
8262ea4 add t3
f2b85bf 2
01d308a first commit

或者

$ git log --pretty=oneline
818c5faf28d0a0e5c8133dbd77dd24e6e70db9bf (HEAD -> master) aaaaaaa
2e1b4bced0f0ce2c20362789be2878b36c6910f7 add t4
8262ea4e39ea80dc56056a667e9dbdcd235efc08 add t3
f2b85bf7f7516a6a6a0768e44266d09414b03a2e 2
01d308a7ef190b881969ea9b9112424819ab346a first commit

HEAD -> master表示当前HEAD处在这个分支下的这个commit。

指定输出行数
$ git log --pretty=oneline -3
818c5faf28d0a0e5c8133dbd77dd24e6e70db9bf (HEAD -> master) aaaaaaa
2e1b4bced0f0ce2c20362789be2878b36c6910f7 add t4
8262ea4e39ea80dc56056a667e9dbdcd235efc08 add t3
限定指定日期范围的log
$ git log --pretty=oneline --after='12-8-2020 00:00:00'
818c5faf28d0a0e5c8133dbd77dd24e6e70db9bf (HEAD -> master) aaaaaaa

–since --before --until --after

不填时分秒则为当前时刻。

输出具体变动内容

-p:控制输出每个commit具体修改的内容,输出的形式以diff的形式给出。

$ git log -p --pretty=oneline --after='12-8-2020 00:00:00' 
818c5faf28d0a0e5c8133dbd77dd24e6e70db9bf (HEAD -> master) aaaaaaa
diff --git a/q/w/t4.txt b/q/w/t4.txt
index 9513262..052e4e1 100644
--- a/q/w/t4.txt
+++ b/q/w/t4.txt
@@ -1 +1 @@
-t4
\ No newline at end of file
+t4xx
\ No newline at end of file

同样是用来看改动的相对信息的,--stat-p的输出更简单一些

查看某次提交的改动

git show命令同git log -p输出类似,只不过它只显示一个commit的内容,如果不指定commit hash, 它默认输出HEAD指向commit的内容.

$ git show
commit 818c5faf28d0a0e5c8133dbd77dd24e6e70db9bf (HEAD -> master)
Author: phprao <ruFMskQ0>
Date:   Tue Dec 8 10:49:12 2020 +0800

    aaaaaaa

diff --git a/q/w/t4.txt b/q/w/t4.txt
index 9513262..052e4e1 100644
--- a/q/w/t4.txt
+++ b/q/w/t4.txt
@@ -1 +1 @@
-t4
\ No newline at end of file
+t4xx
\ No newline at end of file

指定某个提交

$ git show 6f43203cf463dc5320916f96abef0f1ad63428fd
commit 6f43203cf463dc5320916f96abef0f1ad63428fd (b1)
Author: phprao <ruFMskQ0>
Date:   Tue Dec 8 10:12:28 2020 +0800

    xx

diff --git a/q/w/t4.txt b/q/w/t4.txt
index 052e4e1..dab0730 100644
--- a/q/w/t4.txt
+++ b/q/w/t4.txt
@@ -1 +1,2 @@
-t4xx
\ No newline at end of file
+t4xx
+cccccccc
\ No newline at end of file
git shortlog

这个命令用来输出汇总信息,以作者进行分类。

$ git shortlog
phprao (5):
      first commit
      2
      add t3
      add t4
      aaaaaaa

git shortlog -s:可以用来统计每个作者的commit数量

git shortlog -n:可以用来对统计的量进行倒序排列

输出给定的用户提交

--author用来过滤commit,限定输出给定的用户

$ git log --pretty=oneline --author='phprao'
818c5faf28d0a0e5c8133dbd77dd24e6e70db9bf (HEAD -> master) aaaaaaa
2e1b4bced0f0ce2c20362789be2878b36c6910f7 add t4
8262ea4e39ea80dc56056a667e9dbdcd235efc08 add t3
f2b85bf7f7516a6a6a0768e44266d09414b03a2e 2
01d308a7ef190b881969ea9b9112424819ab346a first commit
控制是否显示merge的commit

–merges或者–no-merges

–decoreate

该参数用来控制log输出时,显示对应commit所属的branch和tag信息

图形化地表示出分支合并历史

–graph

$ git log  --pretty=oneline --graph
*   faa4214bc342ade5693a7efc8a64e869965c039e (HEAD -> master) fix conflict
|\
| * 6f43203cf463dc5320916f96abef0f1ad63428fd (b1) xx
| * adda355046920ae91118cf42ec2f45190b0ec89c test
* | 818c5faf28d0a0e5c8133dbd77dd24e6e70db9bf aaaaaaa
|/
* 2e1b4bced0f0ce2c20362789be2878b36c6910f7 add t4
* 8262ea4e39ea80dc56056a667e9dbdcd235efc08 add t3
* f2b85bf7f7516a6a6a0768e44266d09414b03a2e 2
* 01d308a7ef190b881969ea9b9112424819ab346a first commit
输出指定分支的提交记录

git log branchname

$ git log b1 --pretty=oneline
6f43203cf463dc5320916f96abef0f1ad63428fd (b1) xx
adda355046920ae91118cf42ec2f45190b0ec89c test
2e1b4bced0f0ce2c20362789be2878b36c6910f7 add t4
8262ea4e39ea80dc56056a667e9dbdcd235efc08 add t3
f2b85bf7f7516a6a6a0768e44266d09414b03a2e 2
01d308a7ef190b881969ea9b9112424819ab346a first commit

git log --oneline branch1 ^branch2可以查看在分支1,却不在分支2中的提交.^表示排除这个分支

$ git log master ^b1 --pretty=oneline
faa4214bc342ade5693a7efc8a64e869965c039e (HEAD -> master) fix conflict
818c5faf28d0a0e5c8133dbd77dd24e6e70db9bf aaaaaaa
根据comment信息过滤

–grep

$ git log --pretty=oneline --grep=test
adda355046920ae91118cf42ec2f45190b0ec89c test

默认情况下, git log --grep --author是OR的关系,即满足一条即被返回,如果你想让它们是AND的关系,可以加上–all-match的option

查看某个文件的提交记录
git log -- a/b/c.txt
查看某个文件的改动内容

比如你刚拉取了代码,发现其他人有提交改动,你想看看某个文件在最近一次提交改动了啥。

git log -p a/b/c.txt

会以倒序的方式以commit为单位列出此文件的改动内容,也就是最近的改动在前面;但是如果我只想看最近的一次呢。可以设置显示数量-1

git log -p -1 a/b/c.txt

我们知道git show也能显示改动内容,所以也可以这么写,但是这样貌似麻烦了一点。

git show afb2b79f3165b7ac570878a874b4dd236107c783 a/b/c.txt
关于gitk-图形化查看提交记录

的确在查看提交记录的时候,纯文本的表示方式在阅读的时候效率有点低,尤其是当提交记录越来越多的时候,这是和SVN的直观式的图形界面相比,比如有一个场景,我想查看某次提交修改了哪些文件(而不关心修改的内容),我可以使用 git show 或者 git log -1 -p 但是他们都会 diff并输出具体的变动内容,然后我需要一直翻到最后才行看完,效率很低,而我只需要它给我列出修改了哪些文件即可。此时可以使用 gitk命令来更好的查看。

可以理解为 gitk <==> git log 后面的参数和 git log 一样,凡是 git log 可以用的选项也都能用在 gitk 上。
比如

gitk

gitk -3

gitk --author='phprao'

...

gitk 会弹出一个窗口图形化的展示提交记录
git深入理解(四):git log详解_第1张图片
如果出现gitk中文乱码问题,打开git的配置文件(根据自己安装的git目录,此处为安装在D盘):D:\Program Files\Git\etc\gitconfig
在文件内追加以下内容:

[gui]
encoding = utf-8

你可能感兴趣的:(杂项)