Git中squash旧提交A、B时,如何保留新提交C、D、E的时间戳?
如何合并A和B提交且不修改C、D、E的时间戳
方法一:用参数全局保留原提交时间
启动交互式变基,目标覆盖A到E的提交历史:
git rebase -i --committer-date-is-author-date --root如果A不是仓库的第一个提交,把
--root替换成A的父提交哈希即可。在弹出的编辑界面中,将B提交行开头的
pick改成squash(或fixup,后者会丢弃B的提交信息),保持A提交行的pick不变。编辑后的内容大致如下:pick <A的哈希> A的提交信息 squash <B的哈希> B的提交信息 pick <C的哈希> C的提交信息 pick <D的哈希> D的提交信息 pick <E的哈希> E的提交信息保存并退出编辑器,Git会自动合并A和B,然后依次应用C、D、E提交,全程保留它们原有的作者日期和提交者日期。
方法二:手动指定单提交日期(精细控制场景)
如果不想全局设置日期参数,可在变基时为C、D、E单独指定原日期:
启动交互式变基:
git rebase -i --root将B的
pick改为squash,然后在C、D、E的每一行下方添加一行exec命令,替换<对应提交哈希>为C、D、E各自的哈希值:pick <A的哈希> A的提交信息 squash <B的哈希> B的提交信息 pick <C的哈希> C的提交信息 exec git commit --amend --no-edit --date="$(git show --format=%ai <C的哈希>)" pick <D的哈希> D的提交信息 exec git commit --amend --no-edit --date="$(git show --format=%ai <D的哈希>)" pick <E的哈希> E的提交信息 exec git commit --amend --no-edit --date="$(git show --format=%ai <E的哈希>)"保存退出后,Git会完成A和B的合并,重新提交C、D、E时会使用它们原本的提交日期。
注意事项
- 如果这些提交已经推送到远程仓库,变基后需要执行
git push --force强制推送,这会覆盖远程分支历史,务必提前和团队成员确认。 - 合并A和B后的新提交默认使用A的作者日期,你也可以在合并时手动修改提交信息和日期。
内容的提问来源于stack exchange,提问作者hammon5tl
相关产品推荐
相关产品推荐

