# Outline
一、前言
二、概念
2-1. 倉儲
# TL;DR
...
今天一樣是回過頭來補充前面沒提到的概念,就是很常講到但不一定暸解的 Repository。
—— Day 28
凡是用 Git 作為版本控制工具的,我想沒有人沒聽過 Repository 這個詞。通常我們在 GitHub 新增一個託管程式碼的空間時,也會和我們說是「Create a new repository」。Repository 這個詞到底是指什麼呢?為什麼不用 Project 作為名稱呢?我想這就是這篇文章想聊的範疇。也希望能透過篇,為「空間」作為一個導讀。
再繼續閱讀下去前,不妨也自己思考一下,到底什麼是 Repository。
在 Pro Git 的中文語系中,台灣社群是將 Repository 翻譯成「倉儲」,中國社群則是將它翻譯成「倉庫」,這的確就是 Repository 這個詞的本意。為了讓譬喻更生動,在這一小節我會盡量用生活上常聽到的名詞去代稱 Git 裡的各個術語,並在後面附上原文。
學過前面「結構」的部分,也大概知道其實 Git 就是把各個被版本控制的檔案經過 SHA-1 運算與壓縮處理後,變成所謂的 Git Object,然後一個個放在 .git
目錄底下。這是不是很像把一個個物品進行編號、封裝後,放進倉儲空間裡呢?我想這應該就是會取名會 Repository 的原因。
所以事實上 .git
目錄就是 Repository 本身,而我們平時開發工作的空間,其實不過就是從這個 Repository 將物件拿出來進行加工,當開發作業告一段落後,又會將這些成品再放入 Repository。
這個工作空間通常會稱為 Working Directory,也就是工作目錄的意思。我們會在這個工作空間(Working Directory)確認是否空間裡的物件在倉儲(Repository)裡已經有一份一模一樣的了?或是我們是將這個一樣的物品拿到這個空間裡進行加工(Develop)?又或是這個物件是新的,在倉儲(Repository)裡並不存在?聊到這邊,是不是有點感覺了?
而在工作空間(Working Directory)裡新的物件或者經過加工的成品,若我們希望放進倉儲(Repositroy),我們就會先將這些物品放在出貨區,也就是我們常說的 stage 或是 index,這個過程是不是和現實很相近?要進倉儲(Repositroy)裡,先放在這樣的一個空間讓我們清點一下,確認無誤後,我們再伴隨著清單做點描述與編號,最後進入倉儲(Repositroy)裡,這個過程就是我們常講的 Commit。
但與現實不太一樣的是,事實上這個 Commti 並不是真的出貨。而是將這些放在 stage 空間中,確定要進 Repository 的檔案,和有了他們的工作空間(Working Directory)進行一個拍攝。或許更像是我們進行了一次、次的空間設計,每次改動告一段落都拍個照,然後將這些有在空間使用到的傢俱都在倉庫放一份,等哪天客人想要看照片裡實際的空間佈局,就按照照片把這些傢俱都搬出來重新佈置一次。這樣想的確就貼切得多。
為了方便整理照片,我們也會在每一張照片的背面標記個編號,然後註記這張照片在改動前是從哪張照片的場經過來的,於是就會有一個空間設計改變的歷史,像一條條鏈一樣,環環相扣。而這些照片在 Git 世界裡,寄售所謂的 Commit;將這些有前後關係的照片夾在同一條繩子上,就是所謂的 Commit Tree;所謂的 Branch 也不過是方便我們去稱呼這某張照片與其前面照片的參考稱呼罷了,Tag 更只是幫某張照片取名字。
我想談到這邊,對於 Git Repository 與其周邊空間和結構的畫面更就非常具體了。或許也是時候從夾滿照片繩子的文青風格裡醒來,讓我們再聊聊更深層的原理吧!