如果通过git rebase(交互式)拆分提交,如何保留时间戳?

如果通过git rebase(交互式)拆分提交,如何保留时间戳?,git,split,timestamp,commit,rebase,Git,Split,Timestamp,Commit,Rebase,如果我使用 git rebase --interactive 我可以说,设置一行为“编辑” git reset HEAD^ git add -p git commit -m "First part." git commit -a -m "Second part." 换句话说,我拆分了一个提交。不幸的是,这会为两个新提交创建当前时间戳,这使得历史看起来很有趣。有没有一种方法可以让新提交共享其拆分的提交的时间戳?这是可能的,但并非完全不重要。您只需要从正在拆分的提交中提取时间戳,并将其放入两个新

如果我使用

git rebase --interactive
我可以说,设置一行为“编辑”

git reset HEAD^
git add -p
git commit -m "First part."
git commit -a -m "Second part."

换句话说,我拆分了一个提交。不幸的是,这会为两个新提交创建当前时间戳,这使得历史看起来很有趣。有没有一种方法可以让新提交共享其拆分的提交的时间戳?

这是可能的,但并非完全不重要。您只需要从正在拆分的提交中提取时间戳,并将其放入两个新的提交中

大概您想要设置“作者日期”(也可能是“提交人日期”,但可能不是)。下面的方法足够通用,可以同时设置这两个日期(使用
GIT\u COMMITTER\u DATE
设置另一个日期)

因此,使用原来的方法(分开
git reset
):

您现在可以执行
重置头^
并提交;完成后,请确保:

$ unset GIT_AUTHOR_DATE
这样就不会继续强制提交更多提交的作者日期


或者,
git commit--amend
为您重置并提交,并保留作者日期。因此,只有第二次提交会有不同的日期,您可以使用环境变量或
--date
选项覆盖该日期:

$ git rebase --interactive
...
$ git commit --amend -m "First part."  # WITHOUT git reset HEAD^
$ git commit --date="$(git log -1 --pretty=format:%ad)" -m "Second part."

(这些示例假设一个shell的工作方式类似于sh或bash。)

如果您使用的是最新版本的Git,则当前正在编辑的提交文件的SHA1在交互重新基址期间似乎存储在名为
.Git/rebase merge/amend
的文件中

此信息可以与
git commit-c/--reedit message=
结合使用,以便在编辑器中输入新消息并保留原始作者时间戳


把它们放在一起 执行git rebase--interactive,标记要编辑提交,然后

git reset HEAD^
git add -p
git commit -c $(cat .git/rebase-merge/amend)

# 1. edit commit message to say "first part" (editor seeded with original message)
# 2. save and quit

git commit -a -c $(cat .git/rebase-merge/amend)

# 1. edit commit message to say "second part" (editor seeded with original message)
# 2. save and quit

注意:如果您试图以可移植的方式或在脚本中执行此操作,则应使用
$(git rev parse--git dir)
而不是
.git


(感谢@torek的提醒。)

请注意,
.git/rebase merge/amend
的存在是不保证的:这个文件在git 2中是新的。在使用
git worktree add
创建的辅助工作树中,路径是不同的。要处理后者,请使用
$(git rev parse--git dir)
而不仅仅是
.git
。谢谢@torek!我只是自己发现了这件事,并没有意识到这一点。编辑。
git reset HEAD^
git add -p
git commit -c $(cat .git/rebase-merge/amend)

# 1. edit commit message to say "first part" (editor seeded with original message)
# 2. save and quit

git commit -a -c $(cat .git/rebase-merge/amend)

# 1. edit commit message to say "second part" (editor seeded with original message)
# 2. save and quit