2016-11-30 76 views
0

为了获取Git的分支层次结构,我发出以下命令来我混帐回购协议:混淆git的日志结果

git log --all --graph --decorate --oneline --simplify-by-decoration 

不过,我得到一个令人困惑的结果:

* 023448b (I) Comments 
| * 7b08b45 (H) Comments 
|/ 
| * 379334c (G) Comments 
| * ec95b66 (F) Comments 
|/ 
| * dca9a7b (E) Comments 
|/ 
| * f7bb48a (D) Comments 
|/ 
| * 82224b2 (C) Comments 
|/ 
* c7887dd (HEAD, master, A, B) Commments 
* 5046cbf Initial Commit: Comments 

倒数第二线显示三个分支。它不应该只显示master?还有最后一句话的含义是什么?

+0

在Git中,多个不同的分支可以指向相同的提交。这是完全合法的。 – Striezel

回答

1

我不知道你所说的“最后一句”的意思,但:

不是它应该只显示主?

你说的--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 

因为名字HEADmasterA,并B都指向c7887dd(被保留,因为一个名称指向它),5046cbf是一个根提交(由于它是根提交而被保留)。


请注意,这只是停止加入承诺的“承诺审查”的队列。如果队列已经有很多排队提交,那么这个过程继续检查这些提交。如果图中存在多个根提交,则此过程可能会找到其中的几个或全部(取决于您开始遍历的位置)。

两个git loggit rev-list办提交图形内的节点的广度优先遍历,但两者也排序的提交。添加--graph将强制排序使用拓扑关系顺序,在该顺序中,直到显示其所有子项为止(即以正常“向后”方向工作时),才会显示父提交。

source code粗粗重新检查表明,这是不是很真正:如果他们有一个空树附根的提交将被丢弃。在之后,根据git loggit rev-list给出的任何pathspec参数修改附加的树,因此在检查修改某个特定文件的提交时,您将看不到根提交,因此会发生。在这种情况下,没有任何pathspecs,所以如果字面上为空(如果是the empty tree),则只会看不到root提交。