Git 版本控制系統
講者: 黃致維

人生不能重來但是 Git 可以
你可以從中獲得
- 為什麼我們需要版本控制?
- 熟悉 git 的基本操作
- 開發模式 git flow 與 commit 規範
- 為什麼我們會選擇 git
為什麼需要版本控制?
程式不只一個人在開發
狀況一
程式改壞了怎麼辦?
狀況二
為什麼需要版本控制
- 開發不只你一個人
- 時間不能重來
- 程式碼差異
抓戰犯
熟悉 Git 的基本操作
- windows: 影片教學
- Linux: apt-get install git
- Mac: Homebrew
安裝 git
或是可以看一下 官網 上的說明
要先在 Git 設定你的帳號
$ git config --global user.name "你的名字"
$ git config --global user.email "你的 email"
Git 的基本流程
讓 git 認識你的專案
$ git init
專案根目錄
開始 Codding
專案根目錄
開始寫 code
將檔案加入追蹤
專案根目錄
$ git add file1
$ git add file2
git 暫存檔案的空間 stage
stage
- file1
- file2
$ git status
建立存檔點
專案根目錄
$ git commit -m "加入了兩隻檔案"
commit: 加入了兩隻檔案
總結一下
- 編輯
- 加入追蹤
- commit
Git 的基本流程
- 工作區
- 暫存區
- 存儲庫 (Repository)
Git 的工作區
狀況題
我要如何查看現在或是之前的 commit ?
$ git log

我要如何回到過去的 commit ?
$ git reset --hard HEAD^

$ git reset --hard HEAD~1
$ git reset --hard e2a9357a862b4bbb37257dc3e36bc60932bbfcdd
我要如何知道目前的修改了什麼內容?
$ git diff

在 檔案 加入 stage 前,我要如何取消這次的檔案變更
$ git checkout .

我可不可以一次將所有的檔案
加入 stage ?
$ git add .
將所有的檔案加入 暫存區 (stage)
如果有檔案不想加入 Git 追蹤
.gitignore
新增 .gitignore 的檔案,並將不想加入追蹤的檔案路徑加入就可以了
如果有檔案不想加入 Git 追蹤
要怎麼做?
.gitignore
新增 .gitignore 的檔案,並將不想加入追蹤的檔案路徑加入就可以了
分支 Branch

分身要是被打爆了,並不會影響到本體
上面的流程看似非常的簡單
當真正開始在專案上走一次流程時
實際上情形會是這樣

規範
規範
當專案的開發人數一多
branch 與 commit 沒有良好的規範
碰到剛剛圖片上的情景,是早晚的
所以事先定義好良好的 規範 是十分重要的
- 代碼模組化
- branch : git Flow
- commit : 命名規則
檔案規範
代碼模組化
- 盡可能不要在同一個檔案上進行編輯
- 代碼有良好的模組化結構,且良好的分檔
Branch 規範
- Git Flow,
- GitLab Flow
- GitHub Flow
- .......
Branch 的流程與規範
Branch 規範
Git Flow
在 2010 年的時候,就有人提出了一套流程,或說是訂了一套規矩讓大家可以遵守:參考網址
- master (長期分支) 商品主線
- release (長期分支) 上線前最後確認
- develop (長期分支) 開發的主線、
- hotfix (短期分支) 功能緊急修復、
- feature (短期分支) 功能開發
commit 規範

