SlideShare a Scribd company logo
1
Migrate from TFS to Git
(using Azure DevOps)
Roberson Liou
關於我
▪ 手沖咖啡科技宅
▪ 打雜的後端工程師
▪ twMVC 核心成員
▪ DevOps Taiwan 志工
▪ Blog:工程良田的小球場
2
大綱
3
1 移轉!吃飽沒事幹?
2 分支策略選用
3 歷史紀錄移轉
4 Azure DevOps With Git
移轉!吃飽沒事幹?
4
???
???
為什麼我們不用 Git?
 同事A:Git?好像有聽過欸...
 同事B:喔我知道,就是 GitHub 在用的那個嘛!
 同事C:Git 很好,不過我們一直都是用 TFS。
 同事D:如果有時間的話,我們再來導入 Git。
 以上內容純屬虛構,如有雷同純屬巧合。
5
不要問
為什麼沒有人做這個
先承認你就是
「沒有人」
6
為什麼要移轉?
▪ 普遍的業界標準
▪ 分支成本(空間、時間、靈活度)
▪ Pull Request
▪ 可離線的開發環境
7
https://shorturl.at/ajAW4
事前準備
 決定使用工具
 挑選分支策略
 訂定歷史記錄移轉方式
 舉辦 Training 及 Lab
 等待適合時機進行移轉
8
使用工具
9
Visual Studio
▪ 地表最強的開發工具
▪ 整合Azure DevOps
▪ 介面支援多種Git操作
▪ 支援Git/TFVC
▪ 內建看板及 Wiki
▪ 整合CI/CD
▪ 自訂測試計畫
Azure DevOps Server
分支策略選用
10
分支策略選用
main
B : 分支, Branch
C : 提交, Commit
M : 合併, Merge
分支策略(TFS)– Release Isolation Flow
release-1.0.0 C
M B
release-1.1.0
CCC
C
bug
B
release-1.0.1
C
bug-fix
分支策略(TFS)– Release Isolation
▪ 優點
▪ 分支策略簡單,學習曲線較低
▪ 開發者僅需專注於 main 進行開發
▪ Release 分支獨立不受干擾
▪ 缺點
▪ 主分支(main)穩定性不足
▪ Release 分支成本較高(package restore...)
12
master
B : 分支, Branch
C : 提交, Commit
M : 合併, Merge
分支策略(Git) – Trunk Based Development
13
B
topic-1 C
release-1.0.0
PR
M
topic-1
C C… …
B
C
bug
bug-fix-1 C
B
bug-fix-1
M
cherry-pick
topic-2
B M
PR
topic-2
C C C… …
C
M
PR
release-1.0.1
分支策略(Git) – Trunk Based Development
▪ 優點
▪ 分支週期短,反饋速度較快
▪ 僅需維護一條 master 分支,減少合併衝突機率
▪ 缺點
▪ 多條分支同時合併回 master 時,易發生 CI 資源搶用現象
▪ Topic 分支容易受 master 分支影響
14
歷史記錄移轉
15
歷史紀錄該移轉嗎?
▪ TFS 與 Git 先天不同
▪ 分支方式
▪ 檔案變更記錄儲存方式
▪ 「我們建議您不要移轉歷史記錄,而是只將最新的分支版本移轉至
Git。」 – Matt Cooper, Program Manager, Azure DevOps
▪ 持續維護舊版控系統(TFS)
▪ 於新版控系統的專案描述中放上舊版控的連結
16
Azure DevOps 內建移轉方式
▪ 僅支援 Azure DevOps | TFS 2018、2017
▪ 兩個專案必須在同一個組織下
▪ 最多只能移轉 180 天的歷史記錄
▪ 專案大小不能超過 1GB
17
git-tfs
▪ Open Source
▪ 提供 git、tfs 雙向移轉
▪ 指令式操作
▪ git tfs clone http://tfs:8080/tfs/DefaultCollection $/some_project
▪ 移轉速度較慢
▪ 參考文章:TFVC - Git 專案搬家經驗談(黑暗執行緒)
18
Training & Lab
19
Training
20
master B
Joe/test C
merge
M
Joe/test
C
file-Joe
Lab
Azure DevOps
TFS & Git 指令比較
21
TFS Git
簽入( local ) X commit
簽入( remote ) Check In push
簽出 Get Latest Version pull = fetch + merge
對照本機路徑 Map Local Path clone
拆掉 local commit X reset --hard
暫存程式碼 Shelveset stash
22
Azure DevOps with Git
Branch Policy(1)
▪ 強迫該分支只接受 PR
▪ 套用後該分支無法刪除
▪ 設定最低通過的 Reviewer 人數
23
Branch Policy(2)
▪ 檢查是否有工作項目連結
▪ 確認每個回覆是否有解決
▪ 限制接受的合併方式
24
Branch Policy(3)
▪ 驗證建置及測試是否通過
▪ 須先建立 CI Pipeline
▪ 設定預設 Reviewer 名單
▪ 可指定群組
25
Pull Request
▪ 協助程式碼審查流程
▪ 可加入自訂標籤
▪ 在 PR 完成時...
▪ 可挑選合併方式
▪ 可在合併後刪除分支
▪ 可自動完成連結的工作項目
26
Pull Request Template
▪ 可引導 Requestor 描述情境
▪ 套用方式分為 3 種
▪ Default
▪ Branch Specific
▪ Additional
▪ 命名參考(MSDN)
27
Default
Additional
Branch
Specific
程式還沒寫完但想找人Review?
▪ 走一般 PR 機制可能會不小心被合併
▪ 標題開頭加上「WIP」、「Do-not-Merge」
▪ Draft Pull Request
▪ 不會觸發 Build Validation
▪ 預設的 Reviewer 不會被加入
▪ 當功能完成後可直接發佈成正式的 PR
28
Recap
29
108/9
規劃
108/10
建置 Azure DevOps Server
108/11
POC Test
108/12
Training
109/1
Migrating
導入技術時常見的狀況
30
降低學習曲線 提高使用意願
主動協助排故搞定主管
評估成本
學習成本
影響範疇
時間、金錢
預期效益
建立信任
不做批判
做好規劃
定期回饋
主動實驗
教育訓練
拉攏信眾
小組試行
全面導入
等待適當時機
推薦閱讀 – Git & Branch Strategies
▪ Git Turtorials (Bitbucket)
▪ Branch Strategies for TFS (MSDN)
▪ How We Use Git At Microsoft (MSDN)
▪ Trunk Based Introduction
31
推薦閱讀 – How to Migrate
▪ 從集中版本控制到分散式版本控制 (王建興)
▪ TFS Git 筆記 - 該用 TFVC 還是 Git?(黑暗執行緒)
▪ TFS Git 筆記 - TFVC - Git 專案搬家經驗談 (黑暗執行緒)
▪ Map TFVC actions to Git (MSDN)
▪ Plan your migration to Git (MSDN)
32
33
The End

