iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
1

寫在前面

注意git跟github是完全兩回事,很多人搞不清兩者的關係
git是版本控制軟體,github則是託管git的倉庫(讓你可以上傳的網路空間)

git的歷史就不提了,我們來說說git可以做什麼吧

git主要用於版本的控管,讓工程師可以更專注於開發新功能與維護專案
今天你要為你的專案增加一個新功能,但是你不知道這樣寫的方式是不是對的
如果方向錯了你必須盡快修正回舊版本
這時候你就必須直接複製當前已經開發好的版本另外存放,然後在原本的專案繼續開發
如果成功了就把剛剛另外存放的程式碼備存,失敗了就刪除現在的專案,繼續開發剛才複製出去的專案
直到你把自己搞瘋的那一天

另外一個好處是分散式的版本控管
以往多人要開發同一個專案必須由一台主機控管專案,
如果有人要修改檔案,那就必須上機編輯,此時那個檔案將變成唯讀,其他人無法修改
好處是非常安全,壞處是開發進度將變得相當緩慢
而分散式的版本控管可以讓多人同時開發一個專案(每個開發者手上都有一個自己的版本)
開發完功能或維修好BUG後提交到同一個git上,提交的同時會去比對git上的版本跟要推上去的版本
最終決定留下哪些程式碼後保留在git上

當然,版本控管的軟體除了git以外還有很多款,這裡以git作為介紹

如果在課程的一開始準備階段有安裝git的話就可以繼續看下去了

基本操作

先安裝VScode的插件Git Graph

https://ithelp.ithome.com.tw/upload/images/20200921/20127836HmkZLPAXn6.png

點擊右下角的install就可以摟(我因為已經安裝過了,所以沒有出現)

接著在VScode開一個新的工作目錄,接著在你的終端機內打上

git init

應該會產生這麼一行

Initialized empty Git repository in {你的工作目錄}

這樣我們就建立了最基本的git

接著隨便在你的工作目錄內建立一些檔案或資料夾,如下(不一定要照著我的建,因為那不是重點)

.
├── dir1
│   └── file3.txt
├── dir2
├── file1
├── file2.txt
└── git.md

然後你的VScode應該會有如圖的圖示(git管理已經內建在VScode內了)

https://ithelp.ithome.com.tw/upload/images/20200921/20127836t7lvxXYUCU.png

接著你可以看到工作目錄下與git現存的檔案有哪些差異
此時由於我們建立了四個檔案,因此現在這四個檔案都被標記成Untracked,也就是尚未追蹤的意思
為了要告知git我們必須要追蹤這些檔案,需要如下的指令

git add .

或是使用VScode的工具,點擊上面的+號

https://ithelp.ithome.com.tw/upload/images/20200921/20127836oZS0kLaUMV.png

都可以讓你的檔案變成Stage狀態
此時還沒有儲存,而是告訴git,這些是準備要提交的檔案

如果你不希望某些檔案被追蹤,可以使用gitignore
對你的檔案右鍵就可以將檔案加入gitignore了,如圖

https://ithelp.ithome.com.tw/upload/images/20200921/201278363Lz8VPXyCx.png

這時候你的目錄也會出現一個叫做.gitignore的檔案
也把他加到gitignore吧,也就是叫他不要追蹤管理不要追蹤的檔案(這不是疊字)
接下來點擊上方的勾勾,也就是commit,此時應該會要你輸入關於這個commit的註解
(這裡我們註解先打[1.0.0])
輸入完並且按下Enter後一個最簡單的git循環就完成了
這個動作也可以用

git commit

來完成

版本確認

要確認我們剛才做了什麼可以使用

git log

就會顯示剛才的提交紀錄

commit 697af10b74b8651d9c07ea393dd2159e31602829 (HEAD -> master)
Author: {你的名字}
Date:  {提交時間}

    [1.0.0] //你剛才輸入的版本註解

會告訴你是誰在什麼時間點提交了什麼commit上來

需要更詳細的資料可以使用

git show

這樣還會告訴你更改了哪些檔案

你可以多提交幾個commit上去玩

分支建立

