Git 中的物件模型和檔案的詳細檢視 —— Git 學習筆記 13
Git 中的物件模型和檔案的詳細檢視
本文將用幾幅圖來視覺化一個叫
file1
的檔案從修改到暫存,再到提交的整個過程。相信會對你理解 Git 有一些幫助。
初始狀態
初始狀態如下圖所示:
可以看到,工作目錄包含file1
和file2
兩個檔案,分別包含內容 “foo” 和 “bar”.
除了工作目錄下的file1
和file2
之外,master 分支上有一個提交(初始提交),用圓形表示。它指向的三角形其實是一棵樹(你可以把它想象成目錄),樹指向了和file1
和file2
內容完全一樣的 “foo” 和 “bar”.
索引中的那個三角形,和物件庫的那棵樹是完全一樣的,它們都指向相同的物件(“foo” 和 “bar”)。
這幅圖還告訴我們,分支就是一個指標,指向某個提交。
目前來看,工作區、索引、物件庫是完全一致的,沒有什麼是髒的。
編輯一個檔案之後
如圖所示,當把檔案file1
的內容從 “foo” 改成 “quux” 之後,索引和物件庫並沒有變化,但是工作目錄髒了,因為它和索引不一致了。
暫存檔案後
當執行命令git add file1
後,一些有趣的變化發生了。
Git 首先取出工作目錄中file1
的最新版本(“quux”),為它的內容計算出一個 SHA1 雜湊 ID(bd71363),然後把這個 ID 儲存在物件庫中(當然,檔案內容也會儲存在物件庫中)。接下來,Git 會改變索引,讓索引指向新的file1
file2
沒有變化,所以索引依然指向原來的file2
。
此時,工作目錄與索引是一致的。但是,索引和物件庫不一致。
提交之後
啊呀,提交之後好像圖示有點亂啊。彆著急,我來解釋一下。
首先,索引物件轉化成了一個真實的樹物件(深色的三角形),這個物件會以 SHA1 命名(圖上沒有標出來而已),被放到物件庫中。
其次,用你的日誌訊息建立了一個新的提交物件(深色的圓形)。新的提交物件會指向新建立的樹物件,並且指向前一個提交。
最後,master 分支的引用從最近一次提交移動到新建立的提交。
此時,工作目錄、索引和物件庫再次同步,又變得一致了。
參考資料
《Git 版本控制管理(第2版)》,人民郵電出版社