簡體   English   中英

git log revision range提供了不正確的提交范圍

[英]git log revision range gives incorrect range of commits

我試圖使用git log的參數在分支上的給定范圍內使用列表所有提交。 由於某種原因,它似乎沒有給我正確的結果(或者我可能理解錯誤的命令?)。

這是我正在做的步驟:

  1. 克隆回購

    git clone https://github.com/openstack/nova.git

  2. git log ,這些是最后9次提交:

     d5bde44 Merge "Make metadata password routines use Instance object" 6cbc9ee Merge "Fix object change detection" 39b7875 Merge "Fix object leak in nova.tests.objects.test_fields.TestObject" 94d1034 Merge "maint: correct docstring parameter description" 6407f17 Merge "Fix live_migration method's docstring" 7406661 Merge "Fix infinitely reschedule instance due to miss retry info" 9d8a34f Merge "Remove unused code from test_compute_cells" 429cd4b Fix object change detection 01381b8 Fix object leak in nova.tests.objects.test_fields.TestObject ... 
  3. 假設我想在01381b8之后開始所有提交。 我發出git log 01381b8..HEAD並看到以下輸出:

     d5bde44 Merge "Make metadata password routines use Instance object" 6cbc9ee Merge "Fix object change detection" 39b7875 Merge "Fix object leak in nova.tests.objects.test_fields.TestObject" 94d1034 Merge "maint: correct docstring parameter description" 6407f17 Merge "Fix live_migration method's docstring" 7406661 Merge "Fix infinitely reschedule instance due to miss retry info" 9d8a34f Merge "Remove unused code from test_compute_cells" 429cd4b Fix object change detection 2214bc0 Remove unused code from test_compute_cells 9639b55 Fix infinitely reschedule instance due to miss retry info a5184d3 Fix live_migration method's docstring 76729a3 maint: correct docstring parameter description 28224a6 Make metadata password routines use Instance object 

哇! 當我預期8時,我實際上在該輸出中有13個提交。 這里發生了什么? 修訂范圍是否是在給定提交后獲得show commit的正確機制? 或者這是一個錯誤?

這里的問題在於“后”的滑溜概念。

提交不是“之前”和“之后”,因為它們“嵌入圖表中”。 在這種情況下,由於存儲庫是可克隆的,我克隆了它。 顯然它相當活躍:

$ git log --oneline -9
77bad25 Merge "Remove deprecated config option names: Juno Edition"
d4d712a Merge "Deprecate instance_get_by_uuid() from conductor"
d5bde44 Merge "Make metadata password routines use Instance object"
6cbc9ee Merge "Fix object change detection"
39b7875 Merge "Fix object leak in nova.tests.objects.test_fields.TestObject"
94d1034 Merge "maint: correct docstring parameter description"
6407f17 Merge "Fix live_migration method's docstring"
7406661 Merge "Fix infinitely reschedule instance due to miss retry info"
9d8a34f Merge "Remove unused code from test_compute_cells"

這比你的last-9輸出更新。 但更有意思的是,如果記錄它們的方式是--graph添加了--graph (我將數字增加到10):

$ git log --oneline --graph -n 10

*   77bad25 Merge "Remove deprecated config option names: Juno Edition"
|\  
| * d0a02fa Remove deprecated config option names: Juno Edition
* |   d4d712a Merge "Deprecate instance_get_by_uuid() from conductor"
|\ \  
| * | 1d340cc Deprecate instance_get_by_uuid() from conductor
* | |   d5bde44 Merge "Make metadata password routines use Instance object"
|\ \ \  
| |/ /  
| * | 28224a6 Make metadata password routines use Instance object
* | |   6cbc9ee Merge "Fix object change detection"
|\ \ \  
| * | | 429cd4b Fix object change detection
* | | |   39b7875 Merge "Fix object leak in nova.tests.objects.test_fields.TestO
|\ \ \ \  
| |/ / /  
| * | | 01381b8 Fix object leak in nova.tests.objects.test_fields.TestObject

(我們得到了一組不同的“最頂層”提交,因為--graph修改了遍歷,這就是為什么我去了10次提交)。

要了解這里發生了什么,你需要超越git loggit rev-list 像許多git命令一樣, git log 使用 git rev-list來選擇要顯示的修訂版。 (有些git命令實際上運行git rev-list而其他人共享它的源代碼,但無論哪種方式都可以運行相同的。)

git修訂符號x..y^xy縮寫(或y ^x意味着同樣的事情)。 無論你是寫一個像masterorigin/stable/havana這樣的名字,還是像HEAD這樣的間接名稱,或者一個原始的commit-ID,或者像77bad25一樣縮短的原始提交ID, xy部分都會被解析為底層的git對象(在我們的例子中應該是一個提交)。 您可以使用git rev-parse觀察解析步驟:

$ git rev-parse master
77bad252096f7a4a8174340f0f2a3baf1fd52195
$ git rev-parse HEAD
77bad252096f7a4a8174340f0f2a3baf1fd52195
$ git rev-parse origin/stable/havana
0bf0bb4b5df64f7266c903a986d0b90a1f223822

git rev-list對此做的是從此提交向后工作以查找其父提交,然后從那些提交到其父級,依此類推。 結果是一個祖先集。

在這一點上, master的祖先沒有特別的順序:

  • master自己: 77bad25...
  • master的第一個父母, git rev-parse master^1d4d712a...
  • master的第二個父級, git rev-parse master^2d0a02fa...
  • master的第一個父母的第一個父母, git rev-parse master^1^1d5bde44...
  • master的第一個父母的第二個父母, git rev-parse master^1^21d340cc...

當然還有更多,回去許多提交:

$ git rev-list master | wc -l
   27918

所以git rev-list master選擇所有27,000-and-some提交, git log master會顯示所有這些(按某種順序,根據通過git log傳遞給git rev-list其他選項修改的順序) 。

要排除其中一些,你可以告訴git rev-list從一些特定的修訂開始 - 比如01381b8 - 並找到它的所有祖先(包括01381b8本身):

$ git rev-list 01381b8 | wc -l
   27901

此時,這比通過從master啟動和向后工作所發現的提交少17個(並且在第二個列表中沒有提交,但是在第一個列表中沒有提交)。 因此,如果你告訴git rev-list給你“所有從master開始的提交,減去從01381b8開始的所有提交”,你應該得到17次提交:

$ git rev-list master ^01381b8 | wc -l
      17

事實上,這就是我們所看到的。 (實際的列表並不是那么有趣,但你可以用git rev-list master ^01381b8 ,或者相當於git rev-list 01381b8..master看到它。)

這些提交是git log將給出的,給定相同的修訂范圍。

您可以花幾天時間研究git rev-list文檔並仍然遺漏項目(例如,-- --graph告訴您它“啟用父級重寫”和“暗示--topo-order ”,直到我剛才檢查,我忘了關於父改寫部分。幸運的是,這里不適用,只需要--date-order強制繪制的圖形按日期而不是拓撲排序。)

使用以下命令,

git log --graph --pretty = format:'%Cblue%h%Creset - %C(紅色)%d%Creset%s%Cgreen(%cr)%C(粗體藍色)<%an>%Creset' - -abbrev提交

它將以豐富多彩的方式為您提供一行中的提交日志,其中包含分支名稱,作者詳細信息,圖形,日期。

試試這個 !! 真的太神奇了。

暫無
暫無

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

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