如果我使用
git rebase --interactive
并将一行设为“编辑”,我可以说
git reset HEAD^
git add -p
git commit -m "First part."
git commit -a -m "Second part."
换句话说,我拆分了一个提交。不幸的是,这会为两个新提交创建当前时间戳,这使得历史看起来很有趣。有没有办法让新提交共享它分裂的时间戳?
答案 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。)