几乎每个开发者都说过这句话:“查一下 git 日志,全都在里面。”提交日期、作者、差异对比,看起来就像一条无可辩驳的时间线,记录着谁在什么时候写了什么。
但它不是。一旦你需要证明一段代码的作者归属或创作先后——无论是和前合伙人发生纠纷、涉及知识产权的不当解职,还是授权或专利争议——你就会发现,git 日志远没有它看上去那么可靠。
提交日期只是一个可以随意改写的字段。git commit --date 允许你在创建提交时设置任意日期。结合 git rebase -i、手动编辑或 --committer-date-is-author-date 参数,就能彻底重写历史。而 git filter-branch 和它更现代的替代工具 git filter-repo,能在几秒内批量修改大量提交的日期和作者信息。
Git 本身没有任何机制阻止你今天创建一个日期被标注为“三个月前”的提交。Git 是一个版本控制系统,不是时间证明系统。它从不为这种用途设计,这本身没问题,前提是你明白它真正保证的是什么。
强制推送会不留痕迹地抹除历史。如果仓库没有设置明确的分支保护规则,git push --force 会直接覆盖远程历史。昨天还存在于 main 分支上的内容,今天可能就彻底消失——没有任何警告,也不会在其他地方留下记录。GitHub 会短暂保留 reflog,但这并非保障,reflog 会被清理,fork 的仓库可能不同步。如果一场纠纷最终闹上法庭,“或许还能在 GitHub 的日志里找到”绝对不是你想依赖的证据。
更关键的是,任何拥有写权限的人都可以在事后重写历史。在创始人、团队成员之间,如果两个人对同一个仓库都有写入权限,那么两人都实际具备改写共享历史的能力。Git 不会验证“谁先想出来”,它只验证“当前数据库中有什么”,而这个数据库对任何有推送权限的人都是可变的。当纠纷是真实的——不是假设——那么“谁的 git 日志更可信”本身就成了争议的一部分,而不是解决争议的依据。
GPG 签名的提交也只能解决一部分问题。签名提交(git commit -S)确实能证明一个持有特定密钥的人确认了特定内容。这很有价值,但它没有解决时间问题。签名本身并不携带经过独立验证的时间戳,它只能确认“内容”而非“实际创建的时间”——如果提交日期这个可以被改写的字段是在签名前设置的,那签名根本无法保证时间。
要真正证明创作先后,你需要一个纠纷双方都无法控制的时间戳——一个在任何人产生造假动机之前,就已经记录了内容哈希的独立第三方。这就是过去公证人对纸质文件所做的事情,也是 RFC 3161 时间戳机构(TSA)对数字数据所做的事:一个独立、经过加密验证的证明,把内容和时间固定在某个不可篡改的节点上。这才是 git 日志无法提供的、真正有法律效力的证据。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.