為什么互聯(lián)網巨頭們紛紛使用Git而放棄SVN?(內含Git核心命令與原理總結)

寫在前面

最近發(fā)現(xiàn)很多小伙伴對于工作中的一些基本工具的使用還不是很了解雳灾,比如:Git這個分布式的代碼管理倉庫漠酿,很多小伙伴就不是很了解,或者說不是很熟悉谎亩。甚至有些小伙伴都沒聽說過Git记靡,就只會用個SVN谈竿。殊不知,當今各大互聯(lián)網巨頭和新興起的互聯(lián)網黑馬公司摸吠,基本都是用的Git,而基本廢棄了對SVN的使用嚎花。為什么呢寸痢?我們一起往下看。

Git與SVN的區(qū)別

存儲方式不同

Git把內容按元數(shù)據方式存儲類似k/v數(shù)據庫紊选,而SVN是按文件(新版SVN已改成元數(shù)據存儲)

這里啼止,我們給出一個簡單的Git使用示例。

cd .git/objects/df/
git cat-file -p df70460b4b4aece5915caf5c68d12f560a9de56e
echo 'version1' > text.txt
git hash-object -w text.txt

使用方式不同

從本地把文件推送遠程服務兵罢,SVN只需要commint 而Git需要 add献烦、commint、push 三個步驟卖词。

比如巩那,我們使用下圖來模擬SVN的使用過程。

image

我們可以使用下圖來模擬Git的使用過程此蜈。

image

版本的管理模式不同

Git是一個分布式的版本管理系統(tǒng)即横,而要SVN是一個遠程集中式的管理系統(tǒng)。

我們可以使用下圖來表示Git的分布式管理裆赵。

image

Git核心命令總結

Git客戶端安裝

官方客戶端下載:https://git-scm.com/downloads

其他客戶端下載:https://tortoisegit.org/download/

Git命令的使用

(1)基于遠程倉庫克隆至本地

git clone <remote_url>

(2)當前目錄初始化為git 本地倉庫

git init  <directory>

(3)基于mvn 模板創(chuàng)建項目

mvn archetype:generate

本地添加

(1)添加指定文件至暫存區(qū)

git add <fileName>

(2)添加指定目錄至暫存區(qū)

git add <directory>

(3)添加所有

git add -A

(4)將指定目錄及子目錄移除出暫存區(qū)

git rm --cached target -r

(5)添加勿略配置文件 .gitignore

本地提交

(1)提交至本地倉庫

git commit file -m '提交的注釋信息'

(2)快捷提交至本地倉庫

git commit -am '快捷添加與提交'

分支管理

(1)查看當前分支

git branch [-avv]

(2)基于當前分支新建分支

git branch <branch name>

(3)基于提交新建分支

git branch <branch name> <commit id>
$ git branch -d {dev}

(4)切換分支

git checkout <branch name>

(5)合并分支

git merge <merge target>

(6)解決沖突

如果因沖突導致自動合并失敗东囚,此時 status 為mergeing 狀態(tài)。需要手動修改后重新提交(commit)

遠程倉庫管理

(1)查看遠程配置

git remote [-v]

(2)添加遠程地址

git remote add origin http:xxx.xxx

(3)刪除遠程地址

git remote remove origin 

(4)上傳新分支至遠程

git push --set-upstream origin master 

(5)將本地分支與遠程建立關聯(lián)

git branch --track --set-upstream-to=origin/test test

Tag管理

(1)查看當前

git tag

(2)創(chuàng)建分支

git tag <tag name> <branch name>

(3)刪除分支

git tag -d <tag name>

日志管理

(1)查看當前分支下所有提交日志

git log

(2)查看當前分支下所有提交日志

git log {branch}

(3)單行顯示日志

git log --oneline

(4)比較兩個版本的區(qū)別

git log master..experiment

(5)以圖表的方式顯示提交合并網絡

git log --pretty=format:'%h %s' --graph

Git底層原理

GIT存儲對像(hashMap)

Git 是一個內容尋址文件系統(tǒng)战授,其核心部分是一個簡單的鍵值對數(shù)據庫(key-value data store)页藻,你可以向數(shù)據庫中插入任意內容,它會返回一個用于取回該值的hash 鍵植兰。

(1) Git 鍵值庫中插入數(shù)據

echo 'binghe' | git hash-object -w --stdin 79362d07cf264f8078b489a47132afbc73f87b9a

(2)基于鍵獲取指定內容

git cat-file -p 79362d07cf264f8078b489a47132afbc73f87b9a

Git基于該功能 把每個文件的版本中內容都保存在數(shù)據庫中份帐,當要進行版本回滾的時候就通過其中一個鍵將期取回并替換。

Git版本寫入與回滾過程

