這篇文章內容是 Huli 程式導師計畫的第一週任務之一,這個任務是要跟你的朋友--家裡賣菜的菜哥,介紹 Git 的基本概念和操作。
菜哥說:「就是啊,我最近有一個煩惱。因為我的笑話太多了,所以我目前都用文字檔記錄在電腦裡,可是變得越來越多之後很難紀錄,而且我的笑話是會演進的。會有版本一、版本二甚至到版本十,這樣我就要建立好多個不同的檔案,弄得我頭很痛,聽說你們工程師都會用一種程式叫做 Git 來做版本控制,可以教我一下嗎?」
1. 什麼是 Git ? 為甚麽要用 Git?
簡單來說,Git 是一套工程師常用來做版本控制的系統。那什麼是版本控制?
1.1 一份檔案有好幾個版本,但想要把每個版本都保存起來
同一個檔案有版本一、版本二甚至到版本十,想要把每個版本都保存下來的時候,就要建立許多不同的檔案,像是「血乘四_v1.docx」、「血乘四_v2.docx」、「血乘四_final.docx」、「血乘四_終極final.docx」......。像這樣用建立許多檔案,來保留專案過程中各個階段檔案版本的方法,相信大家在求學過程或是工作上都很常遇到,這其實就是在做版本控制。
1.2 管理不同版本之間的關聯
我們保存了不同階段的檔案版本,目的就是希望能回到過去的某個版本查看內容。然而,我們光看檔名,卻很難知道不同檔案之間的差異在哪。
這個問題在只有一兩個版本,並且只有一個人在使用這個檔案的時候,好像問題不大。反正內容是你自己寫的,大概會記得不同版本之間差在哪裡,就算忘記,打開看一下就知道了。
但是,如果這個專案有一大堆檔案、每個檔案都有一堆版本、又需要多人協作的話,問題就大了。你不可能會知道別人的v1和v2、final和終極final版本之間差在哪裡,如果你改了其中兩、三個檔案的某個版本的話,這些問題又會變得更複雜,使溝通成本變得更大。這就是需要版本控制的原因。
2. 用 Git 來做版本控制的原理
這裡用「檔案夾」來解釋版本控制的概念,注意這並非完全是 git 運作的方式,只是因為這樣比較好理解。
2.1 用 「檔案夾」來同步相關檔案的版本
菜哥的一個笑話可能會包含好幾個互相關聯的檔案,像是
- 「前言.docx」
- 「故事.docx」
- 「諧音梗.docx」
- 「尷尬配樂.mp3」
每次菜哥想修改的部分可能不同,所以不同檔案的版本並不同步,但這樣就很難知道「前言_v3」對應到的到底是「故事_v5」還是「故事_v4」。
為了解決這個問題,我們可以把「前言.docx」、「故事.docx」、「諧音梗.docx」、「尷尬配樂.mp3」這些檔案放到「血乘四」這個資料夾裡面。每次只要菜哥想要更動其中一個檔案,就要複製一次這個資料夾。如此一來,你就可以確保「血乘四_v2」這個資料夾裡的四個檔案,之間一定是能互相搭配的。
2.2 不用做版本控制的東西,丟在檔案夾之外
菜哥用上面的方法複製到「血乘四_v8」的時候,發現「尷尬配樂.mp3」這個檔案從 v1 到 v8 完全一模一樣。因為這個音檔是菜哥的招牌 bgm,所以菜哥在建立新版本的時候,完全不會更動到這個檔案。其實如果某些檔案確定不會更動,就可以把它放在檔案夾之外。這樣在複製「血乘四」資料夾的時候,「尷尬配樂.mp3」就不會一直跟著被複製。
2.3 透過「亂數」命名版本,避免你我用同樣的檔名造成衝突
菜哥把「血乘四_v9」的檔案放到雲端和好姐妹癢央分享。癢央看完之後,覺得有些需要修改的地方,所以在抓下來修改之後,上傳了「血乘四_v10」給菜哥。但與此同時,菜哥也突然有了新靈感,同時新增了一份「血乘四_v10」資料夾。這樣就出現了兩個名字一樣,但編輯者不同、內容也不同的版本。
為了避免這個尷尬的情形發生,我們可以把檔案夾的名稱,都以不重複出現的亂碼命名。我們把央央的檔案夾重新命名為「fgji4lek3」,菜哥的則命名為「gji4kdl3」,這樣就能解決版本號碼衝突的問題了。
2.4 用 「最新檔案」、「版本號記錄」兩個檔案來辨別亂數
當檔案夾的名稱都變成亂碼的時候,雖然解決了版本號衝突的問題,但卻無法從檔名看出版本之間的順序,也不知道是誰編輯的。因此,我們需要新增一個「版本號記錄.txt」的檔案,來記錄上傳者、上傳時間、版本號碼。像是:
- 「癢央,4/15 20:00,fgji4lek3」
- 「菜哥,4/15 20:20,gji4kdl3」
隨著檔案版本越來越多,菜哥很難找到最新的版本來查看。這時可以再新增一個「最新版本.txt」,放入gji4kdl3
,這樣就可以馬上找到最新檔案了。
3 .Git 怎麼使用?
現在菜哥準備好要用 git 做版本控制了,他建了一個叫「血乘四」的資料夾,裡面有四個檔案,分別是:
- 「前言.docx」
- 「故事.docx」
- 「諧音梗.docx」
- 「尷尬配樂.mp3」
以下介紹幾個 git 的基本指令,注意下面我用中文檔名來示範,但實際在做 git 的時候,最好用英文命名,才不會出現問題)
3.1 git init
:初始化。
在 terminal 找到你想要做版本控制的資料夾位置「血乘四」之後,輸入 git init
。這個指令會在資料夾裡新增一個.git的隱藏檔案夾,來幫你來做版本控制。
3.2 .gitignore
: 忽略版本控制
前面講過,版本控制的其中一個原則,是「不用做版本控制的東西,丟在檔案夾之外」。
建立一個 .gitignore 來記錄不要版本控制的檔案:輸入 touch .gitignore
來建立一個 .gitignore 檔案,接著輸入 vim .gitignore
進到這個檔案,寫下 尷尬配樂.mp3
。
3.3 git add.
: 把全部檔案加入版本控制
接著輸入 git add .
。這個指令會把所有的檔案加入版本控制。.
的意思是這個資料夾下所有的檔案,除了已經被.gitignore 忽略的 尷尬配樂.mp3
,都會進入版本控制的待提交區。
3.4 git commit
:提交新版本
接著可以輸入 git commit
來提交這個版本。按 enter 之後,會請你輸入這個版本的提交說明,你可以輸入「第一版」。這樣第一個版本就已經被記錄了。
如果菜哥想要建立新的版本,不需要再像上面的步驟一樣複製一個新的資料夾,因為 git 會幫你記住版本之間的變化。菜哥只需要打開原本的檔案編輯,編輯過後重複 git add.
和 git commit
這兩個步驟,新版本就會產生了。
補充:檢查的相關指令
如果菜哥在操作的過程中想確認版本控制的狀態、確認各個版本的話,以下提供幾個指令給菜哥參考。
1. git status
:確認版本控制的狀態。
輸入 git status
後,會出現以下兩個欄位。
untracked 未追蹤區 | staged 準備提交區 |
---|---|
未加入版本控制(從來沒有 git add 過的新檔案 | 有加入版本控制(在前面的版本已經 git add 過)但尚未建立新版本的檔案。紅色尚未暫存(在最新尚未提交的版本中還未 git add ),綠色是已暫存。 |