如何重新设置基础并保持提交的时间顺序?

16

我想在主分支上对一个分支进行变基,但要以这样一种方式使得所有提交以时间顺序在git日志中显示。是否可以在不使用git rebase --interactive并手动重新排列提交的情况下实现?

背景:我正在使用git跟踪服务器群的puppet配置。主分支始终处于已知的良好状态,因此所有现有服务器都可以从puppet主服务器检索其配置。

每个新服务器都有自己的分支,因此每当我处理新服务器的配置时,例如更改域名、配置SSL证书,我都会检出其分支并提交所有配置。

完成新配置后,我会将更改变基到主分支上:

# git checkout new_config
Switched to branch 'new_config'
# git rebase master
First, rewinding head to replay your work on top of it...
Applying: fix routing rules
Applying: fix netmask
Applying: configure new ip address
# git checkout master
Switched to branch 'master'
# git merge new_config
Updating 21a3120..b0b79d7
Fast-forward
 files/custom/xxxx |   45 +++++++++++++++++++++++++++++++++++++++++++++
 files/custom/yyyy |   38 --------------------------------------
 manifests/site.pp |    6 +++---
 3 files changed, 48 insertions(+), 41 deletions(-)
#
新提交的内容现在在日志的顶部,但是它们具有它们原来(过去)的日期。它看起来像这样:

The new commits are now on top of the log but they have their original (past) dates. It looks like this:

commit b0b79d7924ec97e367664ccc26aaf0021916a30d
Author:
Date:   Sun Jul 12 17:14:41 2015 +0200

    configure new ip address

commit f60d00abd57d6b8582f49bf1322efb88d44ee86e
Author:
Date:   Fri Jul 10 13:19:45 2015 +0200

    fix netmask

commit 6eaae6c328faf55e5725f65a947bbb23ea29b166
Author:
Date:   Fri Jun 12 14:05:25 2015 +0200

    fix routing rules

commit 21a31200e6694c640b2cb526d773af11cd703ff1
Author:
Date:   Wed Jul 15 15:08:41 2015 +0200

    (most recent commit on master before rebase)

commit a7fa9cfa9c317fbbeb7dac8a89009c7d935fdd11
Author:
Date:   Wed Jul 15 11:56:59 2015 +0200

    (second most recent commit on master)

注意旧的分支提交的时间戳显示在日志顶部,而不是根据它们的提交日期在日志中进一步合并。我必须运行另一个git rebase --interactive来重新排列提交,以便我的日志文件按时间顺序显示所有提交。


3
为什么对你来说提交记录按照时间顺序显示很重要? - Alexander Groß
这是我的个人偏好。如果它按照这种方式排序,我会感到困惑。 - nn4l
2个回答

4
您的问题有点不明确,因为git log总是对其输出进行排序,但它可以通过选项告诉它如何排序

提交顺序

默认情况下,提交按时间戳的倒序显示。

--date-order

    在不打乱提交时间戳顺序的前提下,先显示所有子提交再显示父提交。

--author-date-order

    在不打乱作者时间戳顺序的前提下,先显示所有子提交再显示父提交。

--topo-order

    在不打乱提交历史的前提下,先显示所有子提交再显示父提交,并避免显示多条历史线的提交混合在一起。
因此,如果没有选项,git log无论如何都会按照时间顺序显示提交。
我认为您想问的是如何更改经过变基的提交的时间戳。默认情况下,变基会保留时间戳。
请注意,每个提交都有两个时间戳:作者日期和提交者日期。

rebase documentation 描述了以下两个选项:

--committer-date-is-author-date--ignore-date

    这些标志被传递给 git am,以轻松更改重新基础提交的日期(请参见 git-am(1))。与 --interactive 选项不兼容。

查阅 git am documentation 可以更好地描述它们:

--committer-date-is-author-date

    默认情况下,该命令将电子邮件消息中的日期记录为提交作者日期,并使用提交创建时间作为提交者日期。这允许用户通过使用与作者日期相同的值来欺骗提交者日期。

--ignore-date

    默认情况下,该命令将电子邮件消息中的日期记录为提交作者日期,并使用提交创建时间作为提交者日期。这允许用户通过使用与提交者日期相同的值来欺骗作者日期。

您可以使用git log --format=fullerfuller格式查看作者和提交者日期。

我认为您想使用--ignore-date,这将使每个重新基于的提交都发生在“现在”(这假设我正确解释了您的问题!)。


我尝试了两种选项,但是'git log'仍然在顶部显示新条目。我已经澄清了我的原始问题,以更好地展示我需要什么。 - nn4l
我正在查看git源代码,对某些事情不确定;你能否使用--format=fuller重新执行引用的git输出,以便它显示提交和作者日期?文档要么在谎称按(提交者)日期排序,要么您的提交者日期已更改为“现在”,而作者日期保持不变,因此--commit-date-is-author-date应该可以得到您想要的结果。 - torek

2

如果您想保留原始日期,那么您只能按照您的日期进行变基。

然而,如果您想创建一个拉取请求,并在按作者日期排序的工具中正确地排序提交(TFS和GitHub都可以),那么您可能需要更改日期。

Windows: git rebase --force-rebase --exec "ping localhost -n 3" --exec "git commit --amend --date=now" master

Linux: git rebase --force-rebase --exec "sleep 2" --exec "git commit --amend --date=now" master

请注意,执行 git rebase --ignore-date master 是无效的,因为日期只有秒级分辨率,不同的提交将获得相同的日期并按未指定的顺序排序。如果您同时使用 --exec--ignore-date,则 --ignore-date 参数将被忽略。因为它与交互模式不兼容,而 --exec 使用交互模式。


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