大綱:
一、前言
二、Git 簡介
三、Git 的誕生
四、集中管理 vs 分佈式管理
五、Git 特點
六、Git 原理
七、總結
注,測試機 CentOS 5.5 x86_64,Git 服務器版本:git version 1.8.2.1,客戶端版本:git version 1.9.2.msysgit.0。所有軟件請到這裏下載:http://msysgit.github.io/。
一、前言
本來作爲一個專職運維,嘿嘿!會搭建Git服務器就OK了,當時真這麼想,嘿嘿!本來公司的版本控制器一直在用SVN,我們版本發佈用SVN+shell腳本進行發佈,但是最近開發部的老大換了,嘿嘿。你懂的。強烈要求我們換版本控制器,雖然很多人不滿意,最後還是換成了Git,但是發現很多同事不怎麼會使用Git,於是我就寫了這個教程到內部tower中,大家看了不錯,於是我發出來與大家分享一下!網上很多教程都是從開發的角度來講Git的,今天我從運維的角度來說Git,大家有什麼問題隨時與我交流,先在這裏謝謝大家了^_^!
二、Git 簡介
Git 是什麼?大家肯定會說不就是版本控制器嘛,是的Git是目前世界上最先進的分佈式版本控制系統(沒有之一)。
1.那什麼是版本控制器呢?
舉個簡單的例子,比如我們用Word寫文章,那你一定有這樣的經歷:比如增加一個段落你得複製一份,你刪除一個段落你又得複製一份,防止下次又要修改保留上次你要刪除的段落。最後一個接一個的版本,你複製了很多版本,最後可能你自己都不知道修改了哪些?嘿嘿,然後你只能一個一個的找,太麻煩了,若是有東西幫你管理那應該多好。
2.分佈式管理
你寫的文章或書,你肯定會給你朋友或者其他人看,讓他們給你建議並做相應的修改,然後他們用郵件或U盤再發給你,你再合併修改一下,真是麻煩,於是你想,如果有一個軟件,不但能自動幫我記錄每次文件的改動,還可以讓朋友之間協作編輯,這樣就不用自己管理一堆類似的文件了,也不需要把文件傳來傳去。如果想查看某次改動,只需要在軟件看一眼就可以,豈不是很方便?這個軟件用起來就應該像這個樣子,能記錄每次文件的改動:
版本 | 用戶 | 說明 | 修改日期 |
1 | user1 | 增加一行內容 | 2014/4/10 10:22 |
2 | user2 | 修改一行內容 | 2014/4/10 13:12 |
3 | user3 | 刪除幾個字 | 2014/4/15 20:42 |
4 | user2 | 增加某個內容 | 2014/4/20 16:32 |
哈哈,這樣你就從手工控制“版本”時代到軟件自動管理的時代,而且還是分佈式管理,至於什麼是分佈式管理我們下面將詳細說明。
三、Git 的誕生(很傳奇)
先簡看一下,下面的圖片,是不是很熟悉,嘿嘿!
簡單說:Linus開發Linux內核,需要版本控制器,於是開發了Git。下面是開發週期:
2005/4/3 開發;
2005/4/6 發佈;
2005/4/7 管理自身;
2005/6/16 管理Kernel2.6.12。
大牛是怎麼定義的呢?大家可以體會一下。哈哈^_^…… Git 迅速成爲最流行的分佈式版本控制系統,尤其是2008年,GitHub網站上線了,它爲開源項目免費提供Git存儲,無數開源項目開始遷移至GitHub,包括jQuery,PHP,Ruby等等。至於Git與GitHub的關係,會再下面的文章裏說明。
四、集中管理 vs 分佈式管理
Linus一直痛恨的CVS及SVN都是集中式的版本控制系統,而Git是分佈式版本控制系統,集中式和分佈式版本控制系統有什麼區別呢? 下面我們來看看兩張圖:
1.集中管理
集中式版本控制系統,版本庫是集中存放在中央服務器的,而幹活的時候,用的都是自己的電腦,所以要先從中央服務器取得最新的版本,然後開始幹活,幹完活了,再把自己的活推送給中央服務器。中央服務器就好比是一個圖書館,你要改一本書,必須先從圖書館借出來,然後回到家自己改,改完了,再放回圖書館。
缺點:
集中式版本控制系統最大的毛病就是必須聯網才能工作,如果在局域網內還好,帶寬夠大,速度夠快,可如果在互聯網上,遇到網速慢的話,可能提交一個10M~20M的文件就需要10分鐘甚至更多時間,這還不得把人給急死啊。
2.分佈式管理
那分佈式版本控制系統與集中式版本控制系統有何不同呢?首先,分佈式版本控制系統沒有“中央服務器”,每個人的電腦上都是一個完整的版本庫,這樣,你工作的時候,就不需要聯網了,因爲版本庫就在你自己的電腦上。既然每個人電腦上都有一個完整的版本庫,那多個人如何協作呢?比方說你在自己電腦上改了文件fiel,你的同事也在他的電腦上改了文件file,這時,你們倆之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。
和集中式版本控制系統相比,分佈式版本控制系統的安全性要高很多,因爲每個人電腦裏都有完整的版本庫,某一個人的電腦壞掉了不要緊,隨便從其他人那裏複製一個就可以了。而集中式版本控制系統的中央服務器要是出了問題,所有人都沒法幹活了。
在實際使用分佈式版本控制系統的時候,其實很少在兩人之間的電腦上推送版本庫的修改,因爲可能你們倆不在一個局域網內,兩臺電腦互相訪問不了,也可能今天你的同事病了,他的電腦壓根沒有開機。因此,分佈式版本控制系統通常也有一臺充當“中央服務器”的電腦,但這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣幹活,只是交換修改不方便而已。如上圖!
五、Git 特點
1.Git 總結
分佈式
存儲快照而非差異
本地有完全的版本庫,幾乎所有操作都在本地
有內在的一致性,SHA1
優秀的分支管理
支持各種協同模式
開源,有一些第三方軟件可整合使用,幾乎所有操作都是
2.與CVS/SVN,Git 的優勢
支持離線開發,離線Repository(倉庫)
強大的分支功能,適合多個獨立開發者協作
速度塊
六、Git 原理
1.四種基本類型
BLOB:每個blob代表一個(版本的)文件,blob只包含文件的數據,而忽略文件的其他元數據,如名字、路徑、格式等。
TREE:每個tree代表了一個目錄的信息,包含了此目錄下的blobs,子目錄(對應於子trees),文件名、路徑等元數據。因此,對於有子目錄的目錄,git相當於存儲了嵌套的trees。
COMMIT:每個commit記錄了提交一個更新的所有元數據,如指向的tree,父commit,作者、提交者、提交日期、提交日誌等。每次提交都指向一個tree對象,記錄了當次提交時的目錄信息。一個commit可以有多個(至少一個)父commits。
TAG:tag用於給某個上述類型的對象指配一個便於開發者記憶的名字, 通常用於某次commit。
2.工作區(Working Dir),提交區/暫存區(stage/index),版本庫
注,大家對上面的原理不瞭解沒關係,大家只要簡單的看一下這幾張圖,在下面的文章中我們會深入瞭解。
七、總結
Q & A:歡迎大家提出問題。最後,希望大家有所收穫^_^……