使用git log命令查看日志信息,git log的命令形式如下

1
git log [<options>] [<since>..<until>] [[--] <path>...]

不带参数

直接输入git log,会按时间顺序由近到远,列出所有历史记录,显示提交对象的哈希值,作者、提交日期、和提交说明。
查看历史界面,可以使用Vim快捷键来翻页跳转搜索等操作,如需要了解所有的快捷键,按h即可进入帮助页。

显示

  • -p:按补丁显示每个更新间的差异,比下一条- -stat命令信息更全
  • --stat:显示每次更新的修改文件的统计信息,每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计
  • --shortstat:只显示–stat中最后的行数添加修改删除统计
  • --name-only:尽在已修改的提交信息后显示文件清单
  • --name-status:显示新增、修改和删除的文件清单
  • --abbrev-commit:仅显示SHA-1的前几个字符,而非所有的40个字符
  • --relative-date:使用较短的相对时间显示(例如:”two weeks ago”)
  • --graph:显示ASCII图形表示的分支合并历史

筛选

  1. 按数量
    -n
    显示前n条log
  2. 按日期

    时间段可以使用绝对时间表示,如“2018-8-3”,也可用相对时间表示,如“yesterday”、“1 week ago”
    --since --until--after --before是一个意思,都可以用

    1
    2
    3
    4
    5
    git log --until=1.minute.ago // 一分钟之前的所有 log
    git log --since=1.day.ago //一天之内的log
    git log --since=1.hour.ago //一个小时之内的 log
    git log --since=1.month.ago --until=2.weeks.ago //一个月之前到半个月之前的log
    git log --since ==2013-08.01 --until=2013-09-07 //某个时间段的 log
  3. 按作者

    --author=

    • 比如git log --author=“John",显示John贡献的commit
    • 注意:作者名不需要精确匹配,只需要包含就行了
    • 而且:可以使用正则表达式,比如git log --author="John\|Mary”,搜索Marry和John贡献的commit
    • 而且:这个--author不仅包含名还包含email, 所以你可以用这个搜索email
  4. 按commit描述

    --grep=

    • 比如:git log --grep="JRA-224"
    • 而且:可以传入-i用来忽略大小写
    • 注意:如果想同时使用--grep--author,必须在附加一个--all-match参数
  5. 按文件

    --(空格)或[没有]

    • 有时你可能只对某个文件的修改感兴趣,你只想查看跟某个文件相关的历史信息, 你只需要插入你感兴趣文件的路径就可以了
    • 比如:git log -- foo.py bar.py ,只返回和foo.py或bar.py相关的commit
    • 这里的--是告诉Git后面的参数是文件路径而不是branch的名字. 如果后面的文件路径不会和某个branch产生混淆, 你可以省略--,比如git log foo.py
    • 另外,后边的路径还支持正则,比如:git log *install.md 是,指定项目路径下的所有以install.md结尾的文件的提交历史
    • 另外,文件名应该放到参数的最后位置,通常在前面加上--并用空格隔开表示是文件
    • 另外,git log file/ 查看file文件夹下所有文件的提交记录
  6. 按分支

    --

    • --branchName branchName为任意一个分支名字,查看某个分支上的提交记录
    • 需要放到参数中的最后位置处
    • 如果分支名与文件名相同,系统会提示错误,可通过--选项来指定给定的参数是分支名还是文件名
      • 比如:在当前分支中有一个名为v1的文件,同时还存在一个名为v1的分支
      • git log v1 -- 此时的v1代表的是分支名字(--后边是空的)
      • git log -- v1 此时的v1代表的是名为v1的文件
      • git log v1 -- v1 代表v1分支下的v1文件
  7. 按内容

    -S"<string>"、-G"<string>"

    • 有时你想搜索和新增或删除某行代码相关的commit. 可以使用这条命令
    • 假设你想知道Hello, World!这句话是什么时候加入到项目里去的,可以用:git log -S"Hello,World!"
    • 另外:如果你想使用正则表达式去匹配而不是字符串, 那么你可以使用-G代替-S.
    • 这是一个非常有用的debug工具, 使用他你可以定位所有跟某行代码相关的commit. 甚至可以查看某行是什么时候被copy的, 什么时候移到另外一个文件中去的
    • 注:-S后没有”=”,与查询内容之间也没有空格符
  8. 按范围

    git log <since>..<until>

    • 这个命令可以查看某个范围的commit
    • 这个命令非常有用当你使用branch做为range参数的时候. 能很方便的显示2个branch之间的不同
    • 比如:git log master..feature,master..feature这个range包含了在feature有而在master没有的所有commit,同样,如果是feature..master包含所有master有但是feature没有的commit
    • 另外,如果是三个点,表示或的意思:git log master...test 查询master或test分支中的提交记录
  9. 按标签

    git log v1.0

    • 直接这样是查询标签之前的commit
    • 加两个点git log v1.0.. 查询从v1.0以后的提交历史记录(不包含v1.0)
  10. 按commit

    git log commit
    查询commit之前的记录,包含commit

    • git log commit1 commit2 :查询commit1与commit2之间的记录,包括commit1和commit2
    • git log commit1..commit2:同上,但是不包括commit1
    • 其中,commit可以是提交哈希值的简写模式,也可以使用HEAD代替
    • HEAD代表最后一次提交,HEAD^为最后一个提交的父提交,等同于HEAD~1
    • HEAD~2代表倒数第二次提交
  11. 过滤掉merge commit

    --no-merges

    • 默认情况下git log会输出merge commit. 你可以通过--no-merges标记来过滤掉merge commit,git log --no-merges
    • 另外,如果你只对merge commit感兴趣可以使用—mergesgit log --merges