2016-11-30 86 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提交。