【Git】Git必備基礎知識與操作教學

  • 3287
  • 0
  • Git
  • 2020-11-26

提到版本控制就會想到Git,軟體工程師工作就是撰寫、修改程式碼,無論是初入門或有經驗的工程師,一定會面臨版本控制的問題。查詢了Git卻發現一堆艱深的程式碼,只好放棄了(誤)。如果你也同樣有下面的感受,就非常適合繼續閱讀這篇文章。:

  1. Git是備份自己的檔案
  2. 一堆專有名詞霧煞煞,clone、fork、repository
  3. 要記一大堆的指令
  4. Add、Commit、push,查到一堆類似的圖,但還是搞不懂流程

​​

基礎概念


版本控制
相信各位在工作上,常常會出現臨時要修改內容並馬上提交、或是想更動內容但又怕改壞了原本的資料,就會用不同名稱來保留檔案,大概會長的像下列這樣子。

圖1 示意圖 (來源:參1)

 

用檔案做版控的缺點是:

  1. 會佔據大量的硬碟空間
  2. 無法知道當時為什麼要改版,以及改了什麼
  3. 無法得知各個版本之間的差異性

筆者覺得用檔案做版控最嚴重的問題就是,常常時間一久,想回頭延續修改檔案時,就會不知道之前修改了什麼內容,而且命名習慣不好的話,甚至會忘了正確的版本,而不知道該用哪個檔案的窘境。由此可見,版本控制系統對於經常更動資料的人來說,是非常很重要的,更別說是工程師了。

 

Git是什麼
打開Git的官網(參2),網頁開頭就有著大大的字,內容就開宗明義地說,Git是一個開源的分散式版本控制系統

首先要先搞清楚一件事,Git能做到版控,是透過紀錄檔案的異動變化,版控系統又分為集中式分散式,二者都可以紀錄檔案的異動變化,也可以透過追朔變動,將檔案回朔到某個版本。集中管理檔案庫(Repository),對於公司而言,設定跟管理較方便,但工程師要使用時,通常也需要透過網路連線到主機,若網路斷掉就無法提繳新的版本,隨著網路斷掉的時間越長,期間越多的變動無法被記錄,版本控制的風險就會越高(參3)。

分散式版控後來也開始崛起,如果要說明分散式與集中式最大的差別,簡單的概念會是,集中式只在 Remote Repository(遠端檔案庫) 上做版控,而分散式則擁有Local Repository(本地檔案庫)。Remote檔案庫,通常為最穩定且確定沒有bug的版本。工程師在公司或是在家中工作時,則直接複製一份Remote檔案庫至本地端,再接著開發或改版,同時也在自己的電腦上做版控,如此一來才能達到分散式的版控。若確定改版沒問題後,再正式上傳到遠端檔案庫。

 

Git、Github傻傻分不清楚
上一小節已經知道Git是用來做版控的,要使用Git完成版控最陽春的方法就是下指令,跟寫程式一樣。平台就是上節提到的遠端檔案庫,Github就是其中一種使用Git的平台,其他的還有像BitbucketGitlab等。在平台上可以建立專案、檔案庫,平台管理者也可以決定要讓哪個工程師加入哪個工作團隊,也可以分別設定每個人的操作權限。因為下指令操作Git畢竟還是比較不直觀,所以就有了使用者介面,直接透過圖像的點擊,就可以完成版控,這樣就不用記一大堆艱深的程式碼,使用的難度就大大降低了囉!通常使用同一家的產品,在平台與介面的整合性也會比較好,像Github Desktop是Github自家的的介面,Source Tree則是Bitbucket的。

圖2 Git、平台與介面關係圖

 

要做下一節的練習前,要先完成兩件事。

  1. 申請平台的帳號密碼
  2. 安裝使用者介面,安裝的同時會安裝Git

接下來,筆者會以Bitbucket與Source Tree的畫面做操作示範,筆者也有試著玩看看Github Desktop,其實把基礎概念、專有名詞搞懂,一樣可以通,介面長得不一樣花時間適應就好。關於平台與使用者介面的申請、安裝、跟連接,就交給各位自行google囉!

 

 

版控操作流程教學


新建一個遠端檔案庫
選擇右邊工具欄的Respositories,並選擇右上角的Create respository(圖3)。

圖3 Source Tree示意圖

 

輸入計畫名稱、檔案庫名,Access level決定是否開放程式碼,讓所有人都看的到。Bitbucket預設README跟.gitignore都有,但Github預設沒有.gitignore,.gitignore的部分後面小節再描述。建立的同時還可以設定該專案的權限(參4)
圖4 Create repository

 

建立完respository的畫面會長的像這樣
圖5 Create done

 

從安裝到這步驟的工作,包含了帳號連結及初始化遠端檔案庫,如果用程式碼執行會是(參5參6)

git config --global user.name "XXX"             //設定名稱
git config --global user.email XXX@example.com  //設定信箱
git congig --list                               //查看設定檔
git init                                        //對目前的資料夾作git初始化

 

使用遠端檔案庫
使用遠端檔案庫,大概可分為兩種操作模式

  1. clone
  2. folk

