GIT 之概述與架構

GIT是現在最流行的版本控制系統。曾經系統總結過一次關於GIT的使用,抽時間整理成文。html

基礎概念

GIT是一種版本控制軟件,那就首先了解一下什麼是 「版本控制」?git

比較官方的解釋是,版本控制系統是一種記錄一個或若干個內容變化,以便未來查詢特定版本修訂狀況的系統。web

簡言之,你的修改只要提到到版本控制系統,基本均可以找回,版本控制系統就像一臺時光機器,可讓你回到任何一個時間點。緩存

瞭解了版本控制系統的功能,咱們知道就算你把代碼改的一塌糊塗,照樣能夠恢復到咱們過去的任何一個時間點,工做量卻微乎其微。是否是很amazing。網絡

總結一下版本控制系統有哪些優勢:架構

  • 記錄文件全部歷史變化。這是版本控制系統的基本能力;
  • 隨時恢復到任意時間點。歷史記錄功能使咱們不怕改錯代碼了;
  • 支持多功能並行開發。一般版本控制系統都支持分支,保證了並行開發的可行;
  • 多人協做並行開發。對於多人協做項目,支持多人協做開發的版本管理將事半功倍;

除了上面介紹的幾個比較常見的優勢,版本控制系統的好處還有不少,就不一一列舉了,可經過實踐本身逐漸體悟總結。下面基於GIT作更多介紹。分佈式

常見類別

版本控制系統常見類別有三種svn

  • 本地版本控制系統、
  • 集中式版本控制系統、
  • 分佈式版本控制系統;

本地版本控制系統

表明有RCS(Revision Control System),Linux下面的可用來做爲配置文件管理的版本控制工具,本人嘗試了一下,工做使用很少;工具

local_version_control.png

關於其優缺點,簡述以下:fetch

優勢

  • 簡單,不少系統中都有內置;
  • 適合管理文本,如系統配置;

缺點

  • 管理少許文件,不支持項目的管理;
  • 支持的文件類型單一;
  • 不支持遠程,網絡傳輸;

集中式版本控制系統

表明如CVS,SVN(Subversion),SVN是曾經最流行的版本管理系統,不少人都有用過,於是對於集中式版本控制系統不少人都很瞭解它。

centralized_version_control.png

優勢

  • 適合多人團隊協做開發;
  • 代碼集中化管理;

缺點

  • 單點故障;
  • 必須聯網,沒法單機工做;

優勢就很少說了,你們可能對缺點更是記憶深入。 單點故障,集中式管理的缺點,代碼集中在一臺機器上,這個問題其實能夠經過備份集羣解決;

必須聯網工做,這個缺點我是深刻痛覺,一旦公司網絡出現問題,幾個小時甚至一天沒法工做的經歷都有。因爲這些缺點,便有了分佈版本控制系統。

分佈式版本控制系統

分佈式版本控制系統的表明就是今天要介紹的 GIT 了。想知道 GIT 有多流行嗎?看看 Github 就知道了,如今不少公司都已經把本身的代碼庫遷移到了 GIT。本人因爲各類緣由,近兩年已經到了第三家公司,其中每家都聽過一次 GIT 的分享。可見 Git 在現在的流行程度,也說明了分佈式版本控制系統是現在的趨勢。

distributed_version_control.png

關於分佈式版本控制系統,這裏只說優勢:

  • 適合多人團隊協做開發;
  • 代碼集中化管理;
  • 能夠離線工做;
  • 每一個計算機都是一個完整倉庫;

一、2兩點 svn 也能夠作到,說一下三、4點。

能夠離線工做,分佈式版本管理系統每一個計算機都有一個完整的倉庫,可本地提交,能夠作到離線工做。沒有了 svn 使人抓狂的斷網沒法工做問題;

每一個計算機都是一個完整的倉庫,也就沒有了SVN的單點故障。

GIT與SVN的比較

GIT的做者Linus一直比較痛恨集中方式版本控制系統。雖然有不少已知免費的集中式版本控制系統,可是在2002以前提交Linux源碼的方式都是經過diff提交給Linus的,而後進行手工合併。下面讓咱們來以GIT與SVN做爲表明,來看看爲何Linus痛恨集中式版本管理系統,而喜歡分佈式版本管理系統。下面具體比較一下它們的區別:

GIT是分佈式的,SVN爲集中式的,這是常識,二者最重要的區別,也是後面全部區別的基石;

GIT隨處都是版本庫,SVN只有一箇中央版本庫,由於GIT是分佈式的因此能作到處處都是版本庫,而SVN是集中式的,因此只有一箇中央倉庫。於是GIT可以作到無需網絡提交,處處到時版本庫,壓根不用擔憂提交速度問題,不用時刻依賴與網絡工做,不用擔憂單點故障。當工做完成以後直接推送遠程便可實現工做協做;

