# 前言

上一篇文章已經先了解版控系統的分類,並且知道 Git 屬於分散式版控系統。

開始使用 Git 前,筆者想先用「網購」的例子引領大家進入 Git 的版控世界。

# 用「網購下單」的例子來學 Git

相信大家在這個嚴峻的時代,都已經有網購的經驗。
如果我說,從購物網站「挑選商品」一直到「下單」的行為,跟 Git 的觀念有點像… 你會信嗎?

欲知詳情,且聽我娓娓道來…

傳統上,如果想要購買沒有線上通路的商品,就必須到「在地商家」的消費,消費的行為會是「買了就走」,所以沒辦法紀錄「每次消費的訂單紀錄」。

所謂「在地商家」,是指那些特定地區會販賣名產的店家,他們沒有導入任何線上平台,並沒有提供協助消費者紀錄「訂單資訊」的服務。

這時,有一個名叫「基特」的「行銷平台」,他專門跟沒有網購平台的「在地商家」簽約合作。

「基特平台」能提供的服務呢,就是協助在地商家導入線上通路,替他們架設的銷售網站,讓消費者可以在線上購買商品,藉此能讓消費者追蹤自己的訂單紀錄。

消費者要做的事情,是要在「在地商家」透過「基特平台」的提供的機制建立帳號,就可以開始消費。

實際的消費流程跟我們熟悉的 蝦 X、露 X 一樣:挑選商品 => 加入購物車 => 拿出魔法小卡下單

而「在地商家」就算有「商品」可以販售,但他們不會有權力把想賣的「商品」加入我們的「購物車」,然後替我們「下單」。
雖然這句聽起來像廢話,不過等等聯想到 Git 觀念時會帶到

有了「基特平台」之後,我們可以記錄那些在「在地商家」的「消費訂單紀錄」,不用擔心會遺忘自己購買過什麼東西。

如果我們把這個觀念帶到 Git 的世界…

# Git 世界中的檔案狀態

來稍加整理上面的流程:

  1. 「基特平台」 可以協助 「在地商家」 導入線上通路。

  2. 要有線上通路最重要的作用,是要讓消費者 「紀錄訂單資訊」

  3. 消費者在平台 「辦好帳號」 ,就可以開始購物。

  4. 購物過程,需要將 「商品」「購物車」

  5. 確定 「購物車」 有商品, 「下單結帳」 後,我們的 「訂單資訊」 就能被記錄下來。

  6. 如果我們在同一個商家不停的 「購買商品」 ,就會累積一筆一筆的 「訂單資訊」

接著一起把上面的關鍵詞跟 Git 的世界聯想在一起:

  1. 「基特平台」 就是 「Git」

  2. 「在地商家」 是要被版控的 「專案資料夾」,或者稱之為 「工作目錄」

  3. 商家販售的 「商品」 就是工作目錄內的 「檔案」「資料」

  4. 「在地商家」 因為有 「基特平台」,可以讓消費者記錄 「訂單紀錄」
    「工作目錄」 因為有 「Git」 ,可以讓我們紀錄 「版本資訊」

  5. 「購物車頁面」 是 Git 世界的 「資料暫存區」

  6. 「訂單資訊頁面」 是 Git 世界的 「資料儲存庫」

聯想完之後,來看看 Git 的版控世界:

  1. 即使工作目錄有檔案,只要還沒告訴 Git 要版控哪些檔案,Git 就不會隨意對 「檔案」 版控。

  2. 如果要對 「工作目錄」「檔案」 進行版控,必須先把檔案放到 「暫存區」

  3. 確定 「暫存區」 的檔案資料都是我們想版控的,則可以 「提交」 暫存區的檔案,把他們放進 「儲存庫」 ,完成版控的動作。

以上,說明完畢。

如果說到這邊都看得懂,恭喜你,你已經知道如何使用 Git 版控檔案了!
沒在唬爛,在 Git 要發布一個版本,只要經歷這兩個步驟就能完成:

  1. 「檔案、資料 (商品)」 放在 「暫存區 (購物車)」
  2. 再把暫存區的 「檔案、資料 (商品)」 提交到 「儲存庫 (訂單資訊頁)」

這個比喻未來時不時會帶到,目的是希望新手在弄不懂 Git 時有情境能聯想。

不過在觀念建立得差不多之後,還是會回到 Git 最初的定義來解釋,並且漸漸省略各種「類比」的說明。

畢竟它只是個比喻,Git 世界之複雜,終究會出現「網購情境」解釋不通的地方。
若過於刻意拿網購情境比喻,很容易使得不好懂的觀念變得更加混淆,請讀者務必悉知這個道理。

# Git 必學的項目

有了 Git 的基本概念之後,我們來看看 Git 必學的項目,這些同時也是 Git 最核心的觀念。

沒列出來的項目一時學不會就算了,未來有機會再慢慢補強,不過「至少」要能弄懂下列這些東西,才比較好說自己是個有能力操作 Git 版控程式的人。

