Git 提交、历史与配置 · 定位历史、责任行与回归提交
定位历史、责任行与回归提交
先用 log 定位历史范围,再查 blame/annotate 或 bisect;作者与变更日志统计放在同组后半部分。
git log · 查看提交历史
- 按时间先后顺序列出当前仓库所有的提交,最近的更新排在最上面:
bash
git log- 查看指定文件或指定目录的历史,包括每次提交所引入的差异:
bash
git log {{[-p|--patch]}} {{路径/到/文件或目录}}- 显示每次提交的文件修改统计信息:
bash
git log --stat- 在日志旁以 ASCII 图形显示当前分支提交历史,并只展示提交消息的第一行:
bash
git log --oneline --graph- 在日志旁以 ASCII 图形显示整个仓库的所有提交、标签、分支:
bash
git log --oneline --decorate --all --graph- 查看提交消息中包含特定模式(本例 -i 不区分大小写)的提交:
bash
git log {{[-i|--regexp-ignore-case]}} --grep {{字符串}}- 查看特定作者的最近 N 条提交:
bash
git log {{[-n|--max-count]}} {{数字}} --author "{{作者}}"- 查看两个日期之间的提交(yyyy-mm-dd):
bash
git log --before "{{2017-01-29}}" --after "{{2017-01-17}}"git blame · 显示文件每一行的最后修改者和提交哈希值
- 显示文件的每一行,包含作者名字和提交哈希值:
bash
git blame {{路径/到/文件}}- 显示文件的每一行,包含作者邮箱和提交哈希值:
bash
git blame {{[-e|--show-email]}} {{路径/到/文件}}- 显示文件在指定提交时的每一行,包含作者名字和提交哈希值:
bash
git blame {{commit}} {{路径/到/文件}}- 显示文件在指定提交之前的每一行,包含作者名字和提交哈希值:
bash
git blame {{commit}}~ {{路径/到/文件}}- 显示指定行范围内的作者名字和提交哈希值信息:
bash
git blame -L {{start_line}},{{end_line}} {{路径/到/文件}}- 忽略空白字符和行移动:
bash
git blame -w -C -C -C {{路径/到/文件}}git annotate · 显示文件中每一行的提交哈希值和最后修改作者
参见
git blame(推荐优先使用该命令)。 提供git annotate主要是为了照顾熟悉其他版本控制系统的用户。 更多信息:https://git-scm.com/docs/git-annotate。
- 打印文件内容,并在每行前附加作者姓名和提交哈希值:
bash
git annotate {{路径/到/文件}}- 打印文件内容,并在每行前附加作者邮箱和提交哈希值:
bash
git annotate {{[-e|--show-email]}} {{路径/到/文件}}- 仅打印匹配正则表达式的行:
bash
git annotate -L :{{正则表达式}} {{路径/到/文件}}git bisect · 使用二分查找定位引入错误的提交
Git 会自动在提交历史中来回跳转,逐步缩小问题提交的范围。 更多信息:https://git-scm.com/docs/git-bisect。
- 在已知有问题提交和已知正常提交(通常较旧)之间开始二分查找会话:
bash
git bisect start {{问题提交}} {{正常提交}}- 对
git bisect自动选中的每个提交进行测试后,标记为"正常"或"有问题":
bash
git bisect {{good|bad}}- 当
git bisect定位到问题提交后,结束二分查找会话并返回原分支:
bash
git bisect reset- 在二分查找过程中跳过某个提交(例如因其他问题导致测试失败的提交):
bash
git bisect skip- 显示当前二分查找的进度日志:
bash
git bisect loggit commits-since · 显示从指定时间点以来的提交记录
属于
git-extras一部分。 更多信息:https://github.com/tj/git-extras/blob/main/Commands.md#git-commits-since。
- 显示从昨天以来的所有提交:
bash
git commits-since {{yesterday}}- 显示从上周以来的所有提交:
bash
git commits-since {{last week}}- 显示从上个月以来的所有提交:
bash
git commits-since {{last month}}- 显示从昨天下午2点以来的所有提交:
bash
git commits-since {{yesterday 2pm}}git authors · 生成 Git 仓库的提交者列表
属于
git-extras的一部分。 更多信息:https://manned.org/git-authors。
- 将完整的提交者列表输出到标准输出,而不是写入到
AUTHORS文件:
bash
git authors {{[-l|--list]}}- 将提交者列表追加到
AUTHORS文件并用默认编辑器打开:
bash
git authors- 将提交者列表(不包含邮箱)追加到
AUTHORS文件并用默认编辑器打开:
bash
git authors --no-emailgit contrib · 显示指定作者的提交记录
属于
git-extras一部分。 更多信息:https://github.com/tj/git-extras/blob/main/Commands.md#git-contrib。
- 显示指定作者的所有提交哈希及对应提交信息:
bash
git contrib {{作者名}}git count · 统计提交总数
属于
git-extras的一部分。 更多信息:https://github.com/tj/git-extras/blob/main/Commands.md#git-count。
- 显示当前分支的提交总数:
bash
git count- 显示所有贡献者的提交数及总提交数(按作者统计):
bash
git count --allgit changelog · 从仓库提交和标签生成变更日志报告
属于
git-extras的一部分。 更多信息:https://manned.org/git-changelog。
- 更新现有文件或创建新的
History.md文件,包含自最新 Git 标签以来的提交信息:
bash
git changelog- 列出当前版本的提交:
bash
git changelog {{[-l|--list]}}- 列出从标签
2.1.0到现在的提交范围:
bash
git changelog {{[-l|--list]}} {{[-s|--start-tag]}} 2.1.0- 以美观格式列出标签
0.5.0到1.0.0之间的提交:
bash
git changelog {{[-s|--start-tag]}} 0.5.0 {{[-f|--final-tag]}} 1.0.0- 以美观格式列出提交
0b97430到标签1.0.0之间的提交:
bash
git changelog --start-commit 0b97430 {{[-f|--final-tag]}} 1.0.0- 指定
CHANGELOG.md作为输出文件:
bash
git changelog CHANGELOG.md- 完全替换当前变更日志文件的内容:
bash
git changelog {{[-p|--prune-old]}}git cliff · 高度可定制的变更日志生成工具
- 从 Git 仓库所有提交生成变更日志并保存到
CHANGELOG.md:
bash
git cliff > {{CHANGELOG.md}}- 从最新标签之后的提交生成变更日志并输出到标准输出:
bash
git cliff {{[-l|--latest]}}- 为当前标签对应的提交生成变更日志(需先使用
git checkout检出到一个标签):
bash
git cliff --current- 为尚未打标签的提交生成变更日志:
bash
git cliff {{[-u|--unreleased]}}- 在当前目录生成默认配置文件
cliff.toml:
bash
git cliff {{[-i|--init]}}git check-mailmap · 显示联系人的规范名称和电子邮件地址
- 查找与电子邮件地址关联的规范名称:
bash
git check-mailmap {{邮箱@example.com}}继续阅读
- Git完整实践与解答
- Git任务与配置
- Git任务与配置