我想念使用 svn 的一件事是修订号的简单编号。我可以轻松查看测试环境中部署的版本是在某个提交之前还是之后。
使用 git 对其提交使用哈希,有什么方法可以判断提交是在另一个提交之前还是之后进行的?
我想念使用 svn 的一件事是修订号的简单编号。我可以轻松查看测试环境中部署的版本是在某个提交之前还是之后。
使用 git 对其提交使用哈希,有什么方法可以判断提交是在另一个提交之前还是之后进行的?
正如您所注意到的,在 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 的祖先。
第二种形式较慢,但可以绝对确定一个提交是另一个提交的祖先。
git merge-base 有一个标志。它只是返回一个 0/1 退出代码。
git merge-base --is-ancestor <commit> <commit>
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"
您可以从显示哈希、作者、日期和评论的日志中获取所有提交信息:
git log
您可以从提交日志中提取特定提交的时间/日期。就像是:
git log -1 --format="%cd" <commit>
'%cd' 以日志格式为您提供日期,您还可以执行以下操作:
从那里,如果您需要自动化,您可以与一些脚本进行一些比较。
使用@me_and 提到的所有备注,您还可以尝试:
git rev-list --no-walk commitA commitB
在输出中,您将看到提供的提交按提交时间按时间倒序显示。因此,提供提交的顺序无关紧要(与@Douglas Bagnall建议的想法相矛盾)。
如果你使用标签,你可以做
git describe --tags
这将告诉您自最后一个标签以来有多少次提交。