簡體   English   中英

git log的第一個提交是否是分支的當前提交?

[英]Whether the `git log` the first commit is the branch's present commit?

git log第一次提交是否是分支的當前提交?

我使用git log list提交:

$ git log

commit 75a80c128ea8b28f946b1bd55afa65cc1802bee5
Author: lio <lio@126.com>
Date:   Wed May 9 22:00:35 2018 +0800

    2018-05-09-11

commit a57089b64890e5602a39dc33dc1f07d620d8a870
Merge: c57feb6 9116e2b
Author: lio <lio@126.com>
Date:   Wed May 9 21:52:13 2018 +0800

    Merge branch 'master' of 103.200.32.76:/home/ldl/repo/Qiyun02

commit c57feb677a170d786756c97cb71f6225ba9e6774
Author: lio <lio@126.com>
Date:   Wed May 9 21:48:50 2018 +0800

    2018-05-09-10

commit 9116e2b15605590a2db437bee2f7b83f3f9271ff
Author: root <root@www.lio.xyz>
Date:   Wed May 9 13:47:28 2018 +0800
...

分支的當前提交是否是第一次提交75a80c128ea8b28f946b1bd55afa65cc1802bee5

是的,我想,如果您要詢問這是否是最新提交。

git log命令顯示當前分支的提交歷史記錄。 例如,如果您有兩個分支,請掌握和發展。 Develop分支是master分支之前的一個提交,而較新的提交是“ fantastic commit”。 當您檢出master分支和git log ,它將向您顯示master分支的提交歷史記錄,例如intital commit -> commit1然后,如果您檢出develop branch和git log ,它將顯示intital commit -> commit1 -> fantastic commit但是您無法看到當前分支的HEAD提交之后的較新的提交。

我建議您使用此別名。 它顯示了非常漂亮的git歷史。 只需將其添加到您的.gitconfig [alias] log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

正確而准確的答案有些棘手,但直接的答案是“是”。 進一步來說:

[在git log輸出中,] [首次提交]是[顯示]分支的當前提交?

是的。

完整答案之所以復雜是因為git log顯示一次提交, 有時 git log有兩個要同時顯示的提交。 它不能這樣做,因此它必須選擇兩者之一並顯示出來。 但是,運行:

git log

等同於運行:

git log HEAD

它告訴git log從檢查當前提交開始 如果名稱HEAD附加到分支名稱上(即,如果git status on branch B表示某些B),則當前提交是分支B的最尖端提交。 總有1一個當前提交:從未有兩個電流提交,只能有一個。 因此,如果使用git log HEADgit log且沒有其他參數,Git將從該當前提交開始。


1好吧, 幾乎總是如此。 有必要的特殊情況。 假設您創建一個空的存儲庫,其中沒有提交。 哪個提交將是當前提交? 還沒有任何提交 ,因此Git需要一種方法來允許沒有提交是最新的。 一旦有提交,Git將選擇其中之一作為當前提交。

您可以使用git checkout --orphan觸發特殊情況並返回到沒有當前提交的git checkout --orphan ,但這完成了一系列情況:在一個新的提交中有一個當前的提交(通常情況)或沒有當前的提交。空的存儲庫,或者在特殊的git checkout --orphan模式下(兩者都使用相同的底層技巧,以允許當前無提交情況)。


完整而准確的故事

如您所見,每個提交都附加了一個日期和時間戳:

Date:   Wed May 9 22:00:35 2018 +0800

實際上,每個提交都具有兩個附加的時間戳。 要查看兩者,請運行git log --pretty=fuller git log命令不會直接使用這些日期和時間標記。 更重要的是,每個提交都有一個哈希ID ,大多數提交都列出一個或有時兩個其他提交哈希ID。 您可以在這里看到其中一些:

commit a57089b64890e5602a39dc33dc1f07d620d8a870
Merge: c57feb6 9116e2b
Author: ...
Date:   ...

請注意數字和字母的隨機字符串a57089b64890e5602a39dc33dc1f07d620d8a870 這是該特定提交的哈希ID。 在其下面是單詞Merge:以及另外兩個數字和字母字符串: c57feb69116e2b 這些是提交a57089b...的兩個父提交的縮短的哈希ID。

第一個大的丑陋哈希ID a57089b...是提交的真實,真實的內部Git名稱。 這就是Git訪問提交的方式。 但是要找到這么大的丑陋哈希ID,Git需要某種起點-或更確切地說是終點

結束點(Git開始的地方)是commit 75a80c128ea8b28f946b1bd55afa65cc1802bee5 查看git log輸出的第一行,並在那里查看哈希ID。 Git通過讀取當前的分支名稱 (例如master (實際上已簽出的任何分支)) 發現了丑陋的哈希ID。 名稱存儲哈希ID。

同時,提交75a80c1...合並提交 a57089b...的ID作為其(單個)父哈希ID a57089b... 因此,在顯示出您提交75a80c1...git log繼續提交a57089b 它向您顯示該提交作為顯示的第二個提交。 但是現在Git有兩個提交要顯示: c57feb69116e2b

git log命令必須選擇要顯示的兩個提交之一。 通過將兩個提交都放入優先級隊列來實現 然后,從該隊列中選擇優先級最高的提交。 但是那哪個提交? 好吧,這取決於您傳遞給git log選項。 默認設置是按CommitDate時間戳對隊列的內容進行排序(再次,使用git log --pretty=fuller查看這些時間戳),舊的提交比新的提交具有更高的優先級。

Date:您在普通git log輸出中看到的不是CommitDate ,而是AuthorDate 要按此日期對git log排序,請使用--author-date-order (但請注意,這也意味着拓撲排序)。

無論如何,這里的要點是, 只要git log要顯示多個提交,實際的時間戳就很重要。 在此之前,優先級隊列中只有一個提交:Git從隊列中刪除該提交,顯示該提交,然后將該提交的父級放入隊列中,從而給Git顯示一個提交。 Git刪除一個提交,顯示它,將父對象放入,依此類推。 在單擊合並提交時,此過程會自動將至少兩個提交放入隊列。

但是,如果您運行git log branch1 branch2 branch3 ,則Git首先將三個提交放入優先級隊列。 2現在,Git有多個提交要顯示,並且時間戳記值再次生效。 當您運行git log --allgit log --branches ,這也適用,只要有多個引用將從git log開始。

因此,這里的規則是: 只要您從HEAD開始,您就會首先看到當前提交。 這是因為當前只有一個提交,所以即使是合並提交,最初也只顯示一個提交。


2這假設三個分支名稱指向三個不同的提交,這不一定是正確的,但這是以后要擔心的一個復雜問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM