【记录】Git|审阅一系列连续commit的方案

省流版本

由最旧的到最新的commit的信息以及diff信息打印方法如下:

git log -p --reverse 旧commit_id..新commit_id > diff.txt

将得到类似:

commit [id]
Author: ……
Date:   Sat May 2 20:05:05 2026 +0800

    [message]

diff --git a/文件 b/文件
index [id]..[id] 100644
--- a/文件
+++ b/文件
@@ -1,4 +1,6 @@
+……

详细版本

1. 需求场景

在代码审查或追溯问题时,经常需要查看从某个旧 Commit 到某个新 Commit 之间所有提交的详细变更。典型场景包括:

  • 审查某个功能分支从创建到合并的所有改动
  • 定位某个 Bug 是在哪个具体提交引入的
  • 生成某个开发周期的完整 Patch 用于离线审阅

2. 核心命令解析

2.1 指令拆解
git log -p --reverse 旧commit..新commit > 输出文件
参数作用
git log查看提交历史
-p (或 --patch)显示每次提交的完整 diff(即代码变更内容)
--reverse按时间正序输出(旧的在前,新的在后)。不加此参数时,Git 默认从新到旧倒序显示
旧commit..新commit指定提交范围,包含从旧之后到新之间的所有提交(不包含旧本身)
> 文件将原本输出到终端的内容重定向到文件中
2.2 范围语法的细节
  • A..B:表示从 A 之后(不包含 A)到 B(包含 B)的提交。
  • 包含端点:如果希望同时包含旧 Commit 本身的 diff,使用 A~1..BA^..B
  • 反向范围B..A 会得到相反顺序的提交(新到旧),此时通常需要配合 --reverse 使用。
2.3 输出文件的内容结构

执行命令后,生成的 .txt 文件会按提交顺序依次包含:

  1. 每个 Commit 的元信息(Hash、作者、日期、提交消息)
  2. 该 Commit 引入的具体代码差异(diff 格式)
  3. 重复上述结构直到覆盖范围内所有提交

3. 常见变体与对比

需求命令说明
包含旧 Commit 本身git log -p --reverse 旧commit~1..新commit > diff.txt使用 ~1^ 将范围左端扩展一个父提交
只看文件名和统计信息git log --stat --reverse 旧commit..新commit > stat.txt不输出具体代码,适合快速了解修改范围
只输出 Commit 消息和 Hashgit log --oneline --reverse 旧commit..新commit > list.txt获得简洁的提交清单
生成可直接应用的 Patch 文件git format-patch 旧commit..新commit --stdout > all.patch输出标准 Patch 格式,可用 git am 重新应用
查看最终累积差异(非逐次)git diff 旧commit..新commit > total_diff.txt忽略中间提交,只看开始和结束的代码差异

4. 实操示例

假设你有以下提交历史:

9fe85d8 (新) 修复登录超时问题
a3b2c1d 优化缓存策略
6cf7d38 (旧) 添加用户认证模块

执行命令

git log -p --reverse 6cf7d38..9fe85d8 > review.txt

结果
review.txt 会先显示 a3b2c1d 的 diff,再显示 9fe85d8 的 diff。不会包含 6cf7d38 本身的变更。

如果要包含 6cf7d38

git log -p --reverse 6cf7d38~1..9fe85d8 > review_with_base.txt

5. 注意事项

  1. 输出文件较大时的处理:如果两个 Commit 之间跨度很大,生成的 diff 文件可能达到几十 MB。建议使用 less 或编辑器分页查看,或先用 --stat 评估变更规模。
  2. 合并提交的处理:合并提交的 -p 输出会比较复杂(展示冲突解决过程)。如果只需要普通提交,可加上 --no-merges 排除合并提交。
  3. 文件编码:输出的 .txt 文件通常是 UTF-8 编码,Windows 用户用记事本打开可能乱码,推荐使用 VS Code 或 Notepad++。
  4. git show 的区别git show commit 只能查看单个提交,范围比较时必须使用 git log -p
  5. 完整 Commit Hash:示例中使用的短 Hash(如 6cf7d38)是缩写,实际应确保在本地仓库中唯一。建议使用完整 Hash 以避免歧义。

6. 扩展技巧

6.1 结合 grep 过滤特定文件
git log -p --reverse..新 -- 文件名 > 单个文件的diff.txt
6.2 按作者过滤
git log -p --reverse --author="张三"..> 张三的变更.txt
6.3 排除格式变更(仅关注代码逻辑)
git log -p --reverse -w..> 忽略空白变更.txt

7. 总结

核心要点说明
主力命令git log -p --reverse 旧..新 > 文件
包含起点使用 旧~1..新
获得最终差异(非逐次)git diff 旧..新 > 文件
生成 Patchgit format-patch 旧..新 --stdout > 文件

审阅一系列连续 Commit 的核心在于理解 git log -p 配合范围语法的组合,--reverse 保证了时间顺序的可读性。掌握这些命令后,无论是代码审查、问题追溯还是生成补丁,都能高效完成。

本账号所有文章均为原创,欢迎转载,请注明文章出处:https://shandianchengzi.blog.csdn.net/article/details/160823681。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