如何按时间顺序改变并保持承诺?

时间:2015-07-18 14:34:03

标签: git git-rebase

我想在主分支上重新绑定一个分支,但是这样一来,所有提交都会在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(-)
#

新提交现在位于日志之上,但它们具有原始(过去)日期。它看起来像这样:

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来重新排列提交,以便我的日志文件按时间顺序显示所有提交。

2 个答案:

答案 0 :(得分:3)

您的问题有点不明确,因为git log总是对其输出进行排序,但它takes options telling it how to sort

  

提交订购

     

默认情况下,提交按逆时间顺序显示。

     

--date-order

     
    在显示所有子项之前不显示父项,但以提交时间戳顺序显示提交。
     

--author-date-order

     
    在显示所有子项之前不显示父项,但在作者时间戳顺序中显示提交。
     

--topo-order

     
    在显示所有子项之前不显示父项,并避免在多行历史记录中混合显示提交。

因此,没有选项,git log无论如何都按时间顺序显示提交。

认为您要问的是,您如何更改重新提交的提交上的时间戳。默认情况下,rebase会保留时间戳。

请注意,每次提交都有两个时间戳:作者日期和提交者日期。

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

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

您可以使用fuller格式与git log一起查看作者和提交者日期,例如git log --format=fuller)。

我相信你想使用--ignore-date,这使得每个重新提交的提交都发生了#34;就像现在一样#34; (这假设我正确地解释了你的问题!)。

答案 1 :(得分:1)

如果您想保留原始日期,则根据您的日期,您会遇到变基。

但是,如果要创建拉取请求并在按作者日期排序的工具中正确排序提交(TFS和GitHub都这样做),您可能希望改变日期。

视窗: 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使用的交互模式不兼容。