【问题标题】:How do I squash commits in git with a commit date that is not in the past?如何在 git 中以不过去的提交日期压缩提交?
【发布时间】:2012-10-27 01:56:19
【问题描述】:

所以,我有一个非常简单的用例;我想压缩所有需要从我的“今天工作”分支返回到 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

好的,现在我想将最后四个提交压缩为一个提交。

[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. ???

我该怎么做?

【问题讨论】:

  • 这是我不喜欢挤压的众多原因之一。一个
  • 还有。提交者日期和作者日期之间存在差异。取决于你在做什么。
  • @underscore_d 不,该问题的答案在这里不是正确答案。我现在想成为新的时间戳,而不是选择现有的时间戳之一(根据那个问题)。这两个问题的答案都不一样。

标签: git git-rebase


【解决方案1】:
git commit --amend --date="now"

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

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

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

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

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

git commit --date="Wed Apr 15 13:00 2037 -0700"
git commit --amend --date="Wed Apr 15 13:00 2037 -0700"

但是,您必须使用固定日期,例如ISO 8601 或 Internet 消息RFC 2822 Format。 YYYY.MM.DD, MM/DD/YYYY, DD.MM.YYYY 都可以,但我相信时间也必须包括在内。

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

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

【讨论】:

    【解决方案2】:

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

    git reset --soft b4465be
    git commit
    

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

    【讨论】:

      【解决方案3】:

      Hack:你可以使用

      git commit --amend --reset-author
      

      git commit 手册页说这“也更新了作者时间戳”。您不必对提交进行任何更改(我在本地尝试过),它会将时间戳更新为当前时间。绝对是一种滥用,但它似乎有效。

      【讨论】:

        【解决方案4】:

        不依赖 squash 并仅区分整个功能分支怎么样:http://dymitruk.com/blog/2012/02/05/branch-per-feature/

        【讨论】:

          猜你喜欢
          • 2021-04-30
          • 2014-06-29
          • 2017-10-16
          • 2016-02-08
          • 2012-11-20
          • 2013-01-08
          • 2011-08-05
          • 2016-05-22
          • 2012-01-13
          相关资源
          最近更新 更多