我想在主分支上重新绑定一个分支,但是这样一来,所有提交都会在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
来重新排列提交,以便我的日志文件按时间顺序显示所有提交。
答案 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
使用的交互模式不兼容。