两个提交之间的所有提交清单

5

我正在计划我们团队的新部署流程。

对于每个构建X,我们有上一个构建X-1的$last_commit_from_last_build和现有构建X的$last_commit

我们不并行运行构建,这意味着在构建X中可能会有多个提交,因此我们需要列出这些提交,以便我们不会错过它们。例如,以下可能是从最旧到最新的提交顺序:

(last_commit_from_last_build)(Build X-1), (some_commit_1, some_commit_2, last_commit)(Build X)

在构建X中,我们需要构建$last_commit_from_last_build和$last_commit之间的所有提交。 我们只想要$last_commit_from_last_build和$last_commit之间的提交。

因此,我们决定使用: git log $last_commit_from_last_build...$last_commit

问题在于,如果我们在GitHub上有以下历史记录:

first image

当我们运行git log 3ec29f0...573e22e时,我们会收到以下结果:

second image

提交bdde57在这些提交之间。

637不在其中!

我们的逻辑可能出了什么问题?有没有更好的方法来获取所请求的列表?这会导致错误的构建,并阻止我们继续进行项目。

2个回答

5

首先,请访问Think Like (a) Git。请阅读全部内容,或至少浏览标题为“Experimenting With Git”的页面,并通过学习了解reachability和Git如何使用references的概念。

现在你已经知道了所有需要了解的内容,以便理解Git命令行提供的两个和三个点符号语法:

A...B

这是一组从名字或哈希ID A 或名字或哈希ID B 中任意一个可到达的提交集合,但不包括同时从这两个名称中到达的提交。 与此同时:

A..B

这是从B可达的提交集,排除从A可达的提交集。 这可能是您想要的,但不一定。

当提交A是提交B的祖先时,您可能希望获得与这两者都不同的集合。特别是,您可能希望获取所有以A为起点的提交,这些提交是A的后代并且是B的祖先。这没有通用的语法,但可以通过git rev-list(因此也可以通过git log)获得:

git rev-list --ancestry-path A..B

请注意,这里省略了 A 但包括 B,就像没有 --ancestry-pathA..B 变体一样。(您可以添加 --boundary 以在此处包括 A,但请注意,在更一般的情况下,--boundary 会带来一些奇怪的副作用。)
如果简单的 A..B 不是您想要的东西,那么使用 --ancestry-path 变量是您想要的。这两种变化通常捕捉有向无环图中“之间”的含义。

0

像 OP 一样,我也注意到 GitHub 选择展示提交记录的顺序并不是很可靠,或者至少不直接与底层图形关系相关,因为看起来他们选择的顺序取决于提交记录的时间戳(当使用命令如 git rebase -i … 时,提交记录的时间戳实际上可能会被更改)。

所以,@torek 的回答中所解释的基于 CLI 的方法绝对是正确的途径。

另外,您也可以使用图形化命令,例如 gitk --all 来显示提交记录图形,并更好地了解给定存储库中提交记录、分支和标记之间的关系。

有关更多详细信息,请参阅例如本教程 使用 gitk 了解 git,其中包含有注释的 gitk 截图。


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