GIT沒有全局版本號,SVN有全局版本號,GIT版本庫處處都是,之間沒有實時共享數據,因此沒法確保版本號的惟一性,沒法使用全局版本號,分佈在各個機器上的版本庫版本號使用40位的HASH值取代。重複的狀況是存在的,從數學的角度考慮,可能性是2的63次方分之一,基本可忽略。而對於SVN,惟一版本,因此可以作到使用全局的版本號,版本號採用自增的方式;

GIT把內容按元數據存儲,SVN按文件存儲,GIT存儲的不是實際的文件,而是指向性數據。SVN保存的是文件數據。當GIT切換版本的時候,實際上切換的是元數據,並且本地操做,快捷有效;

GIT記錄文件快照,SVN記錄文件差別,GIT的元數據,即指向性數據指向的是實際的文件快照,這也是GIT可以快速切換版本的一個緣由。SVN保存的文件數據是各個版本之間的文件差別,因此切換版本的時候須要逐級的差別計算,速度比較慢,並且還需網絡傳輸。當工程較大時,速度與GIT相比差別會至關的大。

GIT的內容完整性高,SVN完整性低,由於GIT的數據記錄都有HASH值校驗,因此內容完整性較高。而SVN則沒有此功能,內容完整性低。;

以上就是本人總結的GIT與SVN的部分差別。

GIT架構

GIT的架構,能夠分爲幾個部分:

  • 本地工做區(working directory)
  • 暫存區(stage area, 又稱爲索引區, index)、
  • 本地倉庫(local repository)、
  • 遠程倉庫副本
  • 遠程倉庫(remote repository)。

以下圖:

git_structure.png

上圖展現了git的總體架構,以及和各個部分相關的主要命令。先看了解說明下其中涉及的各個部分。

工做區(working directory)

工做區,簡言之就是你工做的區域。對於git而言,就是的本地工做目錄。工做區的內容會包含提交到暫存區和版本庫(當前提交點)的內容,同時也包含本身的修改內容。

暫存區(stage area, 又稱爲索引區index)

暫存區是git中一個很是重要的概念。是咱們把修改提交版本庫前的一個過渡階段。查看GIT自帶幫助手冊的時候,一般以index來表示暫存區。在工做目錄下有一個.git的目錄,裏面有個index文件,存儲着關於暫存區的內容。git add命令將工做區內容添加到暫存區。

本地倉庫(local repository)

版本控制系統的倉庫,存在於本地。當執行git commit命令後,會將暫存區內容提交到倉庫之中。在工做區下面有.git的目錄,這個目錄下的內容不屬於工做區,裏面即是倉庫的數據信息,暫存區相關內容也在其中。

遠程版本庫(remote repository)

遠程版本庫與本地倉庫概念基本一致,不一樣之處在於一個存在遠程,可用於遠程協做,一個倒是存在於本地。經過push/pull可實現本地與遠程的交互;

遠程倉庫副本

能夠理解爲存在於本地的遠程倉庫緩存。如需更新,可經過git fetch/pull命令獲取遠程倉庫內容。使用fech獲取時,並未合併到本地倉庫,此時可以使用git merge實現遠程倉庫副本與本地倉庫的合併。

git文件一覽

看看.git這個目錄的下文件結構,以下圖:

dot_git_repository.png

簡要說明一下各個文件中所存放的內容信息:

HEAD

當前所在位置,其實就是工做區的在版本庫中的那個提交點,最終會指向一個40位的HASH值;

config

當前版本庫的專有配置文件,如使用命令git config user.name poloxue便會記錄在此文件;

description

被gitweb (Github的原型)用來顯示對repo的描述。

hooks

git有可自動運行在 git 任有意義階段的腳本hooks, 如commit/release/pull/push等狀態以前或者以後。我的思考的一個用處,如pre-push能夠用來強制進行代碼檢查。

index

存放暫存區(stage area)的相關信息;

info/exclue

能夠作到和.gitignore相同的事情,用於排除不要包含進版本庫的文件。區別就是,此文件不會被共享。

refs/heads

目錄下有關於本地倉庫的全部分支;

refs/remote

目錄下有關於遠程倉庫的全部分支;

object

目錄下存放的就是實際的數據文件,關於其中的存放方式暫時還不瞭解,有興趣能夠研究一下;

本節從版本控制引出分佈式版本控制,比較分佈式版本控制系統與其餘版本控制系統的區別,從而引入GIT。與SVN的比較明顯可看出GIT的優秀之處。對GIT的架構也進行總體簡單介紹。內容比較理論,指望在理清本身思路的同時,不會誤導他人。

好了,就說這麼多!文中若有錯誤,請幫忙指正!謝謝!

參考附錄

相關文章
相關標籤/搜索