了解儲存庫、工作目錄、物件與索引之間的關係

Share This Post

在 Git 裡,主要可以分成「工作目錄(Working Directory)」、「暫存區(Staging Area)」以及「儲存庫(Repository)」三個區塊,透過不同的 Git 指令,可以把檔案移往不同的區域:

了解儲存庫

當我們在任意的資料夾輸入 git,底下資料夾便可以看到 . git,而在 .git 目錄下儲存完整的Git 儲存庫,未來的所有版本變更都會自動存在此資料夾中。

了解工作目錄

我們之後準備開發的專案檔案,都會和git同一個目錄底下,也就是我們會在此工作目錄底下進行新增、修改、刪除與更改檔案名稱。

由於在使用 Git 版本控管時,會遭遇到很多分支的狀況,所以工作目錄會在不同的分支之間進行切換,有些 git 指令在執行的時候,會一併更新工作目錄下的檔案。例如當你使用 git checkout切換到不同分支時,由於目前分支與想要切換過去的分支的目錄結構不太一樣,所以很有可能會將你目前工作目錄下的檔案進行更新,好讓目前的工作目錄下的這些目錄與檔案,都與另一個要切換過去的分支下的目錄與檔案一樣,因此適時的保持工作目錄的乾淨是板控的基本原則。

了解 Git 的資料結構

在 Git 裡有兩個重要的資料結構,分別是「物件」與「索引」結構。

關於物件

用來保存版本庫中所有檔案與版本紀錄,

物件的產生是將檔案中內容取出並產生一組 SHA1 雜湊值,並依照 SHA1 雜湊值命名一個檔案。

物件的類型

在這些「物件資料庫」裡面,又包含了 4 種物件類型,分別是:

  1. blob 物件:當你執行 git add指令的同時,這些新增檔案的內容就會立刻被寫入成為 blob物件,並把原本的「檔案內容」當成 blob 檔案 的內容 (注意: blob 物件其實就是一個實體檔案),內容進行 SHA1雜湊運算後產生的一個 hash id,再把這個 hash id 當成 blob檔案的檔名。而像是檔案時間、原本的檔名或檔案的其他資訊,都會儲存在 tree 物件。
  2. tree 物件:這類物件會儲存特定目錄下的所有資訊,包含該目錄下的檔名、對應的 blob物件名稱、檔案連結(symbolic link) 或其他 tree 物件等等。由於 tree 物件可以包含其他 tree 物件,所以瀏覽 tree 物件的方式其實就跟檔案系統中的「資料夾」沒兩樣。簡單來說, tree 物件這就是在特定版本下某個資料夾的快照(Snapshot)。
  3. commit 物件:用來記錄有哪些 tree 物件包含在版本中,一個 commit 物件代表著 Git 的一次提交,記錄著特定提交版本有哪些 tree 物件、以及版本提交的時間、紀錄訊息等等,通常還會記錄上一層的 commit 物件名稱 (只有第一次 commit 的版本沒有上層 commit 物件名稱。)
  4. tag 物件:是一個容器,通常用來關聯特定一個 commit 物件 (也可以關聯到特定 blobtree 物件),並額外