大家應該都要會的工具 git
By Alan Tsai 2017-06-24
從放棄到會用 – 分支篇
關於我
2
▰Alan Tsai 蔡孟玹
▰後端(攻城)工程師
▻Web Developer - 主要使用 .Net/C# 和 Asp .Net Mvc
▰看小說
▰找到我 – contact@alantsai.net
▻http://blog.alantsai.net - Alan Tsai 的學習筆記
▻{服務}.alantsai.net
▻http://fb.alantsai.net - fb
▻http://ln.alantsai.net – linkeding
▻http://ss.alantsai.net - slideshare
Agenda
3
▰Branch 目的
▰了解git 運作模式
▰合併
Branch的目的
4
千金難買早知道
5
開branch
6
▰工作快速切換
▻Feature
▻Issue
▰嘗試性
▰開branch換時間點
Git的運作機制
7
版控什麼
8
▰其他版控看的是檔案變更
▰http://git-scm.com/book/en/Getting-Started-Git-Basics#Snapshots,-Not-Differences
版控什麼
9
▰Git版控的是內容變更
▰每個commit是snapshot
▰http://git-scm.com/book/en/Getting-Started-Git-Basics#Snapshots,-Not-Differences
Git 構成單位
10
▰Object
▻記錄資訊
▰Ref
▻指針(pointer)資訊
▻快速定義到某一個組合
Git的構成單位 - object
11
▰Object – SHA1
▻tree
▻同等於 資料夾
▻blob
▻同等於 檔案
▻Commit
▻tree、父 commit
▻Annotated tag
▻同commit
Git的構成單位 - object
12
Git的構成單位 – 靈活的組成單位
13
Git commit示意圖
14
▰Git commit示意圖
Git commit示意圖 – 簡化
15
C0 C1 C2
Git的構成單位 - ref
16
▰每次都要記住sha1很麻煩
▰一個好記得名字
▻預設有個 master branch
▻有個HEAD,代表目前位置
C0 C1 C2
master
HEAD
Git commit到底發生什麼
17
▰當commit的時候
▻由head帶著目前branch前進
▻建立出commit
C0 C1 C2
master
HEAD
C3
開始使用Branch
18
建立branch 並且切換
19
建立branch 並且切換
21
▰或
git checkout –b branch1
git branch branch1
C0 C1 C2
master
HEAD
branch1
HEAD
git checkout branch1
建議的branch命名方式
22
▰通常branch會是一個功能或者bug修改
▻{issue tracking號碼}-概述
▻2-addValidation
▰Branch前面加上前戳 – 用 斜線分隔
▻容易區分類型
▻feautre/2-addValidation
▻hotfix/3-exceptionDivideByZero
切換、刪除 branch
23
▰圓圈 粗體 目前所在的branch
▻點branch名稱兩下
▻也可以點log兩下切換branch
▰刪除branch
▻右鍵 -> Delete {branch 名稱}
git checkout branch1
git branch –d branch1
切換branch注意事項
25
▰Working Directory
▻最好是乾淨無修改
▰可以搭配stash
▰Detach HEAD
刪除 branch 注意事項
26
▰不能刪除目前所在的branch
▰如果被刪除的branch尚未合併 預設不給刪
▻要加上 -D 就可以刪
C0 C1 C2
master
HEAD
C3
branch1
Merge Branch
27
Merge branch(合併分支)
28
▰如果不能合併,分支就沒意義了
▰分支的概念
▰從 目前分支 合併 到 選取的分支
git checkout master
git merge branch1
Fast-Forward Merge
29
▰找到 master 和 branch1的共同commit
▻C2
▰C2到branch1(C3)差了一個commit
▰可以快轉合併
C0 C1 C2
master
HEAD
C3
branch1
Non Fast Forward Merge
30
▰找到 master 和 branch1的共同commit
▻C2
▰總共缺少C3和C4
▻做一個Non Fast Forward Merge
C0 C1 C2
master
HEAD
C3
branch1
C4
C5
Fast Forward Merge vs Non Fast Forward Merge
31
▰FF
▻不會有衝突
▰N FF
▻很明確看的出來有合併
FF也當成N FF
32
▰更容易看出有合併過
▻搭配
▻增加合併說明
▰適合使用情境
▻想要明確表示有整并過
▻搭配rebase
git merge –-no-ff branch1
git commit --amend
衝突(Merge Conflict)這件事
33
▰當有非FF Merge的時候就有可能衝突
▰衝突發生原因
▻當同一行有完全不同的修改
▻機器無法判斷要用那個
▻當非同一行有修改
▻工具一般能夠自動判斷是相關 – 因此自動幫忙處理
衝突的底層
34
▰衝突發生的時候有4個檔案
▻$LOCAL – 發起 merge的branch內容版本
▻master的內容 (C4)
▻不會修改
▻$REMOTE – 要被merge的branch內容版本
▻Branch1的內容 (C3)
▻不會修改
▻$BASE - $LOCAL 和 $REMOTE為修改之前的樣子
▻兩邊的原始共通 (C2)
▻不會修改
▻$MERGED – 最後合併的樣子
▻修改這個檔案 (C5)
C2
master
HEAD
C3
branch1
C4
C5
設定自己習慣的解決衝突工具
35
▰推薦Kdiff3
TortoiseMerge vs KDiff3
36
發生衝突 – 在做Non FF merge會出現
37
解決衝突 – 用剛剛設定的kdiff
38
▰對conflict檔案點右鍵
▻Launch External Merge Tool
▻呼叫剛剛設定的kdiff3
解決衝突 - commit
39
▰確認好內容
▰在做一個commit把內容儲存
▰會自動帶入conflict資訊
解決衝突 – 重來
40
▰如果解決衝突期間想要重來
▰可以通過:
▻選擇要重來的檔案
▻上面的「Action」
▻Resolve Conflicts
▻Restart merge
rebase branch
41
請注意
42
▰Rebase功能很強大
▻但是要注意
▻千萬不能對已經送上去的commit做rebase
▰Commit越快越多越好
▻但是會太雜
▻透過rebase做一次清理
▰有些人不建議使用 – 不過用的好幫助很大
Git rebase
43
▰可以重新把 commit apply上去
▻變成1條線
▰目的
▻整理commit
▻調整訊息
▻拆解commit
Git rebase
44
▰搭配 git merge --no-ff
▻產生明顯有branch過
C2
master
HEAD
C3
branch1
C4 ‘C3
git rebase --interactive
45
▰放上去的時候重新整理
不能動的Branch
git tag
46
Git tag – 打標籤
47
▰記錄某個點
▰列出目前的tag
▰Tag有兩種
▻annotated tag
▻可以寫說明
▻Lightweight tag
▻Sign Tag
▰建議使用annotated tag
git tag
git tag –a v1.0
git tag v1.0
Git tag – 好的tag標籤
48
▰Semantic Version
▻Major.Minor.Build
▰要不要加v看個人
Git push --tag
49
▰Push的時候記得包含tag
▰才會上去
其他特殊指令
Cherry pick
50
從某個節點取內容 - Cherry pick
51
▰想從一堆commit抓一個過來
▰修bug commit
C1 C2
C3
branch1
C4
C5
‘C3
git cherry-pick {c3}
master
HEAD
從某個節點取內容 - Cherry pick
52
遠端溝通
53
和遠端溝通
54
▰遠端的git和本地的git一樣
▰有一個特殊的branch代表遠端的位置
▰透過 pull 和 push 來和遠端 sync
git push
55
▰同merge一樣概念
▻變成找出 local和遠端版本差異
▻Push上去
設定遠端
56
▰免費的遠端
▻Github
▻Visual Studio Team Service
▻雲端TFS,5人以內免費
▻Bitbucket
▰VSTS做範例
在遠端先建立
57
▰Visual Studio Team Service
設定remote網址
58
git remote add
https://alantsai.visualstudio.com/DefaultCollection/_git/testProject
Git push
59
▰把本地內容push上去
▻Track表示本地branch和remote有
▻對應關係
git push –u origin master
輸入認證資訊
60
▰兩步驗證
看到多一個origin/master
61
和遠端溝通的3個指令說明
62
▰Fetch(獲取)
▻從遠端取得最新
▻更新 origin/master
▰Pull(拉取)
▻從遠端取得最新,並且和本地track branch做merge
▻ git fetch + git merge
▰Push(推送)
▻把本地和origin/master的差異push上去
從遠端開始
63
▰git clone {url}
▰同等於
▻git init
▻git remote add origin {url}
▻git pull
遠端溝通原則
64
▰絕對不能夠改已經推送內容
▻git commit –amend
▻Rebase
▰Git會保護你
▻不會允許你push
▻但是別加上 --force
和遠端溝通原則
65
▰記得先和遠端update過
▻Pull或fetch
▰在push
Branch模式/Workflow
66
Branch模式意義
67
▰如何多人協同
▰Centralized
▰Feature (topic) Branch
▰Git flow
▰Fork Repository Flow
Centralized
68
▰ 和SVN一樣運作模式
▰ 總共就一個master分支
▰ git pull加上 –rebase 保持更新線行
▻ 或呼叫
git fetch origin
git rebase origin
Centralized
69
▰最好開始上手
▻和以前svn運作模式一樣
▻又能夠使用git的優勢
▰問題
▻功能無法協同合作
▰Log
▻看起來是線行
Feature (topic) Branch
70
▰Master為主線
▰有功能就建立一個branch做開發
▰最後做完在merge回master
▻搭配pull request做review
▰Merge完branch就刪掉
Git flow模式
71
▰2010 Vincent Driessen提出
▰http://nvie.com/posts/a-successful-git-branching-model/
▰比較複雜
▻把穩定版本和最新開發版本切開
Git flow模式
72
▰兩條主線
▻Master
▻代表目前最stable版本
▻Develop
▻代表目前最新程式碼(nightly build)
▰其他分支線
▻feature/*
▻hotfix/*
▻release/*
Git flow 模式 - feature
73
▰用作於功能開發
▰一般開在本地
▰需要協同才push上去
▰從哪個branch分支
▻develop
▰合並回
▻develop
Git flow 模式 - release
74
▰當develop準備上線
▰用於更新版號資訊
▰從哪個branch分支
▻develop
▰合並回
▻develop
▻master
▰在master建立tag
Git flow 模式 - hotfix
75
▰緊急bug
▻ 需要馬上處理
▰從哪個branch分支
▻master
▰合並回
▻develop
▻master
▰在master建立tag
Git flow工具
76
▰因為複雜,所以有個工具專門做這個事情
▻https://github.com/nvie/gitflow
▻https://github.com/petervanderdoes/gitflow-avh
▻語法都是:git flow {branch類型} {動作} 參數
git flow init
git flow feature start {name}
// 一般開發
git flow feature finish {name}
// 需要push或pull
git flow feature push {name}
git flow feature track {name}
Git flow – source tree
77
Git flow – source tree – 結束branch
78
Fork Workflow
79
▰也可以稱為github flow
▰和Feature Branch Flow一樣
▰差異在於
▻要開發的人從原始先做一個fork
▻開branch開發
▻做一個pull request回去
▰https://guides.github.com/introduction/flow/
其他工具
80
Git lfs
81
▰非文字類型越長越大
▰Git lfs 把commit記錄為hash pointer
▻實體檔案存在另外一個地方
Git lfs
82
▰安裝
▻https://git-lfs.github.com/
▰執行 – 電腦只要執行一次就好
▰在專案執行
git lfs install
git lfs track “*.psd”
git add .gitattributes
git commit
Source Tree
83
結語
84
怎麼開始使用git
85
▰沒有那個比較好,只有那個比較適合
▰可以先從自己local玩起
▰如果公司使用SVN,或TFS – 都可以用git溝通
▻git svn - 開始使用git - 用git操作svn repo
▻Git tfs
相關資源
86
▰Git官網 https://git-scm.com/
▻Pro Git https://git-scm.com/book/en/v2
▰Git指令圖解說明
▻http://marklodato.github.io/visual-git-guide/index-en.html
▻https://onlywei.github.io/explain-git-with-d3
▰線上git操作
▻https://try.github.io/levels/1/challenges/1
▻http://onlywei.github.io/explain-git-with-d3/#branch
▻http://pcottle.github.io/learnGitBranching/
相關資源2
87
▰連猴子都能夠懂的Git入門指南
▻http://backlogtool.com/git-guide/tw/
▰30 天精通 Git 版本控管
▻裡面有進入到git的細節
▻https://github.com/alantsai/Learn-Git-in-30-days
▰關注我的部落格 – 特別是git標籤 -
http://blog.alantsai.net/search/label/Git
88
Q&A
感謝大家
任何問題都可以在
contact@alantsai.net
部落格-Alan Tsai 的學習筆記
找到我
CREDITS
Special thanks to all the people who made and
released these awesome resources for free:
▰ Presentation template by SlidesCarnival
▰ Photographs by Startup Stock Photos
89

大家應該都要會的工具 Git 從放棄到會用2-分支篇

Editor's Notes

  • #12 https://git-scm.com/book/en/v2/Git-Internals-Git-Objects
  • #13 https://www.git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell
  • #14 https://git-scm.com/book/en/v2/Git-Internals-Git-Objects
  • #15 https://www.git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell