如果我通过git rebase --interactive拆分提交,如何保留时间戳?

时间:2014-04-02 09:03:11

标签: 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."

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

2 个答案:

答案 0 :(得分:6)

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

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

全部放在一起

执行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提醒。)

答案 1 :(得分:4)

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

大概你想要设置“作者日期”(也许也可以是“提交者日期”,但也许不是)。下面的方法足以设置两者(使用GIT_COMMITTER_DATE设置另一个日期)。

所以,使用原始方法(单独git reset):

$ export GIT_AUTHOR_DATE=$(git log -1 --pretty=format:%ad)

您现在可以执行reset HEAD^并提交;当你完成后一定要:

$ 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."

(这些例子假设一个像sh或bash一样工作的shell。)