為什么互聯(lián)網(wǎng)巨頭們紛紛使用Git而放棄SVN?
作者個(gè)人研發(fā)的在高并發(fā)場景下,提供的簡單、穩(wěn)定、可擴(kuò)展的延遲消息隊(duì)列框架,具有精準(zhǔn)的定時(shí)任務(wù)和延遲隊(duì)列處理功能。自開源半年多以來,已成功為十幾家中小型企業(yè)提供了精準(zhǔn)定時(shí)調(diào)度方案,經(jīng)受住了生產(chǎn)環(huán)境的考驗(yàn)。為使更多童鞋受益,現(xiàn)給出開源框架地址:https://github.com/sunshinelyz/mykit-delay
寫在前面
最近發(fā)現(xiàn)很多小伙伴對于工作中的一些基本工具的使用還不是很了解,比如:Git這個(gè)分布式的代碼管理倉庫,很多小伙伴就不是很了解,或者說不是很熟悉。甚至有些小伙伴都沒聽說過Git,就只會(huì)用個(gè)SVN。殊不知,當(dāng)今各大互聯(lián)網(wǎng)巨頭和新興起的互聯(lián)網(wǎng)黑馬公司,基本都是用的Git,而基本廢棄了對SVN的使用。為什么呢?我們一起往下看。
Git與SVN的區(qū)別
存儲方式不同
Git把內(nèi)容按元數(shù)據(jù)方式存儲類似k/v數(shù)據(jù)庫,而SVN是按文件(新版SVN已改成元數(shù)據(jù)存儲)
這里,我們給出一個(gè)簡單的Git使用示例。
- cd .git/objects/df/
- git cat-file -p df70460b4b4aece5915caf5c68d12f560a9de56e
- echo 'version1' > text.txt
- git hash-object -w text.txt
使用方式不同
從本地把文件推送遠(yuǎn)程服務(wù),SVN只需要commint 而Git需要 add、commint、push 三個(gè)步驟。
比如,我們使用下圖來模擬SVN的使用過程。
我們可以使用下圖來模擬Git的使用過程。
版本的管理模式不同
Git是一個(gè)分布式的版本管理系統(tǒng),而要SVN是一個(gè)遠(yuǎn)程集中式的管理系統(tǒng)。
例如,我們可以使用下圖來表示SVN的集中式管理。
我們可以使用下圖來表示Git的分布式管理。
Git核心命令總結(jié)
Git客戶端安裝
官方客戶端下載:https://git-scm.com/downloads
其他客戶端下載:https://tortoisegit.org/download/
Git命令的使用
(1)基于遠(yuǎn)程倉庫克隆至本地
- git clone <remote_url>
(2)當(dāng)前目錄初始化為git 本地倉庫
- git init <directory>
(3)基于mvn 模板創(chuàng)建項(xiàng)目
- mvn archetype:generate
本地添加
(1)添加指定文件至?xí)捍鎱^(qū)
- git add <fileName>
(2)添加指定目錄至?xí)捍鎱^(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)查看當(dāng)前分支
- git branch [-avv]
(2)基于當(dāng)前分支新建分支
- 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)解決沖突
如果因沖突導(dǎo)致自動(dòng)合并失敗,此時(shí) status 為mergeing 狀態(tài)。需要手動(dòng)修改后重新提交(commit)
遠(yuǎn)程倉庫管理
(1)查看遠(yuǎn)程配置
- git remote [-v]
(2)添加遠(yuǎn)程地址
- git remote add origin http:xxx.xxx
(3)刪除遠(yuǎn)程地址
- git remote remove origin
(4)上傳新分支至遠(yuǎn)程
- git push --set-upstream origin master
(5)將本地分支與遠(yuǎn)程建立關(guān)聯(lián)
- git branch --track --set-upstream-to=origin/test test
Tag管理
(1)查看當(dāng)前
- git tag
(2)創(chuàng)建分支
- git tag <tag name> <branch name>
(3)刪除分支
- git tag -d <tag name>
日志管理
(1)查看當(dāng)前分支下所有提交日志
- git log
(2)查看當(dāng)前分支下所有提交日志
- git log {branch}
(3)單行顯示日志
- git log --oneline
(4)比較兩個(gè)版本的區(qū)別
- git log master..experiment
(5)以圖表的方式顯示提交合并網(wǎng)絡(luò)
- git log --pretty=format:'%h %s' --graph
Git底層原理
GIT存儲對像(hashMap)
Git 是一個(gè)內(nèi)容尋址文件系統(tǒng),其核心部分是一個(gè)簡單的鍵值對數(shù)據(jù)庫(key-value data store),你可以向數(shù)據(jù)庫中插入任意內(nèi)容,它會(huì)返回一個(gè)用于取回該值的hash 鍵。
(1) Git 鍵值庫中插入數(shù)據(jù)
- echo 'binghe' | git hash-object -w --stdin 79362d07cf264f8078b489a47132afbc73f87b9a
(2)基于鍵獲取指定內(nèi)容
- git cat-file -p 79362d07cf264f8078b489a47132afbc73f87b9a
Git基于該功能 把每個(gè)文件的版本中內(nèi)容都保存在數(shù)據(jù)庫中,當(dāng)要進(jìn)行版本回滾的時(shí)候就通過其中一個(gè)鍵將其取回并替換。
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 其實(shí)就是把修改之后的內(nèi)容 插入到鍵值庫中。當(dāng)我們執(zhí)行 git add README.MF 等同于執(zhí)行了 git hash-object -w README.MF 把文件寫到數(shù)據(jù)庫中。
我們解決了存儲的問題,但其只能存儲內(nèi)容同并沒有存儲文件名,如果要進(jìn)行回滾 怎么知道哪個(gè)內(nèi)容對應(yīng)哪個(gè)文件呢?接下要我們就看下樹對象,它解決了文件名存儲的問題 。
Git樹對象
樹對像解決了文件名的問題,它的目的將多個(gè)文件名組織在一起,其內(nèi)包含多個(gè)文件名稱與其對應(yīng)的Key和其它樹對像的用引用,可以理解成操作系統(tǒng)當(dāng)中的文件夾,一個(gè)文件夾包含多個(gè)文件和多個(gè)其它文件夾。
每一個(gè)分支當(dāng)中都關(guān)聯(lián)了一個(gè)樹對像,他存儲了當(dāng)前分支下所有的文件名及對應(yīng)的 key。通過以下命令即可查看
- git cat-file -p master^{tree}
Git提交對象
一次提交即為當(dāng)前版本的一個(gè)快照,該快照就是通過提交對像保存,其存儲的內(nèi)容為:一個(gè)頂級樹對象、上一次提交的對像啥希、提交者用戶名及郵箱、提交時(shí)間戳、提交評論。
- $ git cat-file -p b2395925b5f1c12bf8cb9602f05fc8d580311836
- tree 002adb8152f7cd49f400a0480ef2d4c09b060c07
- parent 8be903f5e1046b851117a21cdc3c80bdcaf97570
- author binghe <binghe@gmail.com> 1532959457 +0800
- committer binghe <binghe@gmail.com> 1532959457 +0800
綜上,我們可以推測出從修改一個(gè)文件到提交的過程總共生成了三個(gè)對象:
- 一個(gè)內(nèi)容對象:存儲了文件內(nèi)容
- 一個(gè)樹對像:存儲了文件名及內(nèi)容對像的key
- 一個(gè)提交對像:存儲了樹對像的key 及提交評論。
Git引用
當(dāng)我們執(zhí)行 git branch {branchName} 時(shí)創(chuàng)建了一個(gè)分支,其本質(zhì)就是在git 基于指定提交創(chuàng)建了一個(gè)引用文件,保存在 .git\refs\heads\ 下。
(1)創(chuàng)建分支
- git branch dev
- cat.git\refs\heads\dev
Git總共 有三種類型的引用:
- 分支引用
- 遠(yuǎn)程分支引用
- 標(biāo)簽引用
(2)查詢比較兩個(gè)版本
- git log master..experiment
(3)版本提交歷史網(wǎng)絡(luò)
- git log --pretty=format:'%h %s' --graph
(4)查看分支樹
- git cat-file -p master^{tree}
本文轉(zhuǎn)載自微信公眾號「冰河技術(shù)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系冰河技術(shù)公眾號。