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