Git列出所有分支标签和遥控器,提交哈希和日期?

时间:2017-11-06 17:45:33

标签: git

我一直在寻找一种方法来快速查看存储库状态的分支和标记(即获取所有现有分支和标记的列表,以及它们指向日期的提交),以便克隆后查看是否有比当前HEAD更晚的提交;经过一些研究,得出以下命令(git version 1.9.1):

git --no-pager log \
  --simplify-by-decoration \
  --tags --branches --remotes \
  --date-order \
  --decorate \
  --pretty=tformat:"%Cblue %h %Creset %<(25)%ci %C(auto)%d%Creset %s"

请注意,显然,可以使用--all代替--tags --branches --remotes(以及tformat,因为custom log format omits newline at end of output

输出如下:

screenshot terminal

但是,当我查看How can I get a list of git branches, ordered by most recent commit?时,大多数答案都会使用git for-each-ref,所以我想确认一下 - 根据<上述git log命令是否会遗漏em>所有分支,标签和遥控器?如果是这样,我应该使用git for-each-ref命令,还是有其他命令将它们全部列出来?

(奖励问题 - 是否可以修改此格式,还可以打印添加了给定标记的分支?此外,使用{{1}时,可以通过任何方式获取指示当前检出状态的星号|星号}?)

1 个答案:

答案 0 :(得分:2)

  

然而,当我看到如何获得最近提交的git分支列表?大多数答案都使用git for-each-ref,所以我想确认 - 有没有什么在所有分支,标签和遥控器方面,git log命令会错过吗?

没有。分支是refs/heads/中的引用,标记是refs/tags/中的引用,而远程引用是refs/remotes/中的引用,因此,如果这些是您想要的,--branches --tags --remotes可以解决问题。

  

如果是这样,git for-each-ref是我应该使用的命令,还是有其他命令将它们全部列出?

鉴于您还想检查每个引用所在的提交,这里没有充分的理由使用git for-each-reffor-each-ref允许您使用git log无法做到的是标识不指向(或间接)提交的标记。 (标签或带注释的标签可用于标记树或blob。树和blob不是提交,也没有日期戳,并且不清楚您将使用这些标记做什么。)

鉴于您希望按提交时间戳(--date-order)排序提交, 1 git log显然是正确的工具。

  

奖金问题 - 是否可以修改此格式,还可以打印添加了给定标记的分支?

否:此信息不存在。标记只是指向一个对象(如果它是带注释的标记,则为带注释的标记对象;如果不是,则为提交,树或blob;如果它是带注释的标记,则带注释的标记对象指向另一个对象)。分支名称只是指向一个提交对象(并且提交本身指向零或更多先前,即,提交)。对象(大多数)是永久性的;其他一切都是多变的。零个或多个引用名称(包括分支名称)可以指向任何给定的提交,并且可以随时更新名称集。

对象可达性 -ie,是否有任何直接指向对象的外部名称,或者是通过以下父指针链可以找到对象的另一个对象 - 确定是否对象幸存&#34;垃圾收集&#34;。这是丢弃临时对象的唯一方法:它们是永久性的,直到垃圾收集器发现它们未被引用,并丢弃它们。

  

另外,使用git branch -a时,是否有任何方法可以获得指示当前检出状态的星号|)

不是来自git log,但您可以进行后处理:从HEAD中读取当前分支名称,并在git log行对应的代码中添加一些代码。如果您选择这样做,您应该考虑如何处理&#34;分离的HEAD&#34;,这在HEAD毕竟不包含分支名称时发生,而是包含原始提交哈希ID