More Related Content

What's hot

工程師必備第一工具 - Git
工程師必備第一工具 - Git工程師必備第一工具 - Git
工程師必備第一工具 - Git
Alan Tsai
 
Git 版本控制 (使用教學)
Git 版本控制 (使用教學)Git 版本控制 (使用教學)
Git 版本控制 (使用教學)
Jui An Huang (黃瑞安)
 
Learning to Use Git | WeiYuan
Learning to Use Git | WeiYuanLearning to Use Git | WeiYuan
Learning to Use Git | WeiYuan
Wei-Yuan Chang
 
Git & Sourcetree 介紹
Git & Sourcetree 介紹Git & Sourcetree 介紹
Git & Sourcetree 介紹
Adison wu
 
Git與source tree 基礎教學
Git與source tree 基礎教學Git與source tree 基礎教學
Git與source tree 基礎教學
Duncan Chen
 
Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰
Will Huang
 
Introduction to git
Introduction to gitIntroduction to git
Introduction to git
Bo-Yi Wu
 
Ian 20150515 grunt
Ian 20150515 gruntIan 20150515 grunt
Ian 20150515 grunt
LearningTech
 
A successful git branching model 導讀
A successful git branching model 導讀A successful git branching model 導讀
A successful git branching model 導讀
Wen Liao
 
My DevOps Tour 0.1
My DevOps Tour 0.1My DevOps Tour 0.1
My DevOps Tour 0.1
Chu-Siang Lai
 
電子內容管理 使用Git 與 github 1
電子內容管理   使用Git 與 github 1電子內容管理   使用Git 與 github 1
電子內容管理 使用Git 與 github 1
Alan Tsai
 
Jenkins x GitLab CI
Jenkins x GitLab CIJenkins x GitLab CI
Jenkins x GitLab CI
Yihsuan Chen
 
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 Continuous Delivery Workshop with Ansible x GitLab CI (5th) Continuous Delivery Workshop with Ansible x GitLab CI (5th)
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
Chu-Siang Lai
 
Git tutorial for windows user (給 Windows user 的 Git 教學)
Git tutorial for windows user (給 Windows user 的 Git 教學)Git tutorial for windows user (給 Windows user 的 Git 教學)
Git tutorial for windows user (給 Windows user 的 Git 教學)Cloud Tu
 
Git in a nutshell
Git in a nutshellGit in a nutshell
Git in a nutshell
Nelson Tai
 
大家應該都要會的工具 Git 從放棄到會用1-基礎篇
大家應該都要會的工具 Git   從放棄到會用1-基礎篇大家應該都要會的工具 Git   從放棄到會用1-基礎篇
大家應該都要會的工具 Git 從放棄到會用1-基礎篇
Alan Tsai
 
