如何在git中压缩提交,使提交日期不是过去的日期?

53

我的用例非常简单:我想从“今天的工作”分支中压缩所有需要回归主分支的提交。

到目前为止,我一直在使用 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

好的,现在我想把这最后四次提交压缩成一次提交。

[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

结果如下:

[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

不!那不是我想要的。产生提交的时间戳是我们压缩到其中的提交的时间戳;我想要的是新的提交日期是当前时间。

只是为了清楚地说明我的意思:

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

Author: Doug <doug@null.com>
Date:   Wed Nov 7 10:11:22 2012 +0800

我希望合并后生成的提交日期为合并时间,即现在,而不是提交时间。

据我所知,您只能将提交压缩到先前的提交中,而不能向上合并到一个新提交中,但是否有某种方法可以实现此操作?

正确的解决方案似乎是:

  1. 创建一个新的提交,包含合并消息和正确的提交日期时间,
  2. ??? <--- 将以前的提交压缩到此提交中。

我该怎么做?


这是我不喜欢压缩的许多原因之一。 - Adam Dymitruk
还有,提交者日期和作者日期是有区别的。这取决于你正在做什么。 - Adam Dymitruk
可能是git squash and preserve last commit's timestamp的重复问题。 - underscore_d
@underscore_d 不是的,那个问题的答案不适用于这里。我现在想要的是一个新的时间戳,而不是选择现有时间戳中的一个(就像那个问题一样)。两个问题的答案并不相同。 - Doug
5个回答

74

提示:您可以使用

git commit --amend --reset-author

在git提交手册中,它说这也会更新作者时间戳。你不必更改提交的任何内容(我在本地试过),它将把时间戳更新为当前时间。虽然这有点滥用,但似乎有效。


23
git commit --amend --date="now"

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

git commit --amend --date="now" --no-edit

默认情况下,amend会将提交者 (Committer)的时间更新为当前时间,但保留作者 (Author)的提交时间不变。
--date="now"也会将作者的提交时间设置为当前时间。 AuthorCommitter的时间不同有什么影响呢?
默认情况下,在执行git log时会显示Author的提交时间(使用git log --format=fuller可显示Committer的提交时间)。
然而,如果使用since/until,实际上是以提交者 (Committer)的时间为准,而非作者 (Author)的提交时间。
这种差异可能有点令人困惑,或导致意外的结果。例如:git log --since="yesterday"
你可以通过使用--date参数来设置Author的提交时间。
git commit --date="Wed Apr 15 13:00 2037 -0700"
git commit --amend --date="Wed Apr 15 13:00 2037 -0700"

但是,你必须使用固定日期格式,例如ISO 8601或互联网消息RFC 2822格式。YYYY.MM.DD、MM/DD/YYYY、DD.MM.YYYY都可以工作,但我认为也必须包括时间。

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

这个SO帖子展示了一种方法来独立设置提交和作者日期,并在多个提交上指定日期,但建议不要更改其他人使用的提交日期。


4

不要使用git rebase -i b4465be命令,将最近的日志复制到剪贴板中,并执行以下操作:

git reset --soft b4465be
git commit

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


0

0
使用此功能可将时间戳设置为您想要的任何值。
 git commit --amend --date="now" --no-edit

或者

 git commit --amend --date=""Mon 20 June 2023 20:19:19 EST" --no-edit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接