2016-01-13 75 views
2

如果我們籤一個承諾,而不是分公司,HEAD(指針分支)將指向提交的,而不是分公司的名稱(這個提交A)。這被稱爲分離HEAD狀態。如果我創建了一個新的提交 - 提交B,新的承諾將丟失(好吧,不是立即也許),因爲沒有辦法,我們可以參考它(實際上,我不明白這一點,因爲每次提交都有一個ID,對不對?一旦我們知道了ID,我們可以引用它,但由於某種原因,Git會刪除這樣的提交。可能Git無法知道提交所屬的分支)。爲什麼不提交跟蹤他們的孩子提交?

承諾只知道他們的父母,而不是孩子。是否有一個原因?如果提交A引用了提交B,我們可以忘記分離的HEAD問題,對吧?但我想這會導致一些其他問題 - 那些是什麼?

+1

問題的前提(即提交以單鏈表的形式實現)不正確。相反,提交形成一個有向無環圖。 – Jubobs

+0

@Jubobs好吧,任何想法,爲什麼這種情況? – user5539357

回答

5

承諾只知道他們的父母,而不是孩子。是否有一個原因?

總之

Git修訂不跟蹤他們的孩子,因爲他們是內容可尋址的和不可改變的。這個設計決策使得更簡單和更高效的架構。

更多細節

Linus Torvalds的,Git的,intended it to provide data integrity的設計師;如果快照中某個文件的某個版本受到損壞,Git應該能夠檢測到該文件。

爲了實現數據的完整性,Git會被設計爲a content-addressable filesystem。特別是,創建時,提交的內容會根據其內容(使用SHA-1 algorithm)收到一個「唯一」(禁止衝突)標識符。該標識符用作提交的checksum,可用於檢測數據損壞。

不變性是一個優勢:一成不變的東西更容易推理和可以共享。因此,承諾的不變性是一個非常理想的特徵。一旦創建,一個提交被設置成石頭;它不能以任何方式改變。您可以做的最多的是創建一個「類似」現有的提交(which is what happens when you run git commit --amend)。但是,如果你按照你的建議,提交了跟蹤他們的孩子,每次他們得到一個新的後裔,提交將不得不更新/替換,因爲他們的舊散列不會反映他們得到的事實一個全新的後代。這會挫敗不變性的好處,並使事情變得更加複雜。