如何使用过去的提交日期压缩git中的提交?

Dou*_*oug 28 git git-rebase

所以,我有一个非常简单的用例; 我想从我的'今日工作'分支中压缩所有需要重新进入master的提交.

到目前为止,我一直在使用git rebase -i它,但它不能正常工作; 最终提交的时间戳不正确.

这是一个这样做的例子:

[work1] git checkout master
Switched to branch 'master'

[work1] git rebase today
First, rewinding head to replay your work on top of it...
Fast-forwarded master to today.

[work1] git log --pretty=format:"%h%x09%an%x09%ad%x09%s"
5ad95ff Doug    Wed Nov 7 10:12:42 2012 +0800   Updated TODO again
abb891c Doug    Wed Nov 7 10:12:24 2012 +0800   Added more work
c5fd35c Doug    Wed Nov 7 10:11:50 2012 +0800   Added more work
a98facd Doug    Wed Nov 7 10:11:22 2012 +0800   Add work
b4465be Doug    Tue Nov 6 21:38:53 2012 -0800   Updated TODO
403cea9 Doug    Fri Jan 2 21:38:53 2009 -0800   Added todo
Run Code Online (Sandbox Code Playgroud)

是的,现在我想把最后四次提交压缩成一次提交.

[work2] date
Wed  7 Nov 2012 10:39:39 WST

[work2] git rebase -i b4465be

pick a98facd Add work
squash c5fd35c Added more work
squash abb891c Added more work
squash 5ad95ff Updated TODO to reflect todays work
Run Code Online (Sandbox Code Playgroud)

结果如下:

[work2] git log
commit 3f7f1d2eb4ef23c73dce95f718152c7d5683a926
Author: Doug <doug@null.com>
Date:   Wed Nov 7 10:11:22 2012 +0800

    Add work
    Added more work
    Added more work
    Updated TODO to reflect todays work

commit b4465bee5b278214704edcfef3f6e222b5b52964
Author: Doug <doug@null.com>
Date:   Tue Nov 6 21:38:53 2012 -0800

    Updated TODO
Run Code Online (Sandbox Code Playgroud)

该死!那不是我想要的.生成的提交的时间戳是我们压缩的提交的时间戳; 我想要的是新的提交日期是当前时间.

只是为了准确地说明我在说什么:

[work2] date
Wed  7 Nov 2012 10:39:39 WST

Author: Doug <doug@null.com>
Date:   Wed Nov 7 10:11:22 2012 +0800
Run Code Online (Sandbox Code Playgroud)

我希望结果提交是合并时间的日期,即.现在,不是提交的时间.

据我所知,你只能压缩到之前的提交,而不是向上提交到新的提交,但有没有办法做到这一点?

正确的解决方案似乎是1)创建一个新的提交与合并消息和正确的提交日期时间,2)??? <---不知何故压制过去的这个提交.

我怎么做?

Tom*_*ing 49

哈克:你可以用

git commit --amend --reset-author
Run Code Online (Sandbox Code Playgroud)

git commit man页面说这"也更新了作者的时间戳".您不必对提交进行任何更改(我在本地尝试),它会将时间戳更新为当前时间.绝对是一种虐待,但似乎有效.


She*_*man 11

git commit --amend --date="now"
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想编辑提交消息:

git commit --amend --date="now" --no-edit
Run Code Online (Sandbox Code Playgroud)

默认情况下,amend提交者日期更新为当前时间,但保持作者提交日期不变。
--date="now"还将作者提交日期设置为当前时间。

为什么作者和提交者日期不同很重要?
执行 a 时git log,默认情况下显示作者日期(git log --format=fuller显示提交者日期)。
然而,可能出乎意料的是,如果您使用since/until它使用提交者日期,而不是作者日期。
这种差异可能会让人有点困惑,或者会导致意想不到的结果。
例如:git log --since="yesterday"

--date
您可以提交或修改,将作者日期设置为任何日期:

git commit --date="Wed Apr 15 13:00 2037 -0700"
git commit --amend --date="Wed Apr 15 13:00 2037 -0700"
Run Code Online (Sandbox Code Playgroud)

但是,您必须使用固定日期,格式为ISO 8601或 Internet Message RFC 2822 Format。YYYY.MM.DD、MM/DD/YYYY、DD.MM.YYYY 都可以,但我相信还必须包括时间。

源有其他选项:https : //alexpeattie.com/blog/working-with-dates-in-git

这篇SO 帖子展示了一种将提交和作者日期独立设置为特定日期以及多次提交的方法。尽管建议不要更改其他人使用的任何内容的提交日期。


Ale*_*x R 5

而不是git rebase -i b4465be,将最近的日志复制到剪贴板并执行以下操作:

git reset --soft b4465be
git commit
Run Code Online (Sandbox Code Playgroud)

粘贴并编辑更改日志,保存并退出提交消息编辑器。