Git 中的物件模型和檔案的詳細檢視 —— Git 學習筆記 13

ARM的程式設計師敲著詩歌的夢發表於2018-09-23

Git 中的物件模型和檔案的詳細檢視


本文將用幾幅圖來視覺化一個叫file1的檔案從修改到暫存,再到提交的整個過程。相信會對你理解 Git 有一些幫助。

初始狀態

初始狀態如下圖所示:

在這裡插入圖片描述

可以看到,工作目錄包含file1file2兩個檔案,分別包含內容 “foo” 和 “bar”.

除了工作目錄下的file1file2之外,master 分支上有一個提交(初始提交),用圓形表示。它指向的三角形其實是一棵樹(你可以把它想象成目錄),樹指向了和file1file2內容完全一樣的 “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版)》,人民郵電出版社

相關文章