# 前言
歷經那麼多天的廢話,終於可以進入重頭戲,來學習怎麼發布一個版本吧!
記得在建立 Git 儲存庫的文章中有提到,如果要發布一個版本,會歷經把檔案放到 暫存區,再把 暫存區 的檔案提交到 儲存庫 兩個階段。
言下之意,我們會使用「兩個」指令來提交一個版本。
老樣子,指令介紹完再說明 Fork GUI 操作。
給立志成為指令派的讀者:在 Fork GUI 最後有補充一個指令細節,建議也可以讀一下 Fork 的部分。
# 提交一個版本
# 第一步:將檔案加到暫存區
初始化儲存庫 ( git init
) 之後,即便已經有了地端儲存庫 ( .git
),Git 也不會主動「暫存」資料夾中的任何檔案,包含初始化之前就有的檔案。
這個概念就像商家進貨新商品,頂多是跟你推銷有新東西,但商家沒有權力 (也沒道理) 直接把新商品加到你的購物車,你如果想購買什麼商品,就必須自己先把商品加到購物車再說。
回到 Git 的世界:
要發佈一個版本的第一步:把「檔案」加到「暫存區」。
# 透過指令將檔案加入暫存區
我們可以透過這個的指令告訴 Git:「我想要把『檔案』加入『暫存區』!」
git add 檔案名稱 |
如果是「資料夾內的所有內容」都要版控,也可以直接放「資料夾名稱」:
git add 資料夾名稱 |
有時候我們很貪心 (?),希望一次打包工作目錄「所有內容」,可以直接執行下面這個指令,注意有個 「 .
」。
git add . |
然後就做完了,加入暫存區的行為,如同點選「加入購物車」按鈕一樣,很快 XD。
# 透過 Fork 將檔案加入暫存
如果資料夾中有 未暫存的檔案 (還沒加到暫存區的檔案) ,Fork 會讓檔案陳列在 Local Changes 裡面的 Unstaged 區塊內。
在 Fork GUI 中,把檔案加入暫存的行為,就是要把檔案移到 Staged 區塊。
有幾種方式可以達成這個目的:
-
選擇檔案後,再點選 Stage 按鈕。
-
直接把檔案拉到 Staged 區塊。
一次把所有檔案暫存區,也有兩種方式:
-
直接點選區塊上方的 「
︾
」。
-
點擊第一個檔案後,「按著鍵盤
shift
鍵,點擊最後一個檔案」,最後按 Staged 按鈕。
以上是 Fork GUI 將檔案加入暫存區的方法。 越看越像加入購物車
# 第二步:提交 (commit) 一個新的版本
commit,有人會照著字面翻譯成「認可」,也有人解釋成 「提交」、「發佈」或「進版」。無論說法如何,都是要把「暫存區」的資料存到「儲存庫」的行為。
用網購的例子來解釋,就是購物車已經有商品了,要去執行「下單結帳」的動作,這個動作完成之後,商品最終會被記錄在「已購買清單」資訊,也就是 Git 的儲存庫。
# 透過指令提交版本
用指令來提交版本有兩種做法,雖然都是同一個指令,但操作上會不太一樣:
- 執行 commit 指令,同時輸入標題訊息
git commit -m "版本標題訊息" |
- 執行 commit 指令,在「文字編輯器」輸入標題訊息
git commit |
這兩者的差異在於,用第一種方式在輸入完指令之後,提交版本的行為就結束了。
如果執行第二種方式的指令,Git 會直接跳出「文字編輯器」給我們輸入標題資訊。
Git 預設的文字編輯器是 Vim
,它的操作方式對新手來說可能沒那麼直覺,建議可以參考 Git 初始化設定 文章的說明,換成熟悉的編輯器,例如 Visual Studio Code
之類,畢竟時代已經不同了:
# 執行 commit 指令,同時輸入標題訊息
把檔案加入暫存區後,再執行這個指令,暫存區的檔案就會一次被記錄在同一個版本中:
git commit -m "版本標題訊息" |
-m
(message) 參數的用意,是為了直接在指令中寫「版本標題訊息」,這個「版本標題訊息」的用意,是要讓我們有辦法一眼看出當初發布的這個版本做了什麼事情。
訊息想要寫中文還是英文都是完全沒問題的:
git commit -m "第一次Commit" |
訊息兩側的雙引號 ( ""
) 也可以省略:
git commit -m 第一次Commit |
必須使用雙引號的狀況,是訊息內容含有「空白字元」時才需要,例如這樣:
git commit -m "第 一 次 C o m m i t ! ! !" |
如果訊息包含 空白鍵
卻沒有包 雙引號
,指令會 無效
而跳出錯誤:
$ git commit -m 沒 加 雙 引 號 | |
error: pathspec '加' did not match any file(s) known to git | |
error: pathspec '雙' did not match any file(s) known to git | |
error: pathspec '引' did not match any file(s) known to git | |
error: pathspec '號' did not match any file(s) known to git |
如果真的忘記加雙引號而跳錯誤,其實就再重新一次正確的指令語法即可,不過我們還是養成好習慣,執行 git commit -m
時,一律加上雙引號吧!
補充:
筆者在好幾年前曾使用單引號 (''
) 代替雙引號 (""
) 使用也是會有問題,不過新版的 Git 貌似已經支援單引號包覆訊息,目前測試起來兩者都能使用,大家可以稍微留意。
# 執行 commit 指令,在文字編輯器輸入標題訊息
不管是有意還是無意,如果只輸入 git commit
就按了「確定鍵」, Git 會跳出設定好的「文字編輯器」,同時在終端機提示我們把「版本標題訊息」寫到文字編輯器裡:
Waiting for your editor to close the file
:提示我們輸入完標題訊息後,**「關掉」** 檔案。
$ git commit | |
hint: Waiting for your editor to close the file... |
此時的編輯器內容會長這樣 (第一行的空白不是我多打的,是真的就長這樣):
# Please enter the commit message for your changes. Lines starting | |
# with '#' will be ignored, and an empty message aborts the commit. | |
# | |
# On branch master | |
# | |
# Initial commit | |
# | |
# Changes to be committed: | |
# new file: index.html | |
# new file: readme.txt | |
# |
可以依照下面的步驟來提交一個版本
- 在編輯器中寫入版本標題訊息 (
#
後面都是註解,可以刪掉,也可以不管它)。 - 存檔、關閉視窗。
- 看到終端機跳出類似下方的訊息,代表 版本發佈完成。
$ git commit | |
[master (root-commit) de6d6f3] 第一次 Commit | |
2 files changed, 0 insertions(+), 0 deletions(-) | |
create mode 100644 index.html | |
create mode 100644 readme.txt |
備註:
如果沒有輸入任何訊息就關掉視窗,Git 會當做沒有要發佈版本而在終端機呈現 Aborting commit due to empty commit message.
的資訊,代表放棄這次的 commit:
$ git commit | |
Aborting commit due to empty commit message. |
# 透過 Fork 提交版本
-
確定暫存區 (
Staged
) 的資料正確。 -
找到 Commit Subject 與 Description 輸入框。
-
在輸入框寫入訊息,並點選 commit Files 按鈕。
-
完成之後,點選視窗左邊 All Commits 選項,就能看到第一次的 commit。
眼尖的讀者可能有注意到,怎麼 Fork 有 Description,但指令沒教!!
其實輸入指令提交版本時,很少 (註 1) 會去寫「描述」(Description),不過既然 Fork 出現了,就補充一下:
# 透過指令提交版本時,同時輸入標題 (Title) 與描述 (Description)
如果要輸入標題與描述,我們會用到二個 -m
來表示,指令如下:
git commit -m "版本標題訊息" -m "對於訊息更詳細的描述" |
註 1. 記得前幾篇文章曾貼出了一張 Git 線圖。
圖中看到的訊息其實只有 Title,即使有寫 Description 也不會「攤」出來顯示,也因為 Title 資訊比較容易「一覽」,筆者幾乎只會輸入 Title。
不過發佈版本到底要不要寫 Description,就看個人或是團隊的習慣了。
# 一次完成 add 跟 commit 動作
一般來說,已經將檔案存到儲存庫之後,這些檔案如果有修改而需要重新更版的話,就必須重新執行這兩個動作:先 git add
檔案後,再執行 git commit
。
就好像同一個商品你想再買不同款式,必須重新把商品加入購物車,再次下單一樣。
不過工程師是一個懶惰的生物,每次都要分兩步好麻煩!
已經加入儲存庫 的檔案,於修改後要再上一版,可以在 commit 指令中,多加一個 -a
參數,就可以省略 add
的行為。
git commit -a -m "版本標題訊息" |
這兩個參數也可以合併在一起寫:
git commit -am "版本標題訊息" |
不過要再次強調的是,這適用於「已經 Commit 過的檔案」,剛新增的檔案,由於儲存庫沒有紀錄,是不能跳過「加入暫存區」的行為哦!千萬要注意!
# 透過 VSCode 一次完成
如果你也是 VSCode 使用者,可以玩玩它預設已經有的 Git 功能:
- 先點到左邊選單中的「Git」圖案。
- 修改的檔案會出現在「變更」的項目中。
- 可以直接在輸入框寫好「版本標題訊息」後,點選「提交」按鈕。
- 此時應該會看到一個提示訊息告訴我們「更動的檔案尚未加到暫存區」之類的
(我已經叫他不要顯示,所以沒圖可以截…) - 點選確認後就能自動提交一個版本。
其實更正規的做法應該是在「變更」選單中,將所有檔案先加到暫存,最後才執行提交,也就是要先「加入購物車」,才能「下單」的程序。
在 Visual Studio Code 中,即使是沒加到儲存庫的檔案,透過「提交按鈕」也可以直接省略「加入暫存區」的行為。
為此筆者才會不斷強調,無論想操作指令或 GUI,都 一定要 先理解 Git 的觀念,才不會在版控流程中迷失了方向,也比較不會被不同的 GUI 設計流程所困擾。
# 透過 Fork 一次提交
恩… Fork 沒有一次完成的功能,乖乖地先把檔案加到暫存區,再 commit 吧!
# 常見問題
# 1. 所以 commit 完,檔案就存好了?
對,這樣就存好了。
我懂一個「感覺」的問題,因為執行 commit 之後,好像「看不到」東西,很沒有真實感。
不過要知道 Git 版控的模式並不是「複製」實體檔案,而是把檔案「編碼」紀錄在 .git
隱藏夾中。
這種紀錄方式用「肉眼」確實不好辨別,我們才會需要「Git 線圖」來確認我們的版本資訊,像這樣:
# 2. 不是阿… 不是應該在 GitHub 出現檔案才叫發佈一個版本嗎?!你是不是只教一半啊?
沒有,我真的教完了。 不信你打我啊 沒… 沒事… 我開玩笑的…
回到觀念,分散式版控系統在「地端儲存庫」就能獨立完成版控,不用連到「遠端」。
你的工作目錄因為執行 git init
已經建立好「地端儲存庫」,而 GitHub 本質是「遠端儲存庫」,這兩個東西完全可以分開來看。
在「地端儲存庫」發佈版本的行為,在 commit 指令完成後,就結束了。
關於「地端」與「遠端」資料的同步,之後會專門寫幾篇文章來跟各位講解。
# 總結
這篇文章寫了很多 廢話 內容 ,不過重點只有一個:學會把檔案提交成一個版本。
怎麼發布?兩個步驟:
- 執行
git add
將檔案加到「暫存區」。 - 執行
git commit
將檔案加入「儲存庫」。
打完收工。