Git-基础-查看提交历史 或 Git-Basics-Viewing-the-Commit-History
显示提交的统计信息
# 简略文件修改统计信息$ git log --stat## 其余提交信息省略,不再这里显示src/components/containers/LeadCockpit/LeadCockpit.js | 20 ++++++++++++++------1 file changed, 14 insertions(+), 6 deletions(-)# 只显示文件的数量信息$ git log --shortstat1 file changed, 14 insertions(+), 6 deletions(-)# 仅在提交信息后显示修改的文件名## --name-only$ git log --name-onlyfc8d7104 (HEAD -> dev) feat(LeadCockpit): 获取年份数据接口添加交互效果src/components/containers/LeadCockpit/LeadCockpit.js# 显示文件名以及文件的修改状态;如添加、删除、修改$ git log --name-statusfc8d7104 (HEAD -> dev) feat(LeadCockpit): 获取年份数据接口添加交互效果M src/components/containers/LeadCockpit/LeadCockpit.js
筛选 Commit 历史
其他筛选:数量、作者、是否 merge、commit 信息
# -<n> 按数量## 显示最近的 5 条信息$ git log -5# pattern## --author=<pattern>: 输出指定用户的提交,接受正则表达式## --committer=<pattern>$ git log --author="Name"$ git log --author="John\|Mary" 或者 "John|Mary"# merge 信息$ git log --no-merges$ git log --merges# 按 commit 描述信息## -i 忽略大小写git log --grep="msg"
按时间段筛选
# 按日期## --after(--since) 当前日期及之后的 Commit## 时间完整的格式是 "2020-7-1 00:24",时间字符串中缺省的时间段默认是当前时间,包含时分秒### 相对时间或绝对时间都是距此时此刻计算的### 如 7-1 00:00 代表 2020-07-01 00:00$ git log --after="2020-7-1"## --before(--until) 当前日期之前
日期规则
- 时间完整的格式是
2020-7-1 00:24。时间字符串中缺省的时间段默认是当前时间(年月日 时分秒) - 相对时间或绝对时间都是距此时此刻计算的, 如现在是
2021-08-13 09:41- 使用
--after="1 day ago" === --after="2021-08-12 09:41" - 使用
--after="7-1" === --after="2021-07-01 09:41"
- 使用
- 时分秒,最好精确到时分,否则可能不准确(原因还没摸清楚)
其他的日期格式还有
- today
- yesterday
10 (day|week|month) ago
按文件筛选
筛选出所有指定文件变化的提交。
# 按文件: 可以指定多个文件$ git log -- foo.py foo1.py# 按文件夹## foo 文件夹下$ git log -- foo/
按文件内容筛选
你可能需要知道某个字符串是什么时候被添加到提交历史中的。
默认是区分大小写。可以通过 -i 忽略大小写。
# 按提交文件中的内容## -S<string>## -G<regex> 使用正则匹配$ git log -S "Hello,Word"
VsCode GitLens 插件:在 SourceControl 中底部 SEARCH & COMPARE+ -> Search Commits... -> Search by Changes change: patteren or -:pattern
TODO: 搜索出的结果与 git log -S/-G 数量不一样,待查
特定场景示例
查看 Junio Hamano 在 2008 年 10 月间,除了合并提交之外的哪一个提交修改了测试文件:
$ git log --pretty="%h - %s" --author='Junio C Hamano' --since="2008-10-01" \--before="2008-11-01" --no-merges -- t/5610e3b - Fix testcase failure when extended attributes are in useacd3b9e - Enhance hold_lock_file_for_{update,append}() APIf563754 - demonstrate breakage of detached checkout with symbolic link HEADd1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths51a94af - Fix "checkout --track -b newbranch" on detached HEAD
自定义 log 的输出格式
$ git log --pretty=format:"参数"$ git log --oneline --format="作者-%an ; 提交-%cn"
$ git log --pretty=format:"%Cred%an - %ar%n %Cblue %h -%Cgreen %s %n"
常见的 format 的参数有
#选项 #说明%n 新行%% 原始的百分号%H 提交对象(commit)的完整哈希字串%h 提交对象的简短哈希字串%T 树对象(tree)的完整哈希字串%t 树对象的简短哈希字串%P 父对象(parent)的完整哈希字串%p 父对象的简短哈希字串%an 作者(author)的名字%ae 作者的电子邮件地址# date format 格式(除了%z 和 %Z),是由系统的 strftime 处理的%ad 作者修订日期(可以用 -date= 选项定制格式)%ar 作者修订日期,按多久以前的方式显示%cn 提交者(committer)的名字%ce 提交者的电子邮件地址%cd 提交日期%cr 提交日期,按多久以前的方式显示%s 提交说明%d ref 名称,就像 git log 的 --decorate 参数%D ref 名称不带括号,只是用逗号分隔
作者(Author、修订者)和提交者(Committer)的关系:
- 作者是程序的修改者,提交者是将工作成果提交进仓库的人
- 正常情况(git commit)下作者和提交者是一个人
- 当执行发布补丁、cherry-pick、rebase 等操作时,提交者就变成执行当前操作的人

生成 ChangeLog 日志
待测试
https://www.cnblogs.com/linkstar/p/10274943.html
https://libery.cn/2019/11/18/git-commit-message-generate-changelog/
https://juejin.im/post/6844904147892830221
资料
官方文档:git log
https://www.yiibai.com/git/git_log.html
博客:https://www.cnblogs.com/bellkosmos/p/5923439.html

