我不知道你所说的“最后一句”的意思,但:
不是它应该只显示主?
你说的--all
。全部表示全部:所有分支,所有标签以及所有其他参考。如果你只想看看分支master
你应该说master
。
git log
查找提交的方式是从一些引用集合开始,然后检查每个提交这些引用的指向,然后查看那些提交的父提交,然后查看父母的父母,等等。 。这个“遍历”历史 - 查看每个提交的父代或父代,并将这些提交排队以供进一步检查 - 只需从开始指定的点,并且继续直到没有更多提交。当这个过程达到根提交时提交“用完”,这是一个没有父母的提交。
git log
的默认值是从名称HEAD
开始,除非您指定了其他起点。你这样做:你说--all
,这意味着全部起点(除了reflogs)。
同时:
--simplify-by-decoration
指导git log
到跳过提交没有一些分支或标记名称指向他们。但是,无论出于何种原因,这绝不会跳过根提交。和:
--decorate
引导git log
把指向该犯任何分支和/或标签的名称,在任何的提交所示(这当然是那些由--simplify-by-decoration
保留,除了根犯)。因此,如果你有master
替换--all
,你应该会看到:
* c7887dd (HEAD, master, A, B) Commments
* 5046cbf Initial Commit: Comments
因为名字HEAD
,master
,A
,并B
都指向c7887dd
(被保留,因为一个名称指向它),5046cbf
是一个根提交(由于它是根提交而被保留)。
请注意,这只是停止加入更承诺的“承诺审查”的队列。如果队列已经有很多排队提交,那么这个过程继续检查这些提交。如果图中存在多个根提交,则此过程可能会找到其中的几个或全部(取决于您开始遍历的位置)。
两个git log
和git rev-list
办提交图形内的节点的广度优先遍历,但两者也排序的提交。添加--graph
将强制排序使用拓扑关系顺序,在该顺序中,直到显示其所有子项为止(即以正常“向后”方向工作时),才会显示父提交。
的source code粗粗重新检查表明,这是不是很真正:如果他们有一个空树附根的提交将被丢弃。在之后,根据git log
或git rev-list
给出的任何pathspec参数修改附加的树,因此在检查修改某个特定文件的提交时,您将看不到根提交,因此会发生。在这种情况下,没有任何pathspecs,所以如果字面上为空(如果是the empty tree),则只会看不到root提交。
在Git中,多个不同的分支可以指向相同的提交。这是完全合法的。 – Striezel