跟你的朋友介紹 Git


這篇文章內容是 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),綠色是已暫存。
2. git log 確認提交完成的各個版本
3. git diff 在 commit 之前查看這次修改了什麼
#Git #branch






Related Posts

Day 03:  GraphQL and GiHub GrapQL - Operations, Variables, and Mutations

Day 03: GraphQL and GiHub GrapQL - Operations, Variables, and Mutations

資料庫型態的選擇以及 cookie

資料庫型態的選擇以及 cookie

React

React






Comments