分支算是一個蠻重要的概念,尤其是在台灣這種一次提一堆需求的環境
今天你正在開發某一個功能,此時PM走過來要你先幫他改某個功能,但是這個功能會被你正在開發的程式影響到
最原始的方式就是複製現在你正在開發的資料夾到別的地方,然後瘋狂的ctrl+z直到恢復到原本的狀態
再開始改要新增的功能,功能完成後在整併你剛才開發到一半的程式,並且祈禱你不會瘋掉

使用分支就可以規避這個問題

先使用

git branch

確認自己在哪個分支上面
如果都沒有建立的話應該會出現

* master

master是一開始建立git時自動產生的分支

之後我們可以建立自己的分支,使用

git checkout -b dev

並且再度使用git branch,就可以看到目前有兩個分支,並且你正在dev上

* dev
  master

這時候隨便修改資料夾的一個或多個檔案,之後使用

git status

就可以看到git當前的狀態

On branch dev
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   dir1/file3.txt
        modified:   file2.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        file5

no changes added to commit (use "git add" and/or "git commit -a")

這裡可以看到我們修改了兩個檔案(modified)
並且新增了一個檔案(untracked)

這時如同剛才那樣stage並commit他們
注意這時候由於我們是在dev這個分支上,因此我們會commit到dev這個分支上

commit完後再度使用git status,應該會看到

On branch dev
nothing to commit, working tree clean

代表當前目錄下沒有需要commit的檔案

這時候如果切換分支

git checkout master

你會發現剛才新增的檔案以及修改的內容全部消失了

這邊使用checkout來切換分支
之前會帶一個-b的參數是因為我們要在切換的同時建立分支

好,這時我們要將原本在dev的分支上所作的事情給合併到master上
這時可以使用

git merge dev

來將dev這隻分支給整併進來

這時候你應該會發現剛才因為切換分支所取消的變動又通通回來了
因為你已經把剛才在dev上所作的變動給加到master上

這樣子分支切來切去有什麼好處嗎?

這樣子做的好處是可以讓你git保持乾淨,至少在某些重要的分支是乾淨的

為什麼?

https://ithelp.ithome.com.tw/upload/images/20200921/201278361zaaGOOr4A.png

  • Master是正式的版本分支,通過測試才會到這裡來,因此在這個分支上拿到的版本都是最穩定的,通常會有版本號
  • Develop是功能最新的分支,因此這裡的commit會是最多的,測試人員也會從這裡發布的版本去做測試
  • 其餘分支,通常這些分支是用來做新功能或是debug用的

這樣就算是第一次進公司的人也能很清楚自己要拿什麼版本
要去推銷的業務就從master分支拿,因為最穩定
測試人員或開發人員就拿Develop分支,因為功能最新
其他分支就拿來確認改版內容,通常除非修復Bug或回朔,否則不太會去動到他們

這種倚賴分支的開發流程又稱為

Git Flow

是一種開發的標準流程
主要會保留Master分支及Develop分支上面的commit,用來確保版本的正確性

不過後來為了應付各種需求,大家又演化出

  • github flow
  • gitlab flow

等等的版控流程

git flow要求你頻繁的切換分支,以便確保每個分支上都做自己該做的事
github flow只有一條master,然後所有人一起更新這條master,屬於快速發布用的開發流程
gitlab flow則讓你可以同時維護多個穩定版本

每種版控流程都有自己的問題,但他們相對的也有各自可以解決的問題
就看開發者需要面對什麼樣的問題,再去選擇工具

Git Graph

讓我們繼續看git吧

先切換回dev分支,然後做一個功能分支(用來新增功能的分支)

git checkout dev
git checkout -b feature-addsomething

然後再隨便修改一些檔案,然後推到現在這隻分支上(註解就打add something好了)

這時候我們先不合併到dev上
還記得我們剛才有安裝git graph這個插件對吧,我們現在要來用他

gitgraph

然後你應該就會看到跟我相同或類似的畫面

這時你可以看到dev跟master在同一層,表示這兩個分支現在有相同的commit
而feature-addsomething在他們兩個的上面,表示他擁有比dev及master更多的commit

這時候雙擊dev

