我一直在寻找一种方法来快速查看存储库状态的分支和标记(即获取所有现有分支和标记的列表,以及它们指向日期的提交),以便克隆后查看是否有比当前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)
输出如下:
但是,当我查看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}时,可以通过任何方式获取指示当前检出状态的星号|星号}?)
答案 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-ref
。 for-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