如果你在GitHub上查看每次提交的时间,然后运行git log
,你会发现远程和本地repo之间的提交时间完全相同,即使你在git commit
之后几分钟运行git push
。git如何告诉存储库上述提交的时间?
一旦您为该提交运行git commit
,就会记录时间。推送仅使用本地提交更新github,因此不保留推送的时间。
编辑:如果您询问具体的机制,那么时间只会随着提交、更改、消息和作者/贡献者一起传递。
让我们看看实际提交的内部。以下是Git存储库中针对Git本身的提交:
$ git cat-file -p HEAD | sed 's/@/ /'
tree 8f78544663a8f3e9e3d4ee9125cf54a863498bfb
parent b4e245a17adc1b336269f7350e88eede6e713157
author Junio C Hamano <gitster pobox.com> 1605735205 -0800
committer Junio C Hamano <gitster pobox.com> 1605735205 -0800
Sixth batch
Signed-off-by: Junio C Hamano <gitster pobox.com>
任何提交的组件都是:
- 每个文件的完整快照:这是通过
tree
行间接存储的 - 元数据,包括提交人的姓名:在这里,我们可以在
author
行看到一些元数据,在committer`行看到一些
元数据包括提交的父级的原始哈希ID;这里,有一个父级,其散列ID显示在(单个(parent
行上。元数据可以包括额外的标题行,但在这里,在标准tree
、parent
、author
和committer
之后,我们只看到主题(Sixth batch
(和正文,由第一组标题行之后的空行抵消。
(间接存储tree
的一个原因是Git可以重用它。例如,一个不更改任何内容的合并提交,或者一个撤消前一次提交的恢复,将生成一个与前一次快照完全匹配的新快照。在这里,Git可以存储新提交,而不添加除新提交对象之外的任何内容。(
正如kevin robb所说,日期和时间戳是承诺本身的一部分。这些编码有点奇怪:自1970年1月1日00:00:00UTC以来,它们以秒的形式出现。这里是1605735205
秒,或者Wed Nov 18 21:33:25 UTC 2020
。我们还得到了一个时区偏移:-0800
。这是以小时和分钟表示的,以十进制表示,每个数字有两位,因此偏移量为格林尼治以西8小时,即太平洋标准时间。从晚上9点33分开始,花了8个小时,我们得到了下午1点33分,这确实是git log
显示的:
$ git log -n 1 | sed 's/@/ /'
commit faefdd61ec7c7f6f3c8c9907891465ac9a2a1475
Author: Junio C Hamano <gitster pobox.com>
Date: Wed Nov 18 13:33:25 2020 -0800
Sixth batch
Signed-off-by: Junio C Hamano <gitster pobox.com>
因为上面的是,并且将始终是哈希ID为faefdd61ec7c7f6f3c8c9907891465ac9a2a1475
的提交的确切数据,所以该提交的时间戳必须是我们刚刚看到的值:
$ (printf 'commit 279 '; git cat-file -p HEAD) | shasum
faefdd61ec7c7f6f3c8c9907891465ac9a2a1475 -
(279是由git cat-file -p HEAD | wc -c
找到的提交数据中的字节数(。
如果我们接受这个提交并将其更改为包含其他日期和时间戳,并通过Git的对象哈希器运行它,我们将获得其他哈希——一个哈希ID为而不是faefdd61ec7c7f6f3c8c9907891465ac9a2a1475
的提交。提交faefdd61ec7c7f6f3c8c9907891465ac9a2a1475
的日期为1605735205 -0800
。因此,任何提交了faefdd61ec7c7f6f3c8c9907891465ac9a2a1475
的Git存储库都带有日期和时间,而没有其他日期和时间。