要获取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
吗?还有最后一句话的含义是什么?
答案 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
因为名称HEAD
,master
,A
和B
都指向c7887dd
(因为名称指向它而保留),并且5046cbf
是根提交(由于它是根提交而保留)。
1 请注意,这只会停止将更多提交添加到"提交以检查"的队列。如果队列已经有许多排队提交,则该过程继续检查这些提交。如果图中有多个根提交,则此过程可能会找到其中的几个或全部(取决于您开始遍历的位置)。
git log
和git rev-list
都在图表中对提交节点进行广度优先遍历,但两者都排序提交。添加--graph
强制排序使用遵循拓扑的顺序,在该顺序中,在显示所有子项之前不显示父项提交(在正常"向后"方向上工作时)
2 对source code进行粗略的重新检查表明这不是相当为真:如果附加了空树,则将丢弃root提交。 根据给git log
或git rev-list
的任何pathspec参数修改附加树后,发生此检查,因此在查找修改后的提交时,您将无法查看根提交一些特定的文件。在这种情况下,没有路径规范,因此如果根提交确实为空(仅指the empty tree),您将不会看到根提交。