Intro to Git
2017.06.12 @ MentorMe
Agenda
• What and Why Git
• Git的核⼼心概念念
• How to install and use Git (SourceTree)
• Best Practices
• Q & A
What is Git
• git: 混帳。KK ⾳音標念念 [gɪt], not [dʒɪt]
• 作者為Linus Torvalds,核⼼心功能只花了了10天完成
• 原本Linux kernel使⽤用的BitKeeper VCS 在免費功能上加了了許多限制。找了了當時
市⾯面上的免費軟體,沒有他想要的功能。
Why use Git?
• 紀錄Snapshot (快照) ⽽而不是 Difference (差異異)
• CVS / SVN - Centralized repository 集中式資料庫
• 缺點:所有資料都在server,網路路很慢或server掛掉就沒辦法做事
• ⼤大部分操作都需要連到server
• Git - Distributed repository 分散式資料庫
• 優點:所有資料都存在本機,server掛掉或網路路慢也能commit
• ⽀支援非線性開發 (新增branch)、⼤大部分操作皆在本機完成
• 缺點:佔體積較⼤大
檔案的三種狀狀態
• Modified : 已修改
• Staged : 已暫存
• Committed : 已提交
工作流程:
1. 讀者修改⼯工作⽬目錄內的檔案。
2. 暫存檔案,將檔案的快照新增到暫
存區域。
3. 做提交的動作,這會讓存在暫存區
域的檔案快照永久地儲存在Git⽬目錄。
•Repository: 可以想成是project,⼤大家⼀一起協作的地⽅方
•Branch: 這是Git強⼤大的地⽅方,可以任意在local開branch
各⾃自實做不同的功能到時候再merge回主branch
•Commit [名詞] : 每⼀一次的change就叫做⼀一個commit,
裡⾯面可以包含數個檔案改動
•Tag : 標⽰示milestone。使⽤用模式通常是release之後, 例例
如上了了v1.2.0到App Store or Production server, 就在
該commit下⼀一個tag "v1.2.0"
• pull 下拉: [remote -> local] 想成從遠端server把你所
在的branch的commits拉下來來
• commit 提交 [動詞] : [local] 在本地機器把這次的檔案
改動做成⼀一個commit
• push 上推: [local -> remote] 把本地新的commit上到
server
Install Git
•(GUI Tool) SourceTree
•Command Style:
•Windows - Install Git bash (https://git-for-
windows.github.io/)
•Mac - Install git (https://git-scm.com/download/
mac)
Install & Setup
SourceTree
Basic Git commands
•git init -> 設定本機Git repository
•git clone -> 從遠端抓repository回來來
•git pull -> 把本機沒有的commit抓回來來
•git commit & git push -> 提交 & 上傳到遠端repository
•git checkout (create branch & switch branch) -> 切換branch
•SourceTree實作
Advanced Git commands
•edit .gitignore -> git 忽略略檔案
•git reset -> 切換commit
•solve conflict
•cherry pick
•pull request
Pull Request
•⽤用來來達到code review的⽬目的:
•可以針對code討論
•需要approved後才能被merge
try.github.io
假如你有15分鐘
你能想像這樣的協作....
不⽤用版本控管?
關於Branch的Best
Practice
• 主要分⽀支
• master: 永遠處在 production-ready 狀狀態
• develop: 最新的下次發佈開發狀狀態
• ⽀支援性分⽀支
• Feature branches: 開發新功能都從 develop 分⽀支出來來,完成後 merge 回
develop
• Release branches: 準備要 release 的版本,只修 bugs。從 develop 分⽀支出
來來,完成後 merge 回 master 和 develop
• Hotfix branches: 等不及 release 版本就必須⾺馬上修 master 趕上線的情況。
會從 master 分⽀支出來來,完成後 merge 回 master 和 develop
• Debug branches: 修正某個issue的branch,完成後merge回develop
• 也有⼀一個⼯工具叫做git flow實作上⾯面的best practice:
• https://ihower.tw/blog/archives/5140
• https://danielkummer.github.io/git-flow-cheatsheet/index.zh_TW.html
• 本公司短暫⽤用過⼀一陣⼦子,但後來來被捨棄,因為不是所有的⼈人都有sense or 認
同。所以取得最⼤大公約數很重要。理理想但沒有⼈人會⽤用的規則 = 沒有規則。
• 原則:協作的⼈人離得越遠,就要有越嚴謹詳細的命名
關於Branch Naming的
Best Practice
• master branch: master
• develop branch: develop
• release branch: release/1.0.0
• version name: (x.y.z) x = major, y = minor, z = build number
• feature branch: feature/132_signup
• issue number + short description (我知道很難, 但是好的命名可以易易讀⼜又不
影響閱讀, 多想30秒可以幫別⼈人省下許多時間回查該issue是什什麼)
• hotfix branch: hotfix/668_image_crash
• debug branch: debug/322_save_error
關於Commit的Best
Practice
• ⼀一天⼤大概有3 ~ 4個commit是理理想的commit長度,太
長的commit很難抓bug
• ⼀一個commit只包含在⼀一個issue範圍內的改動
• 同⼀一個issue number最好不要⼀一直出現在不同
commit中 (這表⽰示某⼀一個issue⼀一直沒解乾淨 or 寫
完)。除非該issue是超⼤大feature,但在這種情況
下,該要切ticket by RD, 因為只有他知道技術上怎
麼切才適合
• Commit Comment: https://chris.beams.io/posts/git-commit/
• 將標題與內容中間多⼀一⾏行行空⽩白
• 標題限制 50 字元
• 標題第⼀一個字必須為⼤大寫
• 標題最後不要帶上句句號
• 標題內容可以使⽤用強烈的語氣
• 內容請⽤用 72 字元來來斷⾏行行
• 內容可以解釋 what and why vs. how
關於跟別⼈人協作開發的
Best Practice
• 如果有跟其他⼈人協作的可能,記得每次做事之前先
pull code
• 在push commit之前要⾃自⼰己先build過、跑起來來、測
過、再上
• 千萬不要在下班前(ex: 30 mins) commit & push (因
為你會忽略略上⼀一點)
• 不要積⼀一⼤大堆commits⼀一直不push, 這樣會讓你的
code out of sync, 到時⼀一次解很多conflicts, 痛苦加
倍
• 不要在Git Repository裡⾯面放任何的key & Local
settings
• commit 標題最好加上issue number
• 公司內部最好有⼈人可以review commit的內容,或是
要同意才能上code的機制 -> Pull Request
• Jenkins
•讓每次commit都做⾃自動 build / auto test
•Jenkins也能接Fabric的Crashlytics,可以直接在
Jenkins介⾯面上點要release哪⼀一個branch的latest
commit,就直接發布給QA測試 (iOS & Android)
References
• Pro Git (中⽂文版) https://git-scm.com/book/zh-tw/v1
• ihower https://ihower.tw/git/
課後互動

Intro to Git 投影片