SlideShare a Scribd company logo
1 of 131
GIT實務操作與理論
余士鵬
Outline
• Git Flow (Git Cmd)
• Use Scenario
• Bonobo Git Install
版控很重要嗎?
為什麼要用他?
V2版不太穩定….到底出了什麼問題?
你到底改了什麼??
老闆
學弟
抱歉,我馬上比對看看
學弟
大海茫茫路茫茫從何找起QAQ
欸,我的部分寫好了.我丟給你幫我加進去喔
喔…好
兩天後…….
乾…我寫的功能好像有問題,你有更新嗎?
我真的有貼過去…..(內心OS:應該是你寫有BUG吧…)
Version
Control
救我…
團隊程式碼同步
程式回溯
討論程式碼品質
CPL
平均一天2.2次
Commit
ISSUE
Code有衝突,我傳不上去拉!!!
靠北. 我的code怎麼都不見了…
你怎麼亂開分支拉,這條分支再衝殺X
版控好麻煩….
看得懂嗎?
Git Flow介紹
•Master : 用來放穩定、隨時可上線的版本。
•Develop : 所有開發的基礎分支。
•Feature : 開發新增功能所開的分支。
•Release : Develop開發完釋出到此分支等測試。
•Hotfix :上線產品發生緊急問題的時候從master所開的分支。
branc
h
merge
commit
Master
git branch
Dev
Feature A
git branch
Feature B
git commit
git commit
git merge
git commit git commit
Git branch
Bug Fix Commit
git merge
git merge
Rls
git branch
Hot Fix
git merge
git merge
給人看得
實際上
Flow有必要這麼複雜嗎…?
git branch
git commit
merge request
Code review
Deploy
(Final test)
git merge
要怎麼選擇?
中小專案: GitHub流程
超大型產品專案(包括測試部門): Git流程
開源專案: GitHub流程
VS
開始建立Flow
先搞懂圖
Remote repo:遠端存取庫
Local : 本地端存取庫
Staging : 暫存區. 讓你選擇要Commit的檔案
Working: 實際本地端工作區
開始建立Flow
1.下載遠端存取庫 – git clone
2. 創立第一個節點 (提交檔案) – git add && git commit && git push
3. 開發新功能 – git branch && git checkout
4. 檔案加入版控 – git add
5. 提交檔案 –git commit
6. 更新本地端Master節點 – git pull
7. Code合併 – git merge
8. 上傳到遠端 – git push
目錄
下載遠端存取庫
熟悉
git clone
目錄
新增遠端存取庫
Local PC Remote Git Server
Remote repo:遠端存取庫
Local : 本地端存取庫
Staging : 暫存區. 讓你選擇要Commit的檔案
Working: 實際本地端工作區
git clone
Block
Cmd
git clone:下載遠端存取庫到本地端
遠端儲存庫連結
新增遠端存取庫
Cmd -> git clone URL
下載遠端存取庫(Create Local Master) – git Clone
master
git clone URL
master
master
Local Repo
Remote Repo
Cmd -> git clone URL
下載遠端存取庫(Create Local Master) – git Clone
剛開始建置沒有任何Commit點
創立第一個節點 (提交檔案)
熟悉
git add
git commit
git push
目錄
Remote repo:遠端存取庫
Local : 本地端存取庫
Staging : 暫存區. 讓你選擇要Commit的檔案
Working: 實際本地端工作區
git add
git commit
git push
Block
Cmd
git add : 將檔案放到暫存區
git commit: 節點產生
git push : 推到遠端存取庫
1.New Project
2.Cmd -> git add –all
創立第一個節點 (Create Local Master Node) – git add
master
master
Staging
Local Repo
Working
Remote Repo
New Project
git add - - all
Cmd -> git commit
創立第一個節點 (提交檔案) – git commit
master
master
Staging
Local Repo
Working
Remote Repo
git commit
dcf89
關於提交(Commit)資料結構
起頭 尾端
存取原理:https://ithelp.ithome.com.tw/articles/10190453
在Git操作上只有在Commit時,才會Create Snapshot(Node),將程式差異性存取下來。
Cmd -> git push
推到遠端存取庫 (Create Remote Master Node) – git push
master
master
Staging
Local Repo
Working
Remote Repo
git push
dcf89
dcf89
master
master
Staging
Local Repo
Working
Remote Repo
創立第一個節點
origin/master
dcf89
dcf89
實作
Remote repo:遠端存取庫
Local : 本地端存取庫
Staging : 暫存區. 讓你選擇要Commit的檔案
Working: 實際本地端工作區
git clone
git add
git commit
git push
Block
Cmd
git clone:下載遠端存取庫到本地端
git add : 將檔案放到暫存區
git commit: 節點產生
git push : 推到遠端存取庫
開發新功能(Create
Branch) 熟悉
git branch
git checkout
目錄
下Create Branch會變怎樣?
Local Repo
dcf89
Cmd -> git branch <name> 開分支
開發新功能(Create Branch) – Git Branch
master
master, original/master, dev/new-util-file
Local Repo
Remote Repo
git branch
Local Repo
Branch分支?線怎麼不是變兩條???
master, original/master, dev/new-util-file
這個其實是長這樣
Local Repo
master, original/master, dev/new-util-file
master
Head
dc89a7
dev/new-util-file
original/master
Branch分支:真實涵義是建立一個新的、可移動的指標
master
Head
dc89a7
dev/new-util-file
Head: 一個指標,指向某一個分支,簡單來說可以把 HEAD 當做「目前所在分支」看待
在Git操作上只有在Commit時,才會Create Snapshot(Node),將程式差異性存取下來。
在此之前,branch只是一個其實就只是一個有 40 個字元的檔案(存取Commit 物件的 SHA1 值)。
所以Git開Branch很便宜!!!
original/master
Cmd -> git checkout <name> 分支切換
開發新功能(Create Branch) – git checkout
master
master, original/master, dev/new-util-file
Local Repo
Remote Repo
如果下git log會看到什麼改變???
master
Head
dc89a7
dev/new-util-fun
master
Head
dc89a7
dev/new-util-fun
git checkout feat/new-util-fun
original/master
master
feat/new-util-file , origin master, master
Local Repo
Remote Repo
開始開發
dc89a7
dc89a7
實作
程式碼加入版控 – git add
熟悉正確使用
git add
git commit
git push
目錄
Staging
Working
New Project
A
B
C
方案1: git add -- all 填寫commit註解一次commit上去
方案2: 根據每個檔案下git add file 填寫commit註解commit上去 (推薦)
Commit comment可以一眼看出做了什麼
程式碼加入版控 – git add
master
feat/new-util-file , origin master, master
Local Repo
Remote Repo
Staging
Working
New Project
git add <select file>
dc89a7
dc89a7
提交檔案 –git commit
master
origin master, master
Local Repo
Remote Repo
Staging
Working
git commit
feat/new-util-file
dc89a7
dc89a7 049f960
目錄
還是同一條??
Local Repo
dc89a7 049f960
origin master, master
feat/new-util-file
branch 只是指向某個commit 的一個路標
Local Repo
dc89a7 049f960
origin master, master
feat/new-util-file
master
dc89a7
Head
dev/new-util-fun
049f4960
單個提交在版本庫中的資料結構
如果你做一些修改並再次提交,這次的提交會再包含一個指向上次提交的指標
branch 只是指向某個commit 的一個路標
實作
所以什麼時候會有分開狀況??
更新本地端Master節點 – git pull
熟悉
git pull
程式碼上傳前請先確定遠端狀況是否有人更新程式碼
目錄
更新本地端Master節點 – git fetch && git pull
master
master
Local Repo
Remote Repo
有人上傳新的節點
dcf89a7
73e7369
dcf89a7
049f960
master
dc89a7 73e7369
master
Remote Repo
有人上傳新的節點
dcf89a7
73e7369
master
Local Repo
dcf89a7
049f960 master
dc89a7
dev/new-util-fun
049f4960
original/master
master
dc89a7 73e7369
master
dc89a7
dev/new-util-fun
049f4960
original/master
如果下git fetch會變怎樣???
會變什麼樣子
?
master
dc89a7
dev/new-util-fun
049f4960
original/master
Fetch
前
Fetch
後
master
dc89a7
dev/new-util-fun((Parent:dc89a7))
049f4960
73e7369
original/master (Parent:dc89a7)
所有的branch 只是指向某個commit 的一個路
標
Head
git merge
master
dc89a7
049f4960
73e7369
Head
Merge後
original/master
Merge前
master
dc89a7
dev/new-util-fun((Parent:dc89a7))
049f4960
73e7369
original/master (Parent:dc89a7)
Head
git pull = git fetch + git merge
master
dc89a7
049f4960
73e7369
Head
merge後Head在哪裡
?
original/master
實作
Code合併– git merge
熟悉
git merge
目錄
Code合併– git merge
master
master
Local Repo
Remote Repo
Dev branch
上傳到遠端 – git push
master
master
Local Repo
Remote Repo
Dev branch
git push
master
master
Local Repo
Remote Repo
Dev branch
上傳到遠端 – git push
git push
合併進來分支的commit點 會一起紀錄上去
抽人 試著解釋看看
抽人 試著解釋看看
抽人 試著解釋看看
72a1f5b a32fe62 c9debde
cf06n1e
master
develop
feat/API
A
0ff36d0
Git Flow
https://git-scm.com/
Git Install
Git 安裝
Git
Tool
https://tortoisegit.org/
https://www.sourcetreeapp.com/
Git Scenario
Git Scenario (使用Source Tree)
• 新增專案加入版控
• 新增功能(開Branch)
• 功能開發完上傳
• 功能分支線合併
• 還原剛剛所改的Code(還原,誤刪檔案處理)
• 取消Commit Code
• 衝突處裡
目錄
新增專案加入版控
1.新增遠端存取庫並取得Git Url
2.在本地端新增檔案並作Git Clone
3.新增專案
4. Git Add && Git Commit
5. Git Push
目錄
1.新增遠端存取庫並取得Git Url
新增專案
1.新增遠端存取庫並取得Git Url
填入專案資料,並按建立
1.新增遠端存取庫並取得Git Url
2.在本地端新增檔案並作Git Clone
1.新增
Clone
2.輸入Git
Url
3.存取位
置
4.下載數據
庫
3.新增專案
Studio新增專案,Gitnore會自動產生
4.Git Commit
1.點選File Status
2.點選Statge All
會列出更動過的檔案
4.Git Commit
1.點選File Status
2.寫下註解
會列出更動過的檔案
3.按下Stage All
4.Commit
5.Git Push
1.按下Push
2.Push
遠端數據庫
新增功能(開Branch)
1.先做Pull將本地端存取庫更新到最新版
2.新建Branch,切換至新建Branch
3.開始編輯Code
目錄
1.先做Pull將本地端存取庫更新到最新版
點選Pull
2.新建Branch
1.點選Branch
2.輸入Branch Name
3.Creat
e
3.開始編輯Code
功能開發完上傳
1.Git Commit
2.切回Dev分支Pull最新版本
3.切回功能開發線點選Dev線做Rebase
4.Git Push
目錄
1.Git Commit
1.File Status
2.Statge All
3.註解
4.Commit
2.切回Dev分支Pull最新版本
1.切回Dev線
2.Pull
3.切回功能開發線點選Dev線做Rebase
確保Feature版本(Code)與Dev一致
1.切回feature線
2.Rebase on dev線
4.Git Push
1.點選Push
2.Push
功能分支線合併
1.切到Dev線
2. Dev線做Git Pull更新到最新版
3. 切到Feature功能開發線
4. 對Dev做Rebase
---以上確保本地端Dev線與Feature線Code為最新-參照(功能開發完上傳流程)
5.選擇要Merge的分支Merge
6.Git Push
7.刪除不要的分支線(Local+Remote)
目錄
1.切到Dev線
1.切到Dev
5.選擇要Merge的分支Merge
1.點選Merge
2.選擇要Merge的線
3.OK
6.Git Push
1.Push
選擇Merge好的線
Push
7.刪除不要的分支線(Local+Remote)
點選右鍵刪除
還原剛剛所改的Code
選擇1.一般IDE都有版控操作,直接對檔案案右鍵Revert
選擇2.Source Tree直接對分支做Revert
目錄
選擇1.一般IDE都有版控操作,直接對檔案案右鍵Revert
選擇2.Source Tree直接對分支做Revert
取消Commit Code
直接對Commit線做Reset
目錄
直接對Commit線做Reset
Reset Commit
選擇Mix
衝突處理
目錄
1.選擇要以哪一份的Code為主
2.Git Commit
3.Git Push Or Merge
衝突處理
分支
A
分支B
只有同行一樣會發生衝突
衝突處理
1.選擇要以哪一份的Code為主
2.Git Commit
3.Git Push
Bonobo Git
Install
下載
開啟IIS與.Net
將檔案放置intpub/wwwroot下
開啟IIS 並將Bonobo轉成應用程式
http://localhost/Bonobo.Git.Server/Home/LogOn
即可打開
如果遇到500開啟不了請如圖設定,選擇
.Net4.0以上
End

More Related Content

What's hot

版本控制 使用Git & git hub
版本控制   使用Git & git hub版本控制   使用Git & git hub
版本控制 使用Git & git hub
維佋 唐
 
Yet another introduction to Git - from the bottom up
Yet another introduction to Git - from the bottom upYet another introduction to Git - from the bottom up
Yet another introduction to Git - from the bottom up
Wen-Tien Chang
 

What's hot (20)

Git flow 與團隊合作
Git flow 與團隊合作Git flow 與團隊合作
Git flow 與團隊合作
 
用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式用 Docker 改善團隊合作模式
用 Docker 改善團隊合作模式
 
COSCUP 2016 - LLVM 由淺入淺
COSCUP 2016 - LLVM 由淺入淺COSCUP 2016 - LLVM 由淺入淺
COSCUP 2016 - LLVM 由淺入淺
 
版本控制 使用Git & git hub
版本控制   使用Git & git hub版本控制   使用Git & git hub
版本控制 使用Git & git hub
 
Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)
 
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教學
連哈秋都懂的Git教學連哈秋都懂的Git教學
連哈秋都懂的Git教學
 
Introduction to Golang final
Introduction to Golang final Introduction to Golang final
Introduction to Golang final
 
Git 入门实战
Git 入门实战Git 入门实战
Git 入门实战
 