commit 規範
一定要明確的告訴隊友或是自己
這個 commit 是為了什麼
最好要有一個共同的格式
commit 規範
<type>(project):#ticketnumber subject
- type (必填): 說明 commit 的類別
- project (選填) : 說明專案名稱
- ticketnumber (選填): Remind 的單號
- subject (必填): 簡短的說明 commit 的目的
commit 規範
- feat : 新增新功能
- fix:修補臭蟲
- docs:修改文檔
- style:格式 (不影響代碼運行的變動)
- refactor:重構 (既不是新功能也不是修改 bug)
- test: 增加測試
- chore:建構過程或是補助工具的變動
可用的 type 標籤
commit 規範
- docs: 修正jshint設定檔
- feat(batchUpdate):新增f8 beta環境的.ini
- fix:#20027 調整購物車沒有規格項目沒有庫存時,會顯示為「已售完」
- chore:調整phalcon composer
- style:#20037 調整mall首頁大banner樣式
- test:新增「加入購物車」邏輯的測試碼
- docs:更新購物車API文件
- chore:升級前台jquery版本
實際範例
Git Remote
分享你的 Git 專案吧
通常我們會把一個 Git 的專案稱為: Repository 版本庫
另外我們會將 Git 的 版本庫放置到
擁有 Git 介面的雲端空間
Git Remote
- Git Hub
全球最大同志交友平台 - Git Lab
容易誤解的觀念

不等於
應用程式
網站






建立新的專案
加入已經存在的專案

完成
關鍵指令
$ git remote add origin [URL]
設定要連結雲端上的版本庫的 URL
$ git push -u origin master
本地 master 的 branch
推上
雲端 master branch
更新雲端上的 master branch
$ git push
推其他的 branch 上去雲端空間
$ git push origin [branch 名稱]
狀況題
我要如何從 Git Hub
上取得專案?
$ git clone {URL}

為什麼
git push 推不上去 GitHub ?
push 前一定要記得
$ git pull
pull = fetch + merge
將最新的 commit 拉到本地端
解決衝突後,在做 push 的動作
$ git push -f

本來不想用這招的
為什麼使用 Git
他跟其他版本控制系統的差別在哪了
很潮- 分散式管理
- 更輕巧更快速
- Git 開分支很便宜
分散式管理 vs 集中式管理
集中式:
- 只允許 一個版本庫 在伺服器中
- 大部分的操作都無法離開伺服器,例如:提交變更 等等
分散式:
- 允許每個工作者在 Local 端 都可以擁有各自的版本庫
- 可以在自己的本地端完成任何操作
一般版控:

紀錄了每個版本直接變更的差異
最後用組合的方式拼湊除當前的結果
Git vs 一般版控
Git 的資料結構
Git vs 一般版控

Git 資料結構
四大物件
- Blob (檔案)
- Tree (目錄)
- Commit
- Tag

Git 資料結構
Blob
Blob
Commit
Tree
Blob
A.txt
B.txt
C.txt
lib 資料夾
first commit
HEAD
Blob
A.txt
C.txt
lib 資料夾
first commit
修改了 B 的檔案
B.txt
Tree
Blob
Blob
Commit
HEAD
Blob
B.txt
Commit
Blob
Commit
Blob
A.txt
B.txt
C.txt
lib 資料夾
first commit
修改了 B 的檔案
B.txt
Tree
Blob
Blob
Commit
HEAD
大家還記得如何回到之前的 commit 嗎?
$ git reset --hard HEAD^
重新設定
GO TO
Commit
Blob
A.txt
B.txt
C.txt
lib 資料夾
first commit
修改了 B 的檔案
B.txt
Tree
Blob
Blob
Commit
HEAD
Blob
Git 開分支很便宜
Blob
A.txt
C.txt
first commit
Tree
Blob
Blob
B.txt
Commit
HEAD
master
新增 branch
發生了什麼事?
$ git branch branch1
新增 branch
Blob
A.txt
C.txt
first commit
Tree
Blob
Blob
B.txt
Commit
HEAD
master
branch1
切換分支時
發生了什麼事?
$ git checkout branch1
切換 branch
Blob
A.txt
C.txt
first commit
Tree
Blob
Blob
B.txt
Commit
HEAD
master
branch1
Blob
A.txt
C.txt
lib 資料夾
first commit
修改了 B 的檔案
B.txt
Tree
Blob
Blob
Commit
HEAD
Blob
B.txt
Commit
master
branch1
很潮
參考資料

Q & A
Thank You
deck
By ZHI-WEI HUANG
deck
- 85