Git高级操作-日志
使用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图形表示的分支合并历史
筛选
按数量
-n
显示前n条log按日期
时间段可以使用绝对时间表示,如“2018-8-3”,也可用相对时间表示,如“yesterday”、“1 week ago”
--since --until
和--after --before
是一个意思,都可以用1
2
3
4
5git 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按作者
--author=
- 比如
git log --author=“John"
,显示John贡献的commit - 注意:作者名不需要精确匹配,只需要包含就行了
- 而且:可以使用正则表达式,比如
git log --author="John\|Mary”
,搜索Marry和John贡献的commit - 而且:这个
--author
不仅包含名还包含email, 所以你可以用这个搜索email
- 比如
按commit描述
--grep=
- 比如:
git log --grep="JRA-224"
- 而且:可以传入
-i
用来忽略大小写 - 注意:如果想同时使用
--grep
和--author
,必须在附加一个--all-match
参数
- 比如:
按文件
--(空格)或[没有]
- 有时你可能只对某个文件的修改感兴趣,你只想查看跟某个文件相关的历史信息, 你只需要插入你感兴趣文件的路径就可以了
- 比如:
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文件夹下所有文件的提交记录
按分支
--
--branchName
branchName为任意一个分支名字,查看某个分支上的提交记录- 需要放到参数中的最后位置处
- 如果分支名与文件名相同,系统会提示错误,可通过
--
选项来指定给定的参数是分支名还是文件名- 比如:在当前分支中有一个名为v1的文件,同时还存在一个名为v1的分支
git log v1 --
此时的v1代表的是分支名字(--后边是空的)git log -- v1
此时的v1代表的是名为v1的文件git log v1 -- v1
代表v1分支下的v1文件
按内容
-S"<string>"、-G"<string>"
- 有时你想搜索和新增或删除某行代码相关的commit. 可以使用这条命令
- 假设你想知道Hello, World!这句话是什么时候加入到项目里去的,可以用:
git log -S"Hello,World!"
- 另外:如果你想使用正则表达式去匹配而不是字符串, 那么你可以使用
-G
代替-S
. - 这是一个非常有用的debug工具, 使用他你可以定位所有跟某行代码相关的commit. 甚至可以查看某行是什么时候被copy的, 什么时候移到另外一个文件中去的
- 注:
-S
后没有”=”,与查询内容之间也没有空格符
按范围
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分支中的提交记录
按标签
git log v1.0
- 直接这样是查询标签之前的commit
- 加两个点
git log v1.0..
查询从v1.0以后的提交历史记录(不包含v1.0)
按commit
git log commit
查询commit之前的记录,包含commitgit log commit1 commit2
:查询commit1与commit2之间的记录,包括commit1和commit2git log commit1..commit2
:同上,但是不包括commit1- 其中,commit可以是提交哈希值的简写模式,也可以使用HEAD代替
- HEAD代表最后一次提交,
HEAD^
为最后一个提交的父提交,等同于HEAD~1
HEAD~2
代表倒数第二次提交
过滤掉merge commit
--no-merges
- 默认情况下
git log
会输出merge commit
. 你可以通过--no-merges
标记来过滤掉merge commit,git log --no-merges
- 另外,如果你只对merge commit感兴趣可以使用
—merges
,git log --merges
- 默认情况下