https://ithelp.ithome.com.tw/upload/images/20200921/20127836EOH4OtT3jc.png

然後你應該就切換到dev這個分支上了
如圖

https://ithelp.ithome.com.tw/upload/images/20200921/20127836wNgKKWLy1j.png

dev前面的空心原點就是你目前所在的位置

接著我們要將feature-addsomething給合併進來
對要合併的分支按右鍵吧

https://ithelp.ithome.com.tw/upload/images/20200921/20127836VgfAECAajD.png

https://ithelp.ithome.com.tw/upload/images/20200921/2012783657woBnSWnh.png

這裡的為預設你需要為這個合併建立一個commit,這樣會更清楚你做了什麼
合併完成後如下

https://ithelp.ithome.com.tw/upload/images/20200921/20127836UxvxDKMt1w.png

這樣就很清楚你開了一個分支做了某些事情後又合併回dev了對吧

如果不清楚剛才合併時那個預設的選項做了什麼可以用剛才的方法並且不勾選預設選項後合併
或是使用

git checkout master
git merge dev

https://ithelp.ithome.com.tw/upload/images/20200921/20127836FUd3YlxQN7.png

這樣做的話就不會特地幫你做一個commit

你可以再隨便開一個分支,然後合併到dev及master,這次都使用預設選項
就會變成這樣

https://ithelp.ithome.com.tw/upload/images/20200921/20127836iw7zPsziJ7.png

兩種方法都是可行的,只是第二種方法會再幫你開一個commit
(因為master在dev合併進來之前並沒有其他的commit,原本是不需要特地建一個新的commit的)

而剛才預設選項勾選的merge方式其實是使用了下面的指令

git merge --no-ff

不使用ff(fast-forward)的意思

你可以根據自己的習慣(或是配合團隊的習慣)去決定用哪一種merge的方式

Github

如果你想要發布或加入別人的開源專案,那就一定會使用到Github

很常聽到欸 這是什麼?

這是全球最大的同性交友git代管服務平台
他可以讓你將你的git推到上面,而其他人可以看到你的所有code
這時如果你是多人協作或是開源的專案,就可以對他進行pull或是push
pull是指將專案拉到自己本地,修改完後push到github上
這樣就可以遠端的進行合作了
而且windows跟Mac還有桌面版可以用

教學相當的多,所以這裡就不介紹了

Gitlab

這個則是跟github類似的git線上託管服務,差別在於gitlab允許你自己建立一個server
一般公司若是不想將所有的code都丟上github的話都會採用gitlab
用法跟github類似,只是由於是自己公司架的伺服器,因此更可以掌控code的狀況

小結

今天稍微介紹了git
因為篇幅的關係就只有稍微提到概念跟操作(畢竟光是git就可以當作整整30篇鐵人賽的題目)
所以就當作引路人,帶你認識git的世界,後續就要交由各位去探索了

git stash 

git tag

git rebase

git clone

都算是常用的功能,可以去研究看看

github也很建議去辦一個帳號,作為工程師的個人主頁是相當好用的
如果你是前端工程師,也可以使用git page,免費架設一個靜態網站(沒有後端的網站)

有趣的是,github現在已經被微軟買走
前執行長Steve Ballmer曾批評linux的開源行為根本就是癌症,現今卻成為開源社群的貢獻者之一
甚至買下github後還開放了原本github上的付費功能
就連VScode也是開源專案之一
這也是為什麼VScode對於github的整合性很高的原因

講到微軟,我們明天來學也是微軟開源框架dotnet下的F#吧


上一篇
R 所以我們當年到底為什麼要學 Matlab?
下一篇
F# 被遺忘的優秀語言
系列文
你會十五種程式語言?不,我會十五種HelloWorld.為了避免這種狀況,因此寫了這篇:淺入淺出十五種程式語言30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
skycover
iT邦新手 4 級 ‧ 2020-09-21 22:06:56

如果有任何寫不清楚或是觀念沒有很明白的話請留言告知我
會盡快補上

如果有任何寫錯的地方也麻煩留言告知我
會盡快修正

感謝各位

我要留言

立即登入留言