03/19 本篇章節
第五篇 · 19 章
開始使用 Git
- 01 新增、初始 Repository
- 02 把檔案交給 Git 控管
- 03 工作區、暫存區與儲存庫
- 04 檢視紀錄
- 05 【狀況題】如何在 Git 裡刪除檔案或變更檔名?
- 06 【狀況題】修改 Commit 紀錄
- 07 【狀況題】追加檔案到最近一次的 Commit
- 08 【狀況題】新增目錄?
- 09 【狀況題】有些檔案我不想放在 Git 裡面...
- 10 【狀況題】檢視特定檔案的 Commit 紀錄
- 11 【狀況題】等等,這行程式誰寫的?
- 12 【狀況題】啊!不小心把檔案或目錄刪掉了…
- 13 【狀況題】剛才的 Commit 後悔了,想要拆掉重做…
- 14 【狀況題】不小心使用 hard 模式 Reset 了某個 Commit,救得回來嗎?
- 15 【冷知識】HEAD 是什麼東西?
- 16 【狀況題】可以只 Commit 一個檔案的部份的內容嗎?
- 17 【冷知識】那個長得很像亂碼 SHA-1 是怎麼算出來的?
- 18 【超冷知識】在 .git 目錄裡有什麼東西?Part 1 僅收錄於電子書
- 19 【超冷知識】在 .git 目錄裡有什麼東西?Part 2 僅收錄於電子書
第五篇 · 開始使用 Git
工作區、暫存區與儲存庫
在上個章節「把檔案交給 Git 控管」介紹到可以使用 git add 指令把檔案加至暫存區(Staging Area),然後可使用 git commit 指令把暫存區的內容移往儲存庫(Repository)。
在 Git 裡,主要可以分成「工作目錄(Working Directory)」、「暫存區(Staging Area)」以及「儲存庫(Repository)」三個區塊,透過不同的 Git 指令,可以把檔案移往不同的區域:

git add指令把檔案從工作目錄移至暫存區(或索引)。git commit指令把暫存區的內容移至儲存庫。
請記得,要執行 Commit 指令,也就是要存放到 Repository 才算是完成整個流程喔。
基本上,只要記得這三個區塊怎麼操作,在本機端的 Git 操作應該就沒太大的問題了。不管是用指令操作,或是用圖形介面工具操作,請一定要親自操作、熟悉這個流程。
一定要二段式嗎?
會覺得要先 add 再 commit 有點囉嗦嗎?你可以在 Commit 的時候多加一個 -a 的參數,縮短這個流程:
$ git commit -a -m "update content"
這樣即使沒有先 add 也可以完成 Commit。但要注意的是這個 -a 參數只對已經存在 Repository 的檔案有效,對還是新加入的檔案(也就是 Untracked file)是無效的。
或是,如果你是使用像是 SourceTree 之類的圖形介面工具,可以勾一勾檔案,填寫 Commit 訊息後,按下 Commit 按鈕就可完成提交的流程:

雖然圖形介面工具可以讓你省一些麻煩,它實際上的運作原理也是一樣的,這也是為什麼在本書一直強調的,要學好 Git 一定要了解它的運作原理。
為什麼要二段式這麼麻煩?
先 add 再 commit 這樣二段式感覺可能有點麻煩,但也是有好處的。你可以想像你有一個倉庫,在倉庫門口有個小廣場,這個廣場的概念就像跟暫存區一樣,你把要存放到倉庫的貨物先放到這邊(git add),然後等收集的差不多了就可以打開倉庫門,把在廣場上的貨物送進倉庫裡(git commit),並且記錄下來這批貨是什麼用途的、誰送來的。
當然,你也可以每來一件貨物就開倉門存一次、紀錄一次,但這樣一來開倉庫的次數就會非常多。老實說這樣也沒什麼過錯,只是因為太過零碎的 Commit,有時候要查閱紀錄可能會有點不太方便;另外,過於零碎的 Commit 也可能給你的同事帶來一些困擾,例如要進行 Code Review 的時候,比較有整理的 Commit 可以一次看到比較完整的內容,而不需要一個一個 Commit 慢慢看。
所以,什麼時候要 Commit?
這個問題沒有標準答案,你可以很多檔案修改好再一口氣全部一起 Commit,也可只改一個字就 Commit。常見的 Commit 的時間點有:
- 完成一個「任務」的時候:不管是大到完成一整個電子商務的金流系統,還是小至只加了一個頁面甚至只是改幾個字,都算是「任務」。
- 下班的時候:雖然可能還沒完全搞定任務,但至少先 Commit 今天的進度,除了備份之外,也讓公司知道你今天有在努力工作。(然後帶回家繼續苦命的做?)
- 你想要 Commit 的時候就可以 Commit。