最简命令是git log --oneline,每行输出缩写sha和提交信息,仅限当前分支、无图形或跨分支干扰,适合快速导出纯文本历史。

git log 导出纯文本历史最简命令
直接用 git log --oneline 就能生成紧凑可读的文本记录,每行一个提交,格式是 SHA缩写 提交信息。它默认只输出当前分支,不带多余元数据,适合快速存档或粘贴到文档里。
常见错误是加了 --graph 或 --all 却没意识到会混入 ASCII 图形或跨分支内容,导致文本不可直接导入其他工具。如果只要干净列表,别加这些参数。
-
git log --oneline -n 50限制导出前 50 条,防止单次输出过长 -
git log --oneline --since="2024-01-01" --until="2024-06-30"按日期范围过滤,避免拉全量历史 - 导出到文件:用
git log --oneline > history.txt,注意不要漏掉重定向符号
导出含作者、时间、完整 SHA 的结构化文本
当需要审计或迁移时,--pretty=format: 是唯一可控方式。它绕过默认模板,按需拼接字段,且输出严格为纯文本,无换行干扰。
容易踩的坑是误用 %h(短 SHA)代替 %H(完整 SHA),后者在做 Git 对象校验时不可替代;另外 %ad 默认用系统本地时区,若需 UTC 统一时间,得加 --date=iso-utc。
- 推荐命令:
git log --pretty=format:"%H|%an|%ad|%s" --date=iso-utc > full_history.csv - 字段间用
|分隔,方便后续用 Excel 或脚本解析,避免逗号引发 CSV 解析错乱 - 如需包含父提交哈希(用于构建 DAG 关系),加
%P字段,但注意每个提交可能有多个父提交,会以空格分隔
导出指定分支的完整历史(不含 merge 提交)
执行 git log branch-name 默认包含所有可达提交,但 merge 提交会把其他分支历史也拖进来,导致重复和干扰。真正“该分支独有”的提交,要用 --first-parent。
这个参数只追踪第一个父提交(即主干合并路径),忽略从其他分支 merge 进来的 commit,对 release 分支或 feature 分支回溯特别有用。不加它,git log main 可能吐出几十个你不关心的 hotfix 提交。
git log --first-parent --oneline main > main-only.txt- 如果目标是对比两个分支差异再导出,先用
git log main..feature定位独有提交,再套--pretty格式化 -
--no-merges看似合理,但它只是过滤掉 merge 类型的提交,不解决 merge 带来的上游污染问题,不如--first-parent精准
Windows 下重定向中文提交信息乱码问题
Git 默认用 UTF-8 写日志,但 Windows cmd 默认编码是 GBK,直接 git log > out.txt 会导致中文变乱码,Notepad 打开全是问号。PowerShell 也不自动处理,得手动指定输出编码。
根本原因不是 Git,而是 shell 的 stdout 编码协商失败。解决方案不是改 Git 配置,而是绕过 shell 编码层,让 Git 直接写文件。
- 用
git log --pretty=format:"%s" | iconv -f utf-8 -t gbk > history_gbk.txt(Linux/macOS 有 iconv) - Windows PowerShell 中:运行
git log --pretty=format:"%s" | Out-File -Encoding UTF8 history.txt - 最稳办法:用 Git Bash,它默认 UTF-8,
git log --oneline > history.txt直接可用
导出文本这件事本身很简单,难的是导出的内容是否真反映你想要的那个“分支历史”——是线性演进?还是包含所有合并痕迹?要不要排除 cherry-pick?这些判断比命令本身更重要。











