令人困惑的git日志结果

时间:2016-11-30 19:08:45

标签: git graph branch

要获取git分支层次结构,我向git repo发出以下命令:

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吗?还有最后一句话的含义是什么?

1 个答案:

答案 0 :(得分:1)

我不知道你的意思"最后一句",但是:

  

它不应该只显示主人吗?

没有。你说--all。所有意味着 all:所有分支,所有标记和所有其他引用。如果您只想查看分支master,您应该说master

git log找到要显示的提交的方式是从一组引用开始,然后检查这些引用指向的每个提交,然后查看那些提交'父母承诺,然后看看父母'父母,等等。这个"步行"通过历史 - 查看每个提交的父级或父级,并将这些提交排队等待进一步检查 - 只需指定的点开始,并继续直到没有更多的提交。提交"用完"每当此进程到达 root commit 时,这是一个没有父项的提交。 1

git log的默认值是从名称HEAD开始,除非您指定其他一些起点。你做到了:你说--all,这意味着所有起点(reflogs除外)。

同时

--simplify-by-decoration

git log指向跳过提交,这些提交没有指向它们的某个分支或标记名称。但是,无论出于何种原因,这从未 2 跳过根提交。和

--decorate

指示git log在所显示的任何提交上放置指向该提交的任何分支和/或标记的名称(当然是--simplify-by-decoration保留的提交,除了root提交)。因此,如果您将--all替换为master,您应该会看到:

* c7887dd (HEAD, master, A, B) Commments
* 5046cbf Initial Commit: Comments

因为名称HEADmasterAB都指向c7887dd(因为名称指向它而保留),并且5046cbf是根提交(由于它是根提交而保留)。

1 请注意,这只会停止将更多提交添加到"提交以检查"的队列。如果队列已经有许多排队提交,则该过程继续检查这些提交。如果图中有多个根提交,则此过程可能会找到其中的几个或全部(取决于您开始遍历的位置)。

git loggit rev-list都在图表中对提交节点进行广度优先遍历,但两者都排序提交。添加--graph强制排序使用遵循拓扑的顺序,在该顺序中,在显示所有子项之前不显示父项提交(在正常"向后"方向上工作时)

2 source code进行粗略的重新检查表明这不是相当为真:如果附加了空树,则将丢弃root提交。 根据给git loggit rev-list的任何pathspec参数修改附加树后,发生此检查,因此在查找修改后的提交时,您将无法查看根提交一些特定的文件。在这种情况下,没有路径规范,因此如果根提交确实为空(仅指the empty tree),您将不会看到根提交。