基本概念 - 建立提交

·

1 min read

提交(commit)是修訂歷史的一個節點,或者稱它是一個「版本」,它的概念很類似過去玩單機 RPG 遊戲的存檔功能。

當版本庫裡,做了提交之後,就可以:

  1. 讀取提交資訊(git show

  2. 比對兩個不同版本的差異(git diff

  3. 重置工作目錄到該版本的狀態(git switch

提交資訊

一個提交裡會有什麼內容呢?若是談到程式碼的修改記錄,不外乎就是下列三種情境所產生的記錄:

  1. 新增,如新增一個程式檔,或是新增了一個條件判斷式。

  2. 修改,如修改文件,或是改換呼叫另一個函式。

  3. 刪除,如刪除已不再使用的程式,或是邏輯調整而移除片段程式碼。

對於 Git 而言,對既有檔案的內容做任何調整,都屬於修改的情境,而新增修改是使用 git add 指令,而刪除則是用 git rm 指令。

額外的內容

除了程式的內容以外,提交裡還會有其他 metadata 如下:

  1. 作者(author)與日期

  2. 提交者(committer)與提交日期

  3. 提交的 ID

  4. 前一個提交的 ID

提交的三個階段

Git 在將程式碼修改內容放入版本庫前,會需要經過三個階段,這是初學 Git 可能會混亂的地方。

  1. 工作目錄(working directory)

  2. 暫存空間(staging area)

  3. 版本庫(repository)

三個階段是互相有關係的,如下圖:

這張圖可以看到三個階段之間的轉換,會對應到下列三個行為:

  1. 從工作目錄,將暫存內容放入暫存空間。這指的是使用 git addgit mvgit rm 等指令,它會把寫好的程式碼,暫時放入一個虛擬空間,稱之為暫存空間。暫存空間具有提交的特性,比方說,它可以做還原版本之類的操作。

  2. 從暫存空間,將提交內容放入版本庫。git commit 指令將會把這個暫存空間內的所有內容,建立成真正的提交。在建立之前,Git 允許我們可以做最後確認。

  3. 從版本庫,簽出(checkout)內容到工作目錄。使用 git checkout 可以把該版本的檔案或目錄內容拿出來放到工作目錄裡 ,讓開發者可以依該版本的內容繼續開發或審查程式。

實務範例

延續哈囉!Git!的練習,對檔案修改並提交,實際執行如下,首先修改檔案:

# 修改檔案內容
❯ echo 'Good bye Git!' >> file

接著檢查工作目錄狀態,這裡可以看到檔案已轉變為未修改的狀態

# 檢查檔案狀態
❯ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   file

no changes added to commit (use "git add" and/or "git commit -a")

最後將檔案加入暫存區並提交:

# 加入檔案
❯ git add .

# 提交內容
❯ git commit -m "Second commit"
[master ecb0b28] Second commit
 1 file changed, 1 insertion(+)