20

我想念使用 svn 的一件事是修订号的简单编号。我可以轻松查看测试环境中部署的版本是在某个提交之前还是之后。

使用 git 对其提交使用哈希,有什么方法可以判断提交是在另一个提交之前还是之后进行的?

4

7 回答 7

17

正如您所注意到的,在 Git 中事情并不是那么简单。特别是,“之前”和“之后”的定义需要进一步澄清。

如果您相信提交到您的存储库的人不会弄乱时间戳,并且您已经知道两个提交都在同一个分支上,那么您可以比较提交的时间戳并查看哪个更早。对每个提交使用以下命令,并比较结果。

git log -1 --format='%ci' <commit>

但是,使用 Git,您不一定信任时间戳,因为与 Subversion 不同,它没有一个中央存储库来负责生成它们。你也不能确定两个提交在同一个分支上(尽管 Subversion 也存在这个问题)。

为了避免这些问题,讨论一个提交是否是另一个提交的祖先,而不是它是在它之前还是之后。在以下提交图中,B 和 C 是 A 的祖先,而 B 不是 C 的祖先,反之亦然:

B    (master)
| C  (branch)
|/
A    (root)

要确定提交 A 是否是提交 B 的祖先,请使用以下命令(基于git ready 上的一篇文章):

git rev-list <commitA> | grep $(git rev-parse <commitB>)

第一部分列出了作为提交 A 的祖先的所有提交;第二部分获取提交 B 的完整哈希,然后在祖先列表中搜索该提交。如果您看到任何输出,则提交 A 是提交 B 的祖先。交换参数以计算提交 A 是否是提交 B 的祖先。

第二种形式较慢,但可以绝对确定一个提交是另一个提交的祖先。

于 2013-01-09T10:51:27.517 回答
11

git merge-base 有一个标志。它只是返回一个 0/​​1 退出代码。

git merge-base --is-ancestor <commit> <commit>
于 2018-12-20T00:38:13.540 回答
7

git rev-list --count能够帮助。假设110a187在 之前有 4 次提交5d41af1,那么:

 $ git rev-list --count 110a187..5d41af1
4
 $ git rev-list --count 5d41af1..110a187
0

因此类似于:

test $(git rev-list --count $a..$b) == 0 && \
       echo "$a is not an ancestor of $b"
于 2015-05-01T09:21:22.870 回答
3

在每个提交上使用git show以查找提交的日期。没有办法只看哈希来确定顺序,因为它只是一个哈希。

您可以使用自定义格式字符串来显示您想要的内容,查看手册页以获取更多信息。

git show --format="%ci" <commit>
于 2013-01-08T19:36:33.707 回答
2

您可以从显示哈希、作者、日期和评论的日志中获取所有提交信息:

git log

您可以从提交日志中提取特定提交的时间/日期。就像是:

git log -1 --format="%cd" <commit>

'%cd' 以日志格式为您提供日期,您还可以执行以下操作:

  • %cD: RFC2822 风格
  • %cr:相对
  • %ct:UNIX 时间戳
  • %ci:ISO 8601 格式

从那里,如果您需要自动化,您可以与一些脚本进行一些比较。

于 2013-01-08T19:38:20.473 回答
1

使用@me_and 提到的所有备注,您还可以尝试:

git rev-list --no-walk commitA commitB

在输出中,您将看到提供的提交按提交时间按时间倒序显示。因此,提供提交的顺序无关紧要(与@Douglas Bagnall建议的想法相矛盾)。

于 2019-05-17T11:45:09.087 回答
0

如果你使用标签,你可以做

git describe --tags

这将告诉您自最后一个标签以来有多少次提交。

于 2013-01-08T19:24:39.890 回答