那天下午,你在空蕩蕩的項目目錄里敲下git init。幾毫秒后,一個名叫.git的文件夾悄悄出現。你好奇心發作,點進去瞄了一眼:hooks、info、objects、refs……像打開一個精密儀器的維修蓋板。Git的一切秘密,都鎖在這個不起眼的隱藏文件夾里。
Git之所以能閃電般追蹤成千上萬個文件的變化,核心就在于它把項目的每一份快照都拆成四類“對象”。你可以把這套機制想象成四層抽屜的檔案柜:
![]()
- 第一層叫blob,只管存文件內容,不關心文件名,甚至不關心文件在哪個目錄里。
- 第二層叫tree,負責記錄目錄和文件的結構,像一張張地圖,告訴你某個文件夾里有哪些文件、分別對應哪個blob對象。
- 第三層叫commit,它不光指向當時根目錄的tree對象,還記下作者、時間戳、提交信息這些元數據,形成一個快照節點。
- 第四層叫tag,專門用來給特定版本貼標簽,比如發布v1.0時打上一個永久標記,方便以后隨時找回。
整個倉庫的歷史,就是這些對象不斷纏繞、指向、更新的過程。每次提交,Git都會生成一系列新對象,而舊對象只要沒被垃圾回收,就永遠留在那里。這也解釋了為什么分支切換和回滾這么快——本質上只是在不同commit對象之間移動指針罷了。
但光有對象還不夠。Git怎么保證每份內容的身份獨一無二、不會被張冠李戴?這就需要哈希出場了。Git采用SHA-1算法,根據內容計算出固定長度的唯一標識符,就像給每一塊數據拍了一張“指紋照”。
哪怕你只改了一個字符,得到的哈希值也截然不同。有了這個特性,Git在比對文件時不需要逐行檢查,直接對比哈希就知道內容是否變了。傳輸、存儲、去重都因此變得極省資源。你每次git commit看到的那些40位十六進制串,就是這些對象的終身身份證。
當你執行git init時,Git其實已經在幕后為這套系統搭好骨架。它創建分支默認指向main(或master),預設好HEAD引用,并在objects和refs目錄里騰出空間。接下來,不管你是新建文件、修改內容還是創建分支,都是在往這個數據庫里寫入新的對象。理解這一點,你就不再只是機械敲命令,而是在操縱一個會永遠記住每一版變化的內容追蹤器。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.