#1: git如何存储提交时间,当提交被推送到主仓库时?它是否为每个提交存储当前机器时间,以UTC为准?
从man git-commit
得知:
Git内部格式
它是[Unix时间戳][时区偏移量],其中[Unix时间戳]是自UNIX纪元以来的秒数。[时区偏移量]是相对于UTC的正或负偏移量。
基于此,git内部使用的时间格式是UNIX纪元时间,包括机器的UTC偏移量。
#2: 如何从“git log”中获取一个线性顺序,考虑到git不存储修订号?
您使用的方法(git log --pretty=format:"%ct%H"
)将从已合并到当前分支的所有分支中提取数据。
这使得“线性顺序”有些困难。考虑以下内容[
来源:git-scm.org]:
![Multiple branches, pre-merge](https://istack.dev59.com/jMzKs.webp)
所以,我们有几个“主题分支”正在被处理。然后我们决定保留一些(dumbidea
和iss91v2
),舍弃其他的(iss91
)。因此,我们舍弃了C5
和C6
,保留了其他提交,我们合并后的历史记录如下[source: git-scm.org]:
![Post-merge](https://istack.dev59.com/Moq07.webp)
箭头指向子提交到父提交;C14是提交C13和C11的子提交。
现在我们有一个单一的HEAD提交,为了方便起见,我们假设我们将其发布为RELEASE1或其他什么。那么问题来了:如何从这个历史记录中提取一个线性的、按时间顺序正确的提交列表呢?
简单的答案是:我不认为你可以做到这一点,或者如果你这样做了,我不认为它会是你想要的。
你可以按时间线性排序提交。
git log --pretty=format:"%ct %H" | sort --key=1,10
这将会给你一个相应的列表:
C1
C2
... snip ...
C13
C14
然而,需要注意的是,这并不是一个线性历史!这是因为我们合并了一些同时创建的分支。我们无法提取C14
(我们的HEAD
)的父级的线性历史,因为它不是单个提交的子级,而是两个分支的子级,这不是一个线性关系。
那么,您可能会问,也许我可以获得一个分支的线性历史?例如C14 -> C13 ... C3 -> C1
?
即使是这样,最起码也非常困难(更有可能是不可能的)。
当我们有多个分支加入(三方或更多方合并)时,这个问题就变得更加复杂了。这个问题详细介绍了你无法提取“单个分支”历史的原因——当你查看合并提交的父级时,如何确定哪个是“单个分支”,哪个是“加入”的分支?
说了这么多,如果你查看这个小仓库的日志,以图形格式呈现:(我剪掉了一些无用的提交)
zsh% git log --graph --all --format=format:'%C(blue)%h%C(reset) - %C(green)(%cr)%C(reset) %C(yellow)%d%C(reset)' --abbrev-commit --date=relative
* 3cf5f06 - (8 weeks ago) (origin/master, origin/HEAD, master)
* a3a3205 - (4 months ago)
* c033bf9 - (4 months ago) (origin/svg)
* ccee435 - (4 months ago)
* f08bc1e - (4 months ago)
|\
| * 48c4406 - (5 months ago)
* | 203eeaa - (4 months ago)
* | 5fb0ea9 - (5 months ago)
|/
* 39bccb8 - (5 months ago)
请注意,这个历史记录是按照时间顺序排列的;分支没有被“展开”成一个,所以看起来有点奇怪。每个提交都包含在当前的HEAD(master, origin/master)中。这很明显,因为历史上的两个fork已经合并在一起了(合并在f08bc1e处)。
#3: 我需要做的是将提交映射到包含该提交的下一个版本
如果您对单个提交感兴趣,可以使用
这个问题或
如果您的发布被标记。
阅读问题,看起来您可能想将每个提交映射到一个版本;这是很多工作,我无法提供太多帮助 - 我认为您不需要检查每个提交,因为分支将被合并进去,如果线性分支的头部在版本中,则其线性父级也将在其中。除非您已进行了类似挑选樱桃或类似操作。
如果您按时间排序,然后检查所有早于最老版本的提交,记录该提交ID是否包含在最老版本中,然后是第二个最老的版本等等,当您找到包含它的版本时从列表中删除该提交,那么您最多需要检查版本数量
* 提交数量
; 在最坏的情况下,没有任何提交包含在任何版本中。最好的情况是,版本包含比自身旧的每个提交,这是300,000
次检查。尽管仍然很多,但(对我而言)可行。
(抱歉回复较长)。