Git 經驗分享
Git 經驗分享Git 經驗分享
Git 經驗分享
 
Git and Github basic with SourceTree
Git and Github basic with SourceTreeGit and Github basic with SourceTree
Git and Github basic with SourceTree
 
運用 Docker 整合 Laravel 提升團隊開發效率
運用 Docker 整合 Laravel 提升團隊開發效率運用 Docker 整合 Laravel 提升團隊開發效率
運用 Docker 整合 Laravel 提升團隊開發效率
 
Continuous Delivery with Ansible x GitLab CI
Continuous Delivery with Ansible x GitLab CIContinuous Delivery with Ansible x GitLab CI
Continuous Delivery with Ansible x GitLab CI
 
在 golang 中透過組合語言實作 SIMD
在 golang 中透過組合語言實作 SIMD在 golang 中透過組合語言實作 SIMD
在 golang 中透過組合語言實作 SIMD
 
Yet another introduction to Git - from the bottom up
Yet another introduction to Git - from the bottom upYet another introduction to Git - from the bottom up
Yet another introduction to Git - from the bottom up
 
Android C Library: Bionic 成長計畫
Android C Library: Bionic 成長計畫Android C Library: Bionic 成長計畫
Android C Library: Bionic 成長計畫
 
Git+使用教程
Git+使用教程Git+使用教程
Git+使用教程
 
