關於版本控制
要把檔案恢復到編輯前的狀態,大家都是怎麼做的呢?
我在大學的時候做報告時,最簡單的方法就是先複製編輯前的檔案,使用這個方法時通常都會在檔案名稱或目錄名稱上添加編輯的日期,這就是所謂的本地端的版本控制。但是,每次編輯檔案都要複製非常的麻煩,也很容易出錯。
上面的例子是我以前做報告時的命名方式,如果沒有察看詳細資料,就沒有辦法區別那一個檔案是最新的。此外,如果是共享的檔案要區分不同編輯者,要具體區分更改了什麼也不容易知道。
此外,如果有兩個人要對同檔案進行編輯,先進行編輯的人的修改內容會被覆蓋,導致資料流失,相信大家都有這樣的經歷。
為了解決這個問題,便有開發者產生了版本控制系統,早期大多都是採用簡單的資料庫來紀錄文件的歷次更新差異,這種版本控制又稱為本地端版本控制系统,其中最流行的叫RCS,現在的 Mac OS X
系统上安装了開發者工具後,也可以使用 rcs 命令。 它的工作原理是保存不同檔案的每一個版本,透過比較不同的版本,可以計算出各個版本的文件内容中有那些差異。
集中式版本控制系统
接下來有開發者遇到一个问题,如何讓在不同系统上的開發者協同作業?
於是,集中式版本控制系统(Centralized Version Control Systems,簡稱 CVCS)誕生了。 像是 CVS、Subversion以及 Perforce等,都有一個單一的集中管理的伺服器,保存所有文件的修訂版本,而偕同作業的開發者都透過客户端軟體連到這台伺服器,取出最新的文件或者提交更新,這已成為版本控制系统的標準做法。
相對於舊式的本地端VCS來說,集中式版本控制有許多優點,例如:
1.每個人都可以在一定程度上看到項目中的其他人正在做些什麼
然而,這種類型的系統仍有缺點:
1.中央服務器的單點故障。如果宕機一小時,那麼在這一小時內,誰都無法提交更新,也就無法協同工作。
2.如果中心數據庫所在的磁盤發生損壞,又沒有做備份,毫無疑問你將遺失所有資料 - 包括項目的整個更變歷史,只剩下人員在各自機器上保留的單獨快照。本地版本控制系統也存在類似問題,只要整個項目的歷史記錄被保存在單一位置,就有丟失所有歷史更新記錄的風險。
2.管理員也可以輕鬆掌控每個開發者的權限
3.並且管理一個CVCS要遠比在各個客戶端上維該端的資料庫來得輕鬆容易
1.中央服務器的單點故障。如果宕機一小時,那麼在這一小時內,誰都無法提交更新,也就無法協同工作。
2.如果中心數據庫所在的磁盤發生損壞,又沒有做備份,毫無疑問你將遺失所有資料 - 包括項目的整個更變歷史,只剩下人員在各自機器上保留的單獨快照。本地版本控制系統也存在類似問題,只要整個項目的歷史記錄被保存在單一位置,就有丟失所有歷史更新記錄的風險。
分散式版本控制系统
於是分散式版本控制系統(Distributed Version Control System,簡稱DVCS)誕生了。這類系統中,像Git,Mercurial,Bazaar以及Darcs等,客戶端並不只提取最新版本的文件快照,而是把代碼庫因為每一次的克隆(Clone)操作,實際上都是對的完整的的做備份。
許多這類系統都可以指定和若干不同的遠端代碼倉庫進行交互。籍此,你可以在同一個項目中,分別和不同工作小組的人相互協作。你可以根據需要設定不同的協作流程,比如敏捷的工作流,而這在以前的集中式系統中是難以實現的,
而Git就是上述這種分散式版本控制系統,也是目前業界最流行的版本控制系統,有Git幫你保留這些歷史紀錄跟證據,萬一出事的時候你就能知道是從什麼時候開始就有問題,以及知道該找誰負責!
Git 的優點
所以,到底
Git 有什麼厲害的地方,會讓這麼多人選擇它呢,歸納上述分散式版本控制系统的優點後,有以下優點
1. 免費、開源、跨平台
Git 是由 Linux 核心的作者 Linus Torvalds 在 2005 年為了管理 Linux
核心程式碼,至目前已有十幾年的歷史了。除了可免費使用外,整個 Git 的原始程式碼也可在網路上取得。此外,Git 版本庫其實就只是一個資料夾,資料夾中有許多相關的設定檔與各種 blob 物件檔案而已,Git 版本庫可以用任何方式發布,所以你用 HTTP, FTP, rsync,
SSH 甚至於用 Git protocol 都可以當成存取 Git 版本庫的媒介,相容性極高,且除了Linux外,Git也有Windows與Mac的版本,讓開發者可以在不同的平台存取於Git Repository 的檔案。
2. 速度快、檔案體積小、有效率的處理大型專案
如果你是使用前面提到的「Ctrl+C、Ctrl+V 大法」,這些備份的目錄會很佔空間。而其它大部份的版控系統大多是記錄每個版本之間的差異,而不是完整的備份整個目錄,所以整個目錄的大小就不會快速的增加。由於Git完整的版本庫會複製(clone)一份在本機,該版本庫包含完整的檔案與版本變更紀錄,所以針對版本控管中的各種檔案操作速度,將會比直接從遠端存取來的快上百倍之多,這也代表著,Git
版本控管不會因為專案越來越大、檔案越來越多,而導致速度變慢。除此之外 Git
特別的設計,在於它並不是記錄版本的差異,而是記錄檔案內容的「快照」(snapshot),使用分支的機制也非常輕量,沒有負擔,它可以讓 Git
在非常快速的切換版本,每一次的分支只是某個 commit 的參考指標而已。至於什麼是「快照」,在後面會有更仔細的介紹。
3. 分散式系統、分散式開發模式
對我來說,這個可能是最大的優點了。在以往其它的版本控制系統,在上述的集中式的版控系統(Centralize
Version
Control),都需要有一台專用的伺服器,且所有的更新都需要跟這台伺服器溝通。也就是說,萬一這台伺服器壞了,或是沒有網路連線的環境,就沒辦法使用。
而 Git 是一種分散式的版控系統(Distributed Version
Control),雖然通常也會有共同的伺服器,但即使在沒有伺服器或是沒有網路的環境,由於開發者透過git將 Git 版本庫複製(clone)下來後,會擁有所有變更過的檔案與歷史紀錄,通通都會儲存在本機儲存庫(local
repository),完全等同於這份 Git 版本庫的「完整備份」,都將擁有完整的開發歷史紀錄,依舊可以使用 Git
來進行版控,待伺服器恢復正常運作或是在有網路的環境後再進行同步,不會受影響。而且,事實上在使用 Git 的過程中,大多的 Git
操作也都是在自己電腦本機就可以完成,Git 擁有快速的分支與合併機制,還包括圖形化的工具顯示版本變更的歷史路徑,Git 非常強調分支與合併,所以版本控管的過程中,你會不斷的在執行分支與合併動作。


留言
張貼留言