clone的功能,是從平台上取得檔案庫,下載到本地端,並建立本地檔案庫(參7)。選取圖五右上角的Clone,接著選Clone in Sourcetree(圖6),Clone到本地端一定要選擇空白資料夾(圖7),否則會噴錯。Clone完成後,local檔案庫會跟remote檔案庫完全一樣。所以資料夾中會出現.gitignore、README.md及/.git(圖8),如果沒有看到/.git,請把隱藏的項目打勾。

之後所有檔案的異動記錄,都會記錄在/.git中,什麼被刪掉都還有救,但/.git被刪掉就GG了,請小心使用,或乾脆就隱藏起來。若檔案不想記錄異動,則在gitignore填寫,決定哪些格式或檔案不記錄異動。

圖6 Clone 示意圖

 

圖7 選擇要存放的本地端

圖8 .git與.gitignore

 

補充個重要概念,如果是使用download的話,一樣可以取得檔案庫的內容,但不會建立本地檔案庫,所以會發現缺少了.gitignore跟/.git,換句話說,就是沒有local版控的功能唷(參8)。在這步驟,用程式碼執行會像是

git clone https://gary781218@bitbucket.org/gary781218/remote.git //bitbucket
git clone git@github.com:kaochenlong/dummy-git.git               //github

 

clone之後,可以使用push的指令更新remote檔案庫(push後面會在詳述),如果大家都可以亂更新檔案庫內容,那下場應該會很可怕。所以對於每一個檔案庫,平台管理者都可以決定要讓誰加入團隊,並且給予能操作的權限。
圖9 bitbucket-檔案庫權限設定

圖10 github-檔案庫權限設定

 

folk翻譯為叉子,使用概念就是像用叉子,把程式碼插到自己的盤子中。folk使用的時機是,當你今天看到一個不認識的人寫的程式碼,覺得有趣想繼續做擴充或改寫,使用folk複製一份檔案庫,並存到自己的遠端檔案庫上,無論怎麼修改,都與原作者無關,如果覺得最後的成果非常值得加到原本檔案庫,就可以發送Pull Request(PR)給原作者,讓原作者決定是否要納入

 

add、commit、push
對於版控的流程圖,筆者可能都已經看過了不少次,但卻一直對於來龍去脈處在一知半解的狀態,今天就一次搞懂他吧。Clone完成後,我們先打開Source Tree看介面。因為與remote端完全相同,所以會顯示Nothing to commit。

圖11  source Tree 示意圖

 

當新增了Work_A.txt後,在左邊紅框會看到Branches,預設一開始都是Master。目前操作還是類似個人使用的角度,但未來在多人協作時,會開不同的Branches,讓大家可以分別提交自己的版本。在History中會看到Uncommitted changes的提示,表示Git偵測到有新的變動,但還未納入Git的追蹤。按下左上角的Commit按鈕會出現圖12。在Staged file與Unstaged fils,可以選擇Stage All將全部檔案加入索引,也可以自己選擇檔案加入。指令add,就是實現這部分的功能。

圖12 commit示意圖

 

用程式碼執行會像是:

git add Work_A.txt   //對Work_A.txt新增索引
git add .            //對全部檔案新增索引
git status           //查看目前狀態


commit則是將有索引的檔案,提交成一個新版本。在下方紅框裡,可以自己填寫更動資訊,這個部分請好好填寫,若是公司有導入CI/CD,這裡跟自己未來的績效就會有關係,底下的Push changes immediately to origin/master指的是commit後立刻push。這步驟用程式碼執行會像是:

git commit –m "Create Work_A.txt"


我們再回頭來看git流程圖(圖13),透過add將檔案變化加入索引,並轉為stage的狀態,再透過commit提交新版本,之後在本機上,我們可以任意切換到任何一個版本的狀態。
圖13 git流程圖 (來源:https://ithelp.ithome.com.tw/articles/10227655)


add與commit都隸屬於local檔案庫的工作範圍,remote檔案庫並不知道我們在local端做了什麼改變,故必須透過push,將最後結果送上remote端。所以執行完commit之後,Source Tree會提示remote檔案庫與目前local檔案庫不同。
圖14 push提示


圖15 push畫面

 

執行Push後,至bitbucket平台上查看,就會發現多了Work_A.txt的檔案了圖16 bitbucket平台上的畫面

 

查看分支圖,也可以發現master(Local)origin/master(Remote)的位置是一樣的。
圖17 push後的狀態

 

git內容真的好多阿,今天就先講到這裡,pull、fetch、merge、stash之類的就有空下篇再說吧

 

參考資料

  1. https://tw.alphacamp.co/blog/git-github-version-control-guide
  2. https://git-scm.com/
  3. https://www.ithome.com.tw/node/77088
  4. https://ithelp.ithome.com.tw/articles/10140305
  5. https://git-scm.com/book/zh-tw/v2/%E9%96%8B%E5%A7%8B-%E5%88%9D%E6%AC%A1%E8%A8%AD%E5%AE%9A-Git#r_first_time
  6. https://gitbook.tw/chapters/using-git/init-repository.html
  7. https://medium.com/@b0444135/github-folk-clone-project-%E5%8D%94%E4%BD%9C-bd3339f1d5ca
  8. https://gitbook.tw/chapters/github/clone-repository.html