git 提交时间作者不对速查:日期错乱与六个根因
更新时间:2026-10-24。FAQ 速查页,面向
git log一翻发现提交时间对不上(显示成几小时前/后、甚至未来时间)、或者作者栏显示成别人、root@localhost、旧邮箱的同学。git 提交时间作者不对的含义一句话:每个提交里存着两套字段——author(谁最初写的)与 committer(谁把它写进历史),各自带名字、邮箱和时间戳;时间戳取自提交那一刻本机的系统时钟与时区,名字邮箱取自配置——机器时钟错了、配置配错层级、rebase 改写了 committer,历史里就留下对不上的记录。收敛在六根轴上:系统时钟或时区错、user.name/email 配错作用域(全局没配或仓库级覆盖错)、--amend与 rebase 改写了 committer 而保留 author、CI 构建机时钟漂移、把 author 与 committer 当成一回事看错字段、需要批量改写历史统一署名。本篇主线命令是git log --format=fuller——一条命令把两套字段全摆出来对质。
本文要回答的问题
git log显示的时间为什么和我提交的真实时间差几个小时?- 作者栏显示成
root或同事的邮箱,从哪里改? - rebase 之后作者变成我自己了,是 bug 吗?
- 已经推上去的错误署名怎么改?
- author 和 committer 到底有什么区别?
一、报错原文与典型现象
git 提交时间作者不对没有报错横幅,它是「历史记录说错了话」,典型现象如下(路径以 /proj/demo 占位):
$ git -C /proj/demo log --format=fuller -3
commit 8f3a21c9d0e4b7a1c5f2e6d8a9b0c1d2e3f4a5b6
Author: root <root@localhost.localdomain>
AuthorDate: Mon Oct 20 03:14:07 2026 +0000
Commit: root <root@localhost.localdomain>
CommitDate: Mon Oct 20 03:14:07 2026 +0000$ git -C /proj/demo log --oneline --format="%h %an %ae %ad"
a1b2c3d 张三 old-mail@example.com 2026-10-19 # 旧邮箱混进历史
e4f5g6h 张三 dev@example.com 2026-10-22$ date
Fri Oct 24 10:30:00 CST 2026
$ git -C /proj/demo log -1 --format="%cd"
Fri Oct 24 02:30:00 2026 +0000 # 差 8 小时,是时区显示差异读现象抓三个信号:fuller 格式里 Author 与 Commit 两套字段同时列出,谁不对一目了然;时间戳尾部带时区偏移(+0000、+0800),git log 默认按记录的原时区显示——和你本地时钟差整数小时多半只是显示口径,不是历史错了;署名错成 root@localhost 说明当时根本没配 user.name/email,git 拿系统用户名与主机名兜底拼了默认值。
二、病因处置速查表
| 报错现象 / 场景 | 可能原因 | 快速验证 | 处置 |
|---|---|---|---|
| 时间差整数小时 | 时区显示口径差异 | 看时间戳尾部 +HHMM 偏移 | 无需修,--date=local 按本地看 |
| 时间完全离谱/在未来 | 提交机系统时钟错 | date 对时 | 修时钟;已错的用 --amend 改 |
| 署名是 root/主机名 | user.name/email 未配 | git config user.email 空 | 配全局或仓库级署名 |
| 署名是旧邮箱/别人 | 仓库级配置覆盖错 | git config --list --show-origin | 修对应层级的配置 |
| rebase 后 Committer 变了 | rebase 重写提交的正常行为 | fuller 看 author 未变 | 无需修;保 committer 用 --committer-date-is-author-date |
| CI 产出的提交时间漂移 | 构建机时钟漂移 | CI 机 date 对时 | 修 NTP;构建机不配署名先修配置 |
三、排查决策图
下面这张图是标准排查路线,颜色按角色区分:红是现象入口与命中的根因,蓝是排查动作,绿是通过分支,橙是修复动作,紫是防复发沉淀。
读这张图抓主线顺序:第一步先用 fuller 格式把两套字段摆出来——很多「不对」其实只是看错字段或时区显示口径,根本不用修;确认是真错之后,时钟问题修机器、署名问题修配置、历史已错的才动 --amend 或批量改写。改写历史换哈希,放在最后一档,不动它也能活的场景就不动。
四、逐条排查展开
第一条:时区口径——最常见的虚惊。 git 把「时间戳 + 提交者本地时区偏移」一起存进提交,git log 默认按原时区原样显示。你在东八区、同事在 UTC 提交,看到的时间就差 8 小时。按本地时区看:
git -C /proj/demo log --date=local显示立刻对齐本地墙钟。历史本身没坏,什么都不用改。
第二条:系统时钟错——时间离谱或在未来。 提交那台机器时钟跑偏(虚拟机休眠恢复、主板电池没电、没开 NTP),写进历史的就是错误时间。先把机器时钟修对(开 NTP 同步),已经错进去的提交用 --amend 修正最近一笔:
git -C /proj/demo commit --amend --reset-author --no-edit--reset-author 会把 author 名字、邮箱、时间一起重置为当前配置与当前时间;只想改时间不想动署名时用 --date=now。更早的历史要改得走 rebase 或 filter-repo,代价随提交数线性涨。
第三条:署名是 root 或主机名——根本没配置。 git 找不到 user.name/email 时会拿系统账户与主机名拼一个兜底值(新版 git 会警告但仍允许提交)。验证与修复:
git -C /proj/demo config user.email # 空输出 = 没配
git config --global user.name "张三"
git config --global user.email "dev@example.com"配好只影响之后的提交,历史里 root@localhost 那几笔要靠第五条的办法改写。
第四条:配错层级——仓库级覆盖全局。 git 配置分系统、全局、仓库三层,仓库级优先。个人电脑上用全局配个人邮箱、在公司仓库目录里单独 git config user.email "work@example.com" 是标准用法;配反了就会出现「这个仓库全发的旧邮箱」。用 git config --list --show-origin 看每条值的来源文件,错在哪层改哪层。配置层级机制的更多坑见 git 配置解析失败速查。
第五条:rebase 与 amend 改写——author 保留、committer 必变。 rebase 是把旧提交「重新誊写」一遍:author(原作者与原时间)默认保留,committer 改成执行 rebase 的你与当下时间——这是设计行为不是 bug。代码评审平台按 committer 归因而显示「你改了别人的提交」时,可在 rebase 时加 --committer-date-is-author-date 让两个时间一致。要把历史里错误署名批量改成正确值,用:
git -C /proj/demo filter-repo --email-callback '
return email.replace(b"old-mail@example.com", b"dev@example.com")
'改写换全部哈希,需要强推与全员重克隆,动手前的备份纪律与 git 磁盘写满速查 里清历史一节同口径。
第六条:CI 机器时钟漂移与署名缺失。 自动化提交(文档站生成、版本号 bump)跑在构建机上:机器没开 NTP 时钟慢慢漂,提交时间越来越离谱;没配署名就落成 ci-bot@build-node 之类怪名。处置双管齐下:构建机时钟走 NTP,CI 脚本里显式 git -c user.name=bot -c user.email=bot@example.com commit ... 把署名钉死在命令行,不依赖机器配置。这类「环境里跑出来的提交不可复现」与 git 钩子与 CI 偶发失败速查 的环境差异同族。
五、规范做法与预防
- 所有机器时钟走 NTP:提交时间是机器时钟的快照,时钟错了历史永远错。
- 署名进 dotfiles 与装机脚本:新机器第一件事配全局 user.name/email,不留兜底默认值的机会。
- 公司/个人仓库分层配置:全局配个人身份,公司仓库目录级覆盖工作邮箱,互不污染。
- CI 署名钉在命令行:
-c user.name=... -c user.email=...随命令走,不依赖构建机环境。 - 改写署名历史前留备份:filter-repo 换全部哈希,整库镜像备份 + 团队窗口期再动手。
这一篇在知识体系里的位置
本篇是 Git 排错速查簇的历史署名篇,定位「时间与作者字段说错话」:配置层级与解析问题看 git 配置解析失败速查;CI 环境引发的诡异行为看 git 钩子与 CI 偶发失败速查;改写历史后推送被拒看 git 推送被拒速查;本批同簇的还有 git 磁盘写满速查 与 git index.lock 已存在速查;提交与历史的基础用法见 log、show、blame。
一句话总结
git 提交时间作者不对的本质是「提交那一刻的时钟与配置被永久写进历史」:先 git log --format=fuller 摆开 author 与 committer 两套字段对质,时区口径差异用 --date=local 看、署名错配修对应层级的 user.name/email、最近一笔错用 commit --amend --reset-author 修、批量历史错用 filter-repo 改写并全员重克隆。机器时钟走 NTP、署名进装机脚本、CI 署名钉在命令行,这类问题基本绝迹。