用Octopus deploy做自動部署 - 快速上手
用Octopus deploy做自動部署 - 快速上手用Octopus deploy做自動部署 - 快速上手
用Octopus deploy做自動部署 - 快速上手
Alan Tsai
 
Git由超淺入超深
Git由超淺入超深Git由超淺入超深
Git由超淺入超深
羊 小咩 (lamb-mei)
 
SRE CH12 - Effective Troubleshooting
SRE CH12 - Effective TroubleshootingSRE CH12 - Effective Troubleshooting
SRE CH12 - Effective Troubleshooting
Rick Hwang
 
開發用不著打一架 - 分散式版本控制 Git
開發用不著打一架 - 分散式版本控制 Git開發用不著打一架 - 分散式版本控制 Git
開發用不著打一架 - 分散式版本控制 Git
Calvin Huang
 

What's hot (20)

工程師必備第一工具 - Git
工程師必備第一工具 - Git工程師必備第一工具 - Git
工程師必備第一工具 - Git
 
Git 版本控制 (使用教學)
Git 版本控制 (使用教學)Git 版本控制 (使用教學)
Git 版本控制 (使用教學)
 
Learning to Use Git | WeiYuan
Learning to Use Git | WeiYuanLearning to Use Git | WeiYuan
Learning to Use Git | WeiYuan
 
Git & Sourcetree 介紹
Git & Sourcetree 介紹Git & Sourcetree 介紹
Git & Sourcetree 介紹
 
Git與source tree 基礎教學
Git與source tree 基礎教學Git與source tree 基礎教學
Git與source tree 基礎教學
 
Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰
 
Introduction to git
Introduction to gitIntroduction to git
Introduction to git
 
Ian 20150515 grunt
Ian 20150515 gruntIan 20150515 grunt
Ian 20150515 grunt
 
A successful git branching model 導讀
A successful git branching model 導讀A successful git branching model 導讀
A successful git branching model 導讀
 
My DevOps Tour 0.1
My DevOps Tour 0.1My DevOps Tour 0.1
My DevOps Tour 0.1
 
電子內容管理 使用Git 與 github 1
電子內容管理   使用Git 與 github 1電子內容管理   使用Git 與 github 1
電子內容管理 使用Git 與 github 1
 
Jenkins x GitLab CI
Jenkins x GitLab CIJenkins x GitLab CI
Jenkins x GitLab CI
 
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 Continuous Delivery Workshop with Ansible x GitLab CI (5th) Continuous Delivery Workshop with Ansible x GitLab CI (5th)
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 
Git tutorial for windows user (給 Windows user 的 Git 教學)
Git tutorial for windows user (給 Windows user 的 Git 教學)Git tutorial for windows user (給 Windows user 的 Git 教學)
Git tutorial for windows user (給 Windows user 的 Git 教學)
 
Git in a nutshell
Git in a nutshellGit in a nutshell
Git in a nutshell
 
大家應該都要會的工具 Git 從放棄到會用1-基礎篇
大家應該都要會的工具 Git   從放棄到會用1-基礎篇大家應該都要會的工具 Git   從放棄到會用1-基礎篇
大家應該都要會的工具 Git 從放棄到會用1-基礎篇
 
用Octopus deploy做自動部署 - 快速上手
用Octopus deploy做自動部署 - 快速上手用Octopus deploy做自動部署 - 快速上手
用Octopus deploy做自動部署 - 快速上手
 
Git由超淺入超深
Git由超淺入超深Git由超淺入超深
Git由超淺入超深
 
SRE CH12 - Effective Troubleshooting
SRE CH12 - Effective TroubleshootingSRE CH12 - Effective Troubleshooting
SRE CH12 - Effective Troubleshooting
 
開發用不著打一架 - 分散式版本控制 Git
開發用不著打一架 - 分散式版本控制 Git開發用不著打一架 - 分散式版本控制 Git
開發用不著打一架 - 分散式版本控制 Git
 

Similar to How we migrate TFS to Git ( using Azure DevOps )

twMVC#38 How we migrate tfs to git(using azure dev ops)
twMVC#38 How we migrate tfs to git(using azure dev ops) twMVC#38 How we migrate tfs to git(using azure dev ops)
twMVC#38 How we migrate tfs to git(using azure dev ops)
twMVC
 
Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Wen-Tien Chang
 
Git flow 與團隊合作
Git flow 與團隊合作Git flow 與團隊合作
Git flow 與團隊合作
Bo-Yi Wu
 
大家應該都要會的工具 Git 從放棄到會用2-分支篇
大家應該都要會的工具 Git   從放棄到會用2-分支篇大家應該都要會的工具 Git   從放棄到會用2-分支篇
大家應該都要會的工具 Git 從放棄到會用2-分支篇
Alan Tsai
 