# 基本指令

  1. 如何建立一個地端儲存庫 (辦帳號)? (git init)
  2. 如何把檔案放到暫存區 (加入購物車)? (git add)
  3. 如何記錄一個版本 (下單)? (git commit)
  4. 如何查看資料狀態 (查看購物車)?(git status)
  5. 如何查看版本 (Commit) 資訊 (查看訂單紀錄)?(git log)

# 分支操作

  1. 什麼是分支? (git branch)
  2. 怎麼切換分支? (git checkout)
  3. 怎麼合併分支? (git merge)

# 常見問題

# 1. 什麼是 Git GUI 工具 (GUI Tools) ?

GUI (Graphical User Interface) 的意思是「圖形使用者介面」。
我知道每個單字都看得懂,但組合起來卻都看不懂

簡單來說,GUI 意思是一個擁有像是「按鈕」、「選單」、「視窗」之類的圖形畫面,作為讓使用者跟電腦互動的用途,它存在的目的是為了讓人們不用再透過終端機下指令,就能跟電腦互動。

「Git GUI 工具」 就是讓我們不用執行 Git 指令,就能版控的工具。

即便是 Git 的新手,應該都有個概念是:使用 Git 版控好像就是要學會怎麼在那個黑黑的畫面打指令來操作的樣子。

事實上除了使用指令之外,我們也可以在 Git 官網 找到許多推薦的軟體讓我們用來操作 Git ,一般我們都叫這些軟體為 「Git GUI 工具」,或是簡稱 「Git GUI」,甚至就直接稱作 「GUI」

不過如果你跟筆者一樣都直接講 「GUI」,要注意的是這個詞 不只 會使用在 Git。在電腦科學領域中,只要符合上面 GUI 定義的東西,都能叫做「GUI」,只是此系列文都是在講 Git ,所以提到 「GUI」 一定是指「Git 的 GUI 工具」,請大家千萬注意不要誤用名詞。

後續會介紹到的 GUI 工具是 「Fork」,安裝的方式將會在下一篇文章一併介紹。

# 2. 我需要學會 「Git 指令」 外加 「Git GUI 工具」才叫做會 Git 嗎?

不用。

GUI 的出現就是為了讓我們不用下指令, GUI 在做的事情跟 Git 指令完全一樣。
讀者可以兩種操作方式都學,也可以挑一個學即可。
不過因為還是有「指令才能做到,但 GUI 做不到」的功能,所以也建議 GUI 派使用者稍加了解「怎麼開終端機下指令」,需要的時候才不會手忙腳亂。

而筆者已經不是小孩子了,我全都會用到。
雖然我是指令派的使用者,絕大多數的情況都是下指令來操作 Git ,不過如果需要看線圖或是執行一些簡單的操作,透過 GUI 來執行還是會比指令來得方便。

# 3. Git 與 GitHub 是不是一樣的東西?

不是。

Git 是一套版控工具, GitHub 是一個 「遠端儲存庫」 。
其他還有像是 GitLab 之類以「Git」來命名的東西,也是 「遠端儲存庫」 的一種。

請大家千萬不要認為這兩個是一樣的東西!!

當聽到有人問自己:「有沒有用過 Git?」 時,千萬不要回說:「哦有啊!我有在用 GitHub!」。
否則你會看到對方出現這個表情:
git and github

# 4. 我學會操作 GitHub,代表我會 Git 了嗎?

同上題,不是。

GitHub 只是 Git 遠端儲存庫的其中一種。
雖然 GitHub 有畫面能操作很直覺,而且看起來也能做到「版控」的動作,不過 Git 與 GitHub 在版控流程所負責的工作還是不太一樣,兩者無法相提並論。

此外,市面上的遠端儲存庫也不只有 GitHub,其他常見的還有 GitLab 、 TFS,甚至會有公司建立自家的遠端儲存庫 (Git Server)。

如果只會操作 GitHub,你還是不知道怎麼操作 Git 來把地端與遠端儲存庫作連結。
正確的學習程序,應該是先學會 Git 基本觀念之後,再透過 GitHub 來輔助學習:如何建立地端與遠端儲存庫的連線。

# 5. 我已經知道 Git 是離線軟體,那我怎麼跟他人一起開發同一份程式?

建立「遠端儲存庫」,讓所有人在上頭共享程式。

遠端儲存庫的例子有 GitHub 、 GitLab 、 TFS,甚至公司自己架設的 Git Server。
把版控資料同步遠端儲存庫,是 Git 世界與他人共享程式的方式。

# 6. Git 是不是只能進行程式碼版控?

不是。

雖說 Git 用於版控「文字檔」的能力最為完整,不過我們也可以用 Git 版控非文字檔,例如圖檔、PDF 檔、Word 檔。
以程式開發人員來說,圖片也算是很常被記錄在進 Git 的檔案類別。
但畢竟 Git 確實不擅長處理非文字檔案,要不要用 Git 來控管二進位檔,就見仁見智了。