Git基礎介紹
Git基礎介紹Git基礎介紹
Git基礎介紹
 
Git Tutorial 教學
Git Tutorial 教學Git Tutorial 教學
Git Tutorial 教學
 
My DevOps Tour 0.1
My DevOps Tour 0.1My DevOps Tour 0.1
My DevOps Tour 0.1
 

Similar to GIT實務操作與理論

Similar to GIT實務操作與理論 (20)

Git and git hub
Git and git hubGit and git hub
Git and git hub
 
Git in a nutshell
Git in a nutshellGit in a nutshell
Git in a nutshell
 
寫給大家的 Git 教學
寫給大家的 Git 教學寫給大家的 Git 教學
寫給大家的 Git 教學
 
Git flow
Git flowGit flow
Git flow
 
Git Essence Tutorial
Git Essence TutorialGit Essence Tutorial
Git Essence Tutorial
 
Git & git flow
Git & git flowGit & git flow
Git & git flow
 
Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹
 
Git入門介紹
Git入門介紹Git入門介紹
Git入門介紹
 
Build Your Own Android Toolchain from scratch
Build Your Own Android Toolchain from scratchBuild Your Own Android Toolchain from scratch
Build Your Own Android Toolchain from scratch
 
工程師必備第一工具 - Git
工程師必備第一工具 - Git工程師必備第一工具 - Git
工程師必備第一工具 - Git
 
Git Tutorial
Git TutorialGit Tutorial
Git Tutorial
 
Git入门与实践
Git入门与实践Git入门与实践
Git入门与实践
 
Git簡報
Git簡報Git簡報
Git簡報
 
Git 教學
Git 教學Git 教學
Git 教學
 
Git Branch Practice
Git Branch PracticeGit Branch Practice
Git Branch Practice
 
Intro to svn
Intro to svnIntro to svn
Intro to svn
 
Cocoa on Rails 4th
Cocoa on Rails 4thCocoa on Rails 4th
Cocoa on Rails 4th
 
Git教學
Git教學Git教學
Git教學
 
CICD Workshop 20180922
CICD Workshop 20180922CICD Workshop 20180922
CICD Workshop 20180922
 
Git 入門與實作
Git 入門與實作Git 入門與實作
Git 入門與實作
 

More from 鵬 大 (8)

影音串流簡述.
影音串流簡述.影音串流簡述.
影音串流簡述.
 
Priority assignment on the mp so c with dmac
Priority assignment on the mp so c with dmacPriority assignment on the mp so c with dmac
Priority assignment on the mp so c with dmac
 
Atomic habits an easy &amp; proven way to build good habits &amp; break bad ones
Atomic habits an easy &amp; proven way to build good habits &amp; break bad onesAtomic habits an easy &amp; proven way to build good habits &amp; break bad ones
Atomic habits an easy &amp; proven way to build good habits &amp; break bad ones
 
MCU introduction
MCU introductionMCU introduction
MCU introduction
 
Zfs replication overview
Zfs replication overviewZfs replication overview
Zfs replication overview
 
Sonar Qube tool introduction
Sonar Qube tool introductionSonar Qube tool introduction
Sonar Qube tool introduction
 
Nlog target DB setting
Nlog target DB settingNlog target DB setting
Nlog target DB setting
 
Icp das zig bee series set(2570,2571,25055)
Icp das zig bee series set(2570,2571,25055)Icp das zig bee series set(2570,2571,25055)
Icp das zig bee series set(2570,2571,25055)
 

GIT實務操作與理論