Intro to Git 投影片
Intro to Git 投影片Intro to Git 投影片
Intro to Git 投影片
Tony Yeh
 
COSCUP 2015 開源之道-Git工作坊教學簡報
COSCUP 2015 開源之道-Git工作坊教學簡報COSCUP 2015 開源之道-Git工作坊教學簡報
COSCUP 2015 開源之道-Git工作坊教學簡報
Bachue Zhou
 
Git and Github basic with SourceTree
Git and Github basic with SourceTreeGit and Github basic with SourceTree
Git and Github basic with SourceTree
Chu-Siang Lai
 
Git流派與工作流程.pptx
Git流派與工作流程.pptxGit流派與工作流程.pptx
Git流派與工作流程.pptx
健誠 呂
 
Git原理与实战 201607
Git原理与实战 201607Git原理与实战 201607
Git原理与实战 201607
Charles Tang
 
Git 入门实战
Git 入门实战Git 入门实战
Git 入门实战
icy leaf
 
How to integrate GitLab CICD into B2B service
How to integrate GitLab CICD into B2B serviceHow to integrate GitLab CICD into B2B service
How to integrate GitLab CICD into B2B service
Alex Su
 
寫給大家的 Git 教學
寫給大家的 Git 教學寫給大家的 Git 教學
寫給大家的 Git 教學
littlebtc
 
Git introduction
Git introductionGit introduction
Git introduction
mythnc
 
軟體工程(總結篇)
軟體工程(總結篇)軟體工程(總結篇)
軟體工程(總結篇)
鍾誠 陳鍾誠
 
Git入门与实践
Git入门与实践Git入门与实践
Git入门与实践
LC2009
 
Git Flow 管理
Git Flow 管理Git Flow 管理
Git Flow 管理
Pu Lee
 
Git 經驗分享
Git 經驗分享Git 經驗分享
Git 經驗分享
Mu Chun Wang
 
Git & git hub v1.2
Git & git hub v1.2Git & git hub v1.2
Git & git hub v1.2
Chris Chen
 
Git & git flow
Git & git flowGit & git flow
Git & git flow
Amo Wu
 

Similar to How we migrate TFS to Git ( using Azure DevOps ) (20)

twMVC#38 How we migrate tfs to git(using azure dev ops)
twMVC#38 How we migrate tfs to git(using azure dev ops) twMVC#38 How we migrate tfs to git(using azure dev ops)
twMVC#38 How we migrate tfs to git(using azure dev ops)
 
Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀
 
Git flow 與團隊合作
Git flow 與團隊合作Git flow 與團隊合作
Git flow 與團隊合作
 
大家應該都要會的工具 Git 從放棄到會用2-分支篇
大家應該都要會的工具 Git   從放棄到會用2-分支篇大家應該都要會的工具 Git   從放棄到會用2-分支篇
大家應該都要會的工具 Git 從放棄到會用2-分支篇
 
Intro to Git 投影片
Intro to Git 投影片Intro to Git 投影片
Intro to Git 投影片
 
COSCUP 2015 開源之道-Git工作坊教學簡報
COSCUP 2015 開源之道-Git工作坊教學簡報COSCUP 2015 開源之道-Git工作坊教學簡報
COSCUP 2015 開源之道-Git工作坊教學簡報
 
Git and Github basic with SourceTree
Git and Github basic with SourceTreeGit and Github basic with SourceTree
Git and Github basic with SourceTree
 
Git流派與工作流程.pptx
Git流派與工作流程.pptxGit流派與工作流程.pptx
Git流派與工作流程.pptx
 
Git原理与实战 201607
Git原理与实战 201607Git原理与实战 201607
Git原理与实战 201607
 
Git 入门实战
Git 入门实战Git 入门实战
Git 入门实战
 
How to integrate GitLab CICD into B2B service
How to integrate GitLab CICD into B2B serviceHow to integrate GitLab CICD into B2B service
How to integrate GitLab CICD into B2B service
 
寫給大家的 Git 教學
寫給大家的 Git 教學寫給大家的 Git 教學
寫給大家的 Git 教學
 
Git introduction
Git introductionGit introduction
Git introduction
 
軟體工程(總結篇)
軟體工程(總結篇)軟體工程(總結篇)
軟體工程(總結篇)
 
Git入门与实践
Git入门与实践Git入门与实践
Git入门与实践
 
Git Flow 管理
Git Flow 管理Git Flow 管理
Git Flow 管理
 
Git 經驗分享
Git 經驗分享Git 經驗分享
Git 經驗分享
 
Git & git hub v1.2
Git & git hub v1.2Git & git hub v1.2
Git & git hub v1.2
 
Git教學
Git教學Git教學
Git教學
 
Git & git flow
Git & git flowGit & git flow
Git & git flow
 

How we migrate TFS to Git ( using Azure DevOps )