(1)查找所有的git 對像

 find .git/objects/ -type f

(2)寫入版本1

echo 'version1' > README.MF; git hash-object -w README.MF;

(3)寫入版本2

echo 'version2' > README.MF; git hash-object -w README.MF;

(4)寫入版本3

echo 'version3' > README.MF; git hash-object -w README.MF;

(5)回滾指定版本

git cat-file -p c11e96db44f7f3bc4c608aa7d7cd9ba4ab25066e > README.MF

所以我們平常用的 git add 其實就是把修改之后的內容 插入到鍵值庫中钉跷。當我們執(zhí)行 git add README.MF 等同于執(zhí)行了 git hash-object -w README.MF 把文件寫到數(shù)據庫中弥鹦。

我們解決了存儲的問題,但其只能存儲內容同并沒有存儲文件名爷辙,如果要進行回滾 怎么知道哪個內容對應哪個文件呢彬坏?接下要我們就看下樹對象,它解決了文件名存儲的問題 膝晾。

Git樹對象

樹對像解決了文件名的問題栓始,它的目的將多個文件名組織在一起,其內包含多個文件名稱與其對應的Key和其它樹對像的用引用血当,可以理解成操作系統(tǒng)當中的文件夾幻赚,一個文件夾包含多個文件和多個其它文件夾禀忆。

每一個分支當中都關聯(lián)了一個樹對像,他存儲了當前分支下所有的文件名及對應的 key落恼。通過以下命令即可查看

 git cat-file -p master^{tree} 

Git提交對象

一次提交即為當前版本的一個快照箩退,該快照就是通過提交對像保存,其存儲的內容為:一個頂級樹對象佳谦、上一次提交的對像啥希戴涝、提交者用戶名及郵箱、提交時間戳钻蔑、提交評論啥刻。

$ git cat-file -p b2395925b5f1c12bf8cb9602f05fc8d580311836 
tree 002adb8152f7cd49f400a0480ef2d4c09b060c07 
parent 8be903f5e1046b851117a21cdc3c80bdcaf97570 
author binghe <binghe@gmail.com> 1532959457 +0800 
committer binghe <binghe@gmail.com> 1532959457 +0800 

綜上,我們可以推測出從修改一個文件到提交的過程總共生成了三個對象:

  • 一個內容對象:存儲了文件內容
  • 一個樹對像:存儲了文件名及內容對像的key
  • 一個提交對像:存儲了樹對像的key 及提交評論咪笑。

Git引用

當我們執(zhí)行 git branch {branchName} 時創(chuàng)建了一個分支可帽,其本質就是在git 基于指定提交創(chuàng)建了一個引用文件,保存在 .git\refs\heads\ 下窗怒。

(1)創(chuàng)建分支

 git branch dev 
 cat.git\refs\heads\dev

Git總共 有三種類型的引用:

  • 分支引用
  • 遠程分支引用
  • 標簽引用

(2)查詢比較兩個版本

 git log master..experiment

(3)版本提交歷史網絡

git log --pretty=format:'%h %s' --graph

(4)查看分支樹

git cat-file -p master^{tree}

好了映跟,今天就聊到這兒吧!別忘了點個贊兜粘,給個在看和轉發(fā)申窘,讓更多的人看到,一起學習孔轴,一起進步L攴ā!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末路鹰,一起剝皮案震驚了整個濱河市贷洲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晋柱,老刑警劉巖优构,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雁竞,居然都是意外死亡钦椭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門碑诉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彪腔,“玉大人,你說我怎么就攤上這事进栽〉抡酰” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵快毛,是天一觀的道長格嗅。 經常有香客問我番挺,道長,這世上最難降的妖魔是什么屯掖? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任玄柏,我火速辦了婚禮,結果婚禮上贴铜,老公的妹妹穿的比我還像新娘禁荸。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布校读。 她就那樣靜靜地躺著谈宛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪每聪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音灾挨,去河邊找鬼。 笑死竹宋,一個胖子當著我的面吹牛劳澄,可吹牛的內容都是我干的。 我是一名探鬼主播蜈七,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼秒拔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了飒硅?” 一聲冷哼從身側響起砂缩,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎三娩,沒想到半個月后庵芭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡雀监,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年双吆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片会前。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡好乐,死狀恐怖,靈堂內的尸體忽然破棺而出回官,到底是詐尸還是另有隱情曹宴,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布歉提,位于F島的核電站笛坦,受9級特大地震影響区转,放射性物質發(fā)生泄漏。R本人自食惡果不足惜版扩,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一废离、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧礁芦,春花似錦蜻韭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至未状,卻和暖如春俯画,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背司草。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工艰垂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人埋虹。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓猜憎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親搔课。 傳聞我的和親對象是個殘疾皇子胰柑,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內容