交互式Rebase后Git远程与本地提交日期不一致问题咨询
问题背景
我最近通过交互式变基(git rebase -i)将最新提交合并到master分支,用fixup把多个提交压缩成两个并丢弃多余提交信息,之后推送到GitHub的远程master分支。但发现远程仓库的提交日期和本地git log显示的不一致——远程分支的提交日期是变基及推送的日期,而非原提交日期,本地和远程的提交日期差异应该和变基操作有关。
本地git log输出:
% git log commit 09e76b90aa1c0c3f6a780c8b29b0c93dc2f57143 (HEAD -> master, origin/master) Author: John Doe <john@doe.com> Date: Wed Apr 12 13:23:12 2023 +0200 1st imputation success no interaction or random sl commit 2ef860eabd90dfff5197c66a3dbb541174e1146b Author: John Doe <john@doe.com> Date: Thu Mar 9 22:32:49 2023 +0800 First commit on Arch Linux
GitHub提交历史显示的提交日期为变基推送当天。
疑问
- 为何本地与远程分支的提交日期会出现差异?
- 是否可以调整Git/GitHub的设置使提交日期保持一致?
解答
1. 日期差异的核心原因
Git的每个提交包含两个关键日期:
- 作者日期(Author Date):是提交最初被创建的日期,也是本地
git log默认显示的Date字段。变基操作默认会保留这个原提交的时间。 - 提交者日期(Committer Date):是提交最终被写入仓库的日期。交互式变基时,Git会重新生成提交对象,新提交的提交者日期会被设置为变基操作执行的时间。
GitHub默认在提交历史页面展示的是提交者日期,而本地git log默认展示作者日期,这就是两者日期不一致的根本原因。你用fixup压缩提交时生成了新的提交对象,这些提交的提交者日期是变基当天,作者日期保留原时间,所以两边显示的日期不同。
2. 让提交日期保持一致的两种方法
方法一:修改GitHub的日期显示设置
在仓库的提交历史页面,点击右上角的齿轮图标(「Options」),找到「Date format」选项,选择「Author date」。这样GitHub就会和本地git log一样显示作者日期,日期就能保持一致。
方法二:变基时强制同步提交者日期
如果希望变基后的提交者日期和原提交的作者日期一致,可以在执行交互式变基时添加--committer-date-is-author-date参数:
git rebase -i --committer-date-is-author-date <目标分支名>
这个参数会让Git在生成新提交时,把提交者日期设置为原提交的作者日期,这样无论GitHub展示哪种日期,都会和本地的日期匹配。
如果已经完成变基并推送,想要修正远程分支的日期,需要执行强制推送(注意:若有其他协作者在使用该分支,强制推送会覆盖远程内容,务必提前沟通):
git push --force origin master
内容的提问来源于stack exchange,提问作者Pål Bjartan

