Git&Svn的區(qū)別
前言:它們都是什么?
Git是一款開(kāi)源的分布式版本控制系統(tǒng),用以有效、高速地處理從很小到非常大的項(xiàng)目版本管理。Git屬于分布式的版本控制系統(tǒng)。
svn是一款開(kāi)源的集中式版本控制系統(tǒng),用于多個(gè)人共同開(kāi)發(fā)同一個(gè)項(xiàng)目,實(shí)現(xiàn)共享資源,實(shí)現(xiàn)最終集中式的管理。SVN 屬于集中式版本控制系統(tǒng)。(IT楓斗者怎么樣)
在介紹它們區(qū)別前,我們先回憶下它們各自的命令。

區(qū)別:
1,存儲(chǔ)區(qū)別
git是分布式的,有本地和遠(yuǎn)程兩個(gè)版本庫(kù),SVN是集中式,只有一個(gè)遠(yuǎn)程版本庫(kù);
git的內(nèi)容是按元數(shù)據(jù)方式存貯,所有控制文件在.git中,svn是按文件處理,所有資源控制文件在.svn中;
svn的分支是一個(gè)目錄,git不是;
git沒(méi)有一個(gè)全局的版本號(hào),svn有;
git內(nèi)容存貯是使用SHA-1哈希算法,能確保代碼完整性;
git 有工作區(qū),暫存區(qū),遠(yuǎn)程倉(cāng)庫(kù),git add將代碼提交到暫存區(qū), commit提交到本地版本庫(kù),push推送到遠(yuǎn)程版本庫(kù)。svn是add 提交到暫存,commit是提交到遠(yuǎn)程版本庫(kù)。(IT楓斗者怎么樣)

以單個(gè)文件為單位的適合用SVN管理,而我們代碼是以行數(shù)為單位,適合Git。
2,文件.git和.svn區(qū)別1..svn目錄
隨便打開(kāi)一個(gè).svn的目錄可以看到結(jié)構(gòu):
如果無(wú)法查看.svn,window電腦-點(diǎn)擊查看-勾選隱藏文件;
mac直接shift + command + .

2..git 目錄結(jié)構(gòu)
你可能對(duì)這些目錄結(jié)構(gòu)很陌生,沒(méi)關(guān)系,直接在終端輸入 git help gitrepository-layout回車(chē),你會(huì)發(fā)現(xiàn)瀏覽器會(huì)打開(kāi)一個(gè)html文件,實(shí)際上就會(huì)打開(kāi)安裝git下面的一個(gè)html文檔

可以看出在處理代碼方面功能git比svn要強(qiáng)大一些
3,git文件動(dòng)態(tài)分析
3.1 add階段
1.執(zhí)行g(shù)it init會(huì)生成一個(gè)初始化的.git,會(huì)發(fā)現(xiàn)上面有些目錄文件沒(méi)有,因?yàn)橛行┪募侵付ǖ拿詈蟛艜?huì)生成2.新建一個(gè)test.txt,隨便寫(xiě)點(diǎn)內(nèi)容,執(zhí)行g(shù)it status

運(yùn)行 find . -type f

3.執(zhí)行 git add text.txt,顯示

運(yùn)行find . -type f

4.總結(jié):可以看出git add后test.txt 被標(biāo)記為staged 狀態(tài),而且object多了一個(gè)61/de0edff 文件,所以object 可以存貯git倉(cāng)庫(kù)內(nèi)容,以二進(jìn)制方式存貯。5.我們可以查看下文件來(lái)源

6.git如何管理和歸檔文件
我們常見(jiàn)的文件系統(tǒng)(NTFS、FAT、FAT32)是基于地址方式檢索文件,即先給具體的地址,然后從地址編號(hào)對(duì)應(yīng)的存儲(chǔ)單元讀取文件內(nèi)容,而git是基于內(nèi)容檢索,是對(duì)整個(gè)內(nèi)容檢索,得到一個(gè)真實(shí)的存儲(chǔ)位置,類(lèi)似哈希映射。(IT楓斗者怎么樣)
3.2 commit階段
1.執(zhí)行 git commit -m 'add test'

2.運(yùn)行 find . -type f

可以看出commit 后在add 的基礎(chǔ)上object多了兩個(gè)文件ed/fd7e90和26/ef8e8,從文件的歸檔路徑和命名可以看出git使用SHA-1算法對(duì)文件內(nèi)容進(jìn)行了校驗(yàn)。(IT楓斗者怎么樣)還多了一個(gè)COMMIT_EDITMSG ,里面是上一次提交的注釋信息3.使用git cat-file 查看來(lái)源

ed/fd7e90 是一個(gè)commit 對(duì)象,tree屬性指向了26/ef8e8,記錄了文件操作,作者,提交者信息;26/ef8e8 是一個(gè)tree 對(duì)象,blob 屬性指向了blob對(duì)象61/de0edf,記錄了文件名;61/de0edf 是一個(gè)blob 對(duì)象,記錄了文件內(nèi)容。三個(gè)文件關(guān)系:

為什么object文件會(huì)很大了吧。
3.3 branchgit branch?
獲取分支列表列表保存到refs/heads/master 下面
3.4 git對(duì)象模型
通過(guò)上面3.2的分析知道,在git系統(tǒng)中有四種對(duì)象:
commit:指向一個(gè)tree,記錄了文件操作,作者,提交者信息;
tree:對(duì)象關(guān)系樹(shù),管理tree和blob的關(guān)系;
blob:保存文件內(nèi)容;
tag:標(biāo)記提交。
3.5 git生命周期鉤子
鉤子初始化:上面說(shuō)到的hooks 下面都是生命周期腳本,初始化倉(cāng)庫(kù)(git init)或 git clone 都會(huì)初始化.git文件;
鉤子是本地的,因?yàn)椴粫?huì)提交到代碼倉(cāng)庫(kù),只不過(guò)clone的時(shí)候會(huì)初始化;
鉤子分類(lèi):
