[英]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 HEAD
或git 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:
以及另外兩個數字和字母字符串: c57feb6
和9116e2b
。 這些是提交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有兩個提交要顯示: c57feb6
和9116e2b
。
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 --all
或git log --branches
,這也適用,只要有多個引用將從git log
開始。
因此,這里的規則是: 只要您從HEAD
開始,您就會首先看到當前提交。 這是因為當前只有一個提交,所以即使是合並提交,最初也只顯示一個提交。
2這假設三個分支名稱指向三個不同的提交,這不一定是正確的,但這是以后要擔心的一個復雜問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.