我目前正在嘗試了解 git 的內部;我的問題是輕量級標簽和簡單 ref 之間有什么區別?根據我目前所讀到的內容,輕量級標簽實際上是一個帶有標簽名稱的檔案,其內容是一個物件 ID [我猜是一個提交物件 ID?]。在這本書“git 袖珍指南”中,作者說“一個簡單的 ref直接指向一個物件 ID”;這就是我困惑的地方!在我看來,這些是相同的東西,但名稱不同。說輕量標簽是簡單參考的特定版本是否正確?因為輕量級標簽只能指向提交物件,但簡單的 ref 不僅限于提交。
uj5u.com熱心網友回復:
甲REF(或較長的變型中,參考?)是一個名字,在GIT中。參考的形式有很多種:
refs/heads/xyz是分行名稱xyz;refs/tags/xyz是標簽名稱xyz;refs/remotes/origin/xyz是您的 Git 用于分支的遠程跟蹤名稱,xyz如您正在呼叫的其他一些 Git 存盤庫中所見origin;
等等。
Git物件是四種物件型別之一:
- 一個blob物件保持資料(檔案內容或一個符號鏈接的目標,例如);
- 一個樹物件包含 <mode, name, hash> 元組,其中模式告訴你哈希指定的 Git 物件型別,名稱包含名稱組件(目錄或檔案名);
- 一個commit物件保持的元資料的提交,其必須含有特定的頭檔案(包括正好一個
tree線給出一個樹物件的哈希ID:這是提交的快照); 和 - 一個標簽物件或注釋的標簽物件包含標記資料,這樣一個提交-必須含有特定的頭,包括一個
object線賦予標簽的物件的散列ID(其可以是任何的四個物件型別,包括另一注釋標簽) .
所有物件都有一個唯一的哈希 ID。該散列 ID 充當簡單鍵值資料庫中的鍵。Git會使用key來查找物件;您必須提供密鑰(以某種方式)。如果你提供了一個縮短的鍵——即鍵的前綴——Git 將查找通過該前綴找到的所有物件;如果只找到一個,則假定它是正確的完整哈希 ID,我們從那里繼續;如果找到多個,我們有一個不明確的哈希 ID(它可以是其中任何一個)。
所有 ref 都必須包含某個現有有效物件的哈希 ID。一些物件還包含哈希 ID;這些也必須是某些現有有效物件的哈希 ID。1
一些參考受限于它們可能包含的物件型別:特別是,分支名稱必須包含提交哈希 ID。由于遠程跟蹤名稱是通過從某個其他 Git 存盤庫(應該遵守同一組約束)讀取分支名稱來創建的,因此遠程跟蹤名稱還應包含提交哈希 ID。但是,標記名稱可以包含四種內部物件型別中任何一種的哈希 ID。
甲輕質標簽的形式的ref refs/tags/*-因此標簽名-包含有效散列ID,而且是一個用于內部GIT中物件,它是不一個標簽物件。帶注釋的標簽是refs/tags/*包含作為帶注釋標簽物件的物件的有效哈希 ID形式的參考。
說輕量標簽是簡單參考的特定版本是否正確?
大多數情況下,是的。輕量級標簽是一個特定的參考:以refs/tags(然后是斜杠和更多名稱字符)開頭的參考。但是,它滿足另一個約束:存盤在該 ref 中的哈希 ID是型別不是“帶注釋的標簽”的物件的哈希 ID 。
1在所謂的“淺克隆”或“部分克隆”中,此約束稍有放寬。(您可以擁有一個既淺又部分的克隆。)哈希 ID 應該是有效的,但我們無法確定它是否有效,直到我們填充缺失的物件。
uj5u.com熱心網友回復:
你是對的:輕量級標簽是一個簡單的參考。
它的主要特點是它存盤在 下.git/refs/tags,這是一個約定,表明 git 命令可以將其視為標簽:
git tag --list會列出來,git tag -d <tag_name>會洗掉,git將縮短名稱refs/tags/tag_name,以tag_name在若干情況下,- 等等 ...
與 refs 相關的其他主要約定是:
- 分支存盤在
refs/heads - 遠程參考(或遠程分支)存盤在
refs/remotes/<remote_name>/
這些參考文獻也是簡單的參考文獻。
非簡單 ref 的一個示例是HEAD(存盤在 中.git/HEAD)。
你可以運行cat .git/HEAD查看它的內容:如果你當前在一個分支上,你應該看到類似的東西:
$ cat .git/HEAD
ref: refs/heads/my_branch
這稱為符號 ref,作用于HEAD(例如 : git log HEAD)的命令將“翻譯”HEAD為my_branch.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387342.html
