GIT是現在最流行的版本控制系統。曾經系統總結過一次關於GIT的使用,抽時間整理成文。html
GIT是一種版本控制軟件,那就首先了解一下什麼是 「版本控制」?git
比較官方的解釋是,版本控制系統是一種記錄一個或若干個內容變化,以便未來查詢特定版本修訂狀況的系統。web
簡言之,你的修改只要提到到版本控制系統,基本均可以找回,版本控制系統就像一臺時光機器,可讓你回到任何一個時間點。緩存
瞭解了版本控制系統的功能,咱們知道就算你把代碼改的一塌糊塗,照樣能夠恢復到咱們過去的任何一個時間點,工做量卻微乎其微。是否是很amazing。網絡
總結一下版本控制系統有哪些優勢:架構
除了上面介紹的幾個比較常見的優勢,版本控制系統的好處還有不少,就不一一列舉了,可經過實踐本身逐漸體悟總結。下面基於GIT作更多介紹。分佈式
版本控制系統常見類別有三種svn
表明有RCS(Revision Control System),Linux下面的可用來做爲配置文件管理的版本控制工具,本人嘗試了一下,工做使用很少;工具
關於其優缺點,簡述以下:fetch
表明如CVS,SVN(Subversion),SVN是曾經最流行的版本管理系統,不少人都有用過,於是對於集中式版本控制系統不少人都很瞭解它。
優勢就很少說了,你們可能對缺點更是記憶深入。 單點故障,集中式管理的缺點,代碼集中在一臺機器上,這個問題其實能夠經過備份集羣解決;
必須聯網工做,這個缺點我是深刻痛覺,一旦公司網絡出現問題,幾個小時甚至一天沒法工做的經歷都有。因爲這些缺點,便有了分佈版本控制系統。
分佈式版本控制系統的表明就是今天要介紹的 GIT 了。想知道 GIT 有多流行嗎?看看 Github 就知道了,如今不少公司都已經把本身的代碼庫遷移到了 GIT。本人因爲各類緣由,近兩年已經到了第三家公司,其中每家都聽過一次 GIT 的分享。可見 Git 在現在的流行程度,也說明了分佈式版本控制系統是現在的趨勢。
關於分佈式版本控制系統,這裏只說優勢:
一、2兩點 svn 也能夠作到,說一下三、4點。
能夠離線工做,分佈式版本管理系統每一個計算機都有一個完整的倉庫,可本地提交,能夠作到離線工做。沒有了 svn 使人抓狂的斷網沒法工做問題;
每一個計算機都是一個完整的倉庫,也就沒有了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的總體架構,以及和各個部分相關的主要命令。先看了解說明下其中涉及的各個部分。
工做區,簡言之就是你工做的區域。對於git而言,就是的本地工做目錄。工做區的內容會包含提交到暫存區和版本庫(當前提交點)的內容,同時也包含本身的修改內容。
暫存區是git中一個很是重要的概念。是咱們把修改提交版本庫前的一個過渡階段。查看GIT自帶幫助手冊的時候,一般以index來表示暫存區。在工做目錄下有一個.git的目錄,裏面有個index文件,存儲着關於暫存區的內容。git add命令將工做區內容添加到暫存區。
版本控制系統的倉庫,存在於本地。當執行git commit命令後,會將暫存區內容提交到倉庫之中。在工做區下面有.git的目錄,這個目錄下的內容不屬於工做區,裏面即是倉庫的數據信息,暫存區相關內容也在其中。
遠程版本庫與本地倉庫概念基本一致,不一樣之處在於一個存在遠程,可用於遠程協做,一個倒是存在於本地。經過push/pull可實現本地與遠程的交互;
能夠理解爲存在於本地的遠程倉庫緩存。如需更新,可經過git fetch/pull命令獲取遠程倉庫內容。使用fech獲取時,並未合併到本地倉庫,此時可以使用git merge實現遠程倉庫副本與本地倉庫的合併。
看看.git這個目錄的下文件結構,以下圖:
簡要說明一下各個文件中所存放的內容信息:
當前所在位置,其實就是工做區的在版本庫中的那個提交點,最終會指向一個40位的HASH值;
當前版本庫的專有配置文件,如使用命令git config user.name poloxue便會記錄在此文件;
被gitweb (Github的原型)用來顯示對repo的描述。
git有可自動運行在 git 任有意義階段的腳本hooks, 如commit/release/pull/push等狀態以前或者以後。我的思考的一個用處,如pre-push能夠用來強制進行代碼檢查。
存放暫存區(stage area)的相關信息;
能夠作到和.gitignore相同的事情,用於排除不要包含進版本庫的文件。區別就是,此文件不會被共享。
目錄下有關於本地倉庫的全部分支;
目錄下有關於遠程倉庫的全部分支;
目錄下存放的就是實際的數據文件,關於其中的存放方式暫時還不瞭解,有興趣能夠研究一下;
本節從版本控制引出分佈式版本控制,比較分佈式版本控制系統與其餘版本控制系統的區別,從而引入GIT。與SVN的比較明顯可看出GIT的優秀之處。對GIT的架構也進行總體簡單介紹。內容比較理論,指望在理清本身思路的同時,不會誤導他人。
好了,就說這麼多!文中若有錯誤,請幫忙指正!謝謝!