何謂版本控制
版本控制(英語:Version control)是維護工程藍圖的標準作法,能追蹤工程藍圖從誕生一直到定案的過程。 此外,版本控制也是一種軟體工程技巧,藉此能在軟體開發的過程中,確保由不同人所編輯的同一程式檔案都得到同步。 –維基百科
簡單來說,就是希望能備份某些重要的時點
對於程式專案來說,最暴力的方式就是用整個資料夾來備份,但這樣做成本會太高(重複記錄相同的檔案),並且操作上沒有效率。
相對而言git是採用指標節點的方式紀錄檔案(硬碟指標),以及會將狀態的節點以tree的方式串接起來,回復、更改、分支都更加有效率
file system 與 git 的虛擬碼
既然需要紀錄file system的資料,首先就要先認識他的結構
file system本質上是一個以root為頂端的tree,資料夾為一個指標,指向其內含物,而資料可視為blob(Binary Large OBject)
因此此為遞迴的定義
例如:
git實際上以bash script 與C語言寫成
虛擬碼如下
type blob = array <byte> #binary data
type tree = map <string , tree | blob> #目錄內有其他目錄 或 檔案
type commit = struct { # 也就是一個狀態
parents : array <commit> #指向parent狀態
author : string #meta data
message : string
snapshot : tree #當下狀態的目錄架構
}
type object = blob | tree | commit #抽象化以store於硬體中
disk = map <string , object> #hash table的方式儲存
def store (obj):
id=hash(obj)
disk [id] = obj #儲存進硬體hash table裡
def found (id):
return disk [id]
註:在實作上,不會真的儲存所有資料,通常是儲存其id,作為reference
(所有obj都有id => 所有file , folder , commit 都有id
=>所以至少snapshot , parents於commit中,只要記id就好)
hash id
上述的資料的檔案內容會依 SHA-1 (secure hash algorithm) 雜湊成一組長度為40的16進位碼
特性為 容易給定message計算出hash 、反推困難、不容易碰撞 …
例如它會將hello字串單向加密成aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
參考資料
missing semester :Lecture 6: Version Control (git) (2020)
https://www.youtube.com/watch?v=2sjqTHE0zok&t=2401s