淺談版本控制示意圖原理_作法_悲觀鎖定VS樂觀鎖定VS分散式版本_傳統Delta儲存.vs.DAG儲存

Version Control System (VCS)

當中有些專業術語時常看到

Respository(儲存庫)
主要用來保存程式代碼
方便散佈程式給Team 促進更有效率的團隊開發
可以記錄誰改變、在何時改變、因捨麼原因等等
主要放:  原始碼、範例設計檔、文件檔  ....etc
不須放:  暫存檔案、log檔案、build files等編譯後之產物

Branch(分支)
可因不同情境分開進行開發


Tag(標籤)
重要里程碑 , 便於日後參考




版本控制一般若沒有接觸過任何 類似工具的初心者

往往會發現   挖

我要做一個老師的作業 或作品
要一直不停在本機端  複製檔案 再去修改接下來後續功能

Local VCS
本示意圖 屬於 二次創作中的拼貼
修改來自於 Line貼圖: 替代役的日常 如有違反著作權請告知(學習分享用途)



複製 新增一堆檔案  取名 v1...v2.....v3.....v3.1......v.3.2.....

這樣不僅會消耗空間還只限定於自己的個人電腦端上

無法達到  協同處理的工作模式

因此  ,   版本控制的重要性就被人們重視了





在早期
版本控制
是屬於  Lock型態
【1】悲觀鎖定(Pessimistic Locking)_Lock型

當我是某一個職員要進行專案功能修改的時候
我就從中央版本資料庫把其中一個檔案checkout出來
同時為了避免其他同事修改這個檔案
我也會把它lock起來(只有自己可以修改)
當我修改好 再把這個檔案 commit 上去 其他同事才能繼續修改
可避免檔案衝突



本示意圖 屬於 二次創作中的拼貼
修改來自於 Line貼圖: 替代役的日常 如有違反著作權請告知(學習分享用途)

優點: 可避免衝突
缺點: 不方便團體開發,萬一有人寫很久就會要排隊等了.......或是忘記unlock



演變至後期
程式設計師 和 資訊工程師們
就開始發展出了一套



【2】樂觀鎖定Optimistic Locking)_Merge型


現今多數使用的是此模式

別於  悲觀鎖定   事前鎖定

樂觀鎖定  是  事後若遇到衝突才在commit回中央版本資料庫的時候才告知你



我們於上述兩個不管悲觀型(Lock)、樂觀型(Merge)的版本控制模式

之中其實都會遇到一個致命缺點

1.做捨麼都必須先跟 server端(中央版本資料庫) 連線
十分慢

2.Single point of failure

若 server掛了  ,  網路壞了  那就無法看到版本歷史紀錄


演變至今

就出現了

【3】Distributed VCS _分散式版本控制系統

Git
近年來趨勢以此型態為主流
何謂  分散式版本控制系統


在你遠端Server有一個完整的版本資料庫

在你本地端也有一個完整版本資料庫(有人稱為stage)

當你修改檔案一樣會先checkout 改玩再commit出去到stage

但若要真正分享給同事的話

還必須push到遠端server  
之後 同事再從遠端pull回自己本地端

別於過去版本控制多了一層「遠端」

這樣可以更加靈活工作流程


最明顯好處就是

Git分散式系統中
即使沒有網路照樣可以commit 和 看歷史紀錄
也不用擔心 server備份問題
因為每個人都有完整的Repository(儲存庫)





Git 開放原碼分散式版本管理系統(DVCS)


發明者是  Linux 創建人 Linus Torvalds

目的  管理 Linux Kernel 原始碼

2005  4月 開始開發  
2005  6月開始進行管理
2005  12月 釋出 1.0版


有很多知名公司團隊都在用 Git

像是  Git 本身、Linux Kernel

Facebook、IBM、Twitter、Microsoft、Adobe等等

Git很快  又 節省空間
開分支快 效能好 節省資源

「Delta儲存方式」 VS 「DAG儲存方式」

在 Git 之前的版本控制系統

是採用所謂的  「Delta儲存方式」
紀錄每次檔案變更、開分之還需要建立副本

在 Git中儲存方式就改為 DAG(Directed acylic graph) 有向循環圖

利用 DAG 紀錄metadata建構出snapshots
相同內容只會有一份紀錄





Git 也算的上是一種 mini filesystem



安裝指令套餐(不同系統間)

Mac
brew install git

Ubuntu / Debian
apt-get install git

Fedora/CentOS
yum install git-core


=================================================================

常用幾個基本指令套餐組合

Step1. 先讓  git 認識你這個開發者

你的名字
git config --global user.name "your name"

你的信箱郵件
git config --global user.email "test@gmail.com"



Step2. 初始化
於目前所在目錄中,啟動Git版本控制機制

git init

Step3.寫了一陣子程式後
準備將要提交(commit)的檔案加進stage
此步驟可以讓你自行選擇確定要提交的東西
不需要的可以閃邊

git add file1 file2....

Step4.查看目前狀態

哪些檔案位於 Stage
哪些檔案未被追蹤
哪些檔案被修改過

git status

Step5. 存檔
記得寫目前存檔關卡的資訊(例如這是進度到哪的附註...)

git commit -m "message"


Step6. 比較差異、看log資訊、捨棄未被commit的修改

git diff
跟上次commit的作比對

git  log
(PS: 每一個commit都會有一個唯一的亂數編號)

git reset --hard
捨棄所有還未被commit出去的修改

git checkout commit標號
重返至某個commit時狀態

git checkout 分支名稱

例如 : git checkout master
回至分之末端






留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header