首頁 > 人文

為什麼網際網路巨頭們紛紛使用Git而放棄SVN?

由 Nodejs開發 發表于 人文2023-01-13

簡介MF 等同於執行了 git hash-object -w README

svn和git做什麼用的

作者:冰河 來源:冰河技術

為什麼網際網路巨頭們紛紛使用Git而放棄SVN?

作者個人研發的在高併發場景下,提供的簡單、穩定、可擴充套件的延遲訊息佇列框架,具有精準的定時任務和延遲佇列處理功能。自開源半年多以來,已成功為十幾家中小型企業提供了精準定時排程方案,經受住了生產環境的考驗。為使更多童鞋受益,現給出開源框架地址:https://github。com/sunshinelyz/mykit-delay

寫在前面

最近發現很多小夥伴對於工作中的一些基本工具的使用還不是很瞭解,比如:Git這個分散式的程式碼管理倉庫,很多小夥伴就不是很瞭解,或者說不是很熟悉。甚至有些小夥伴都沒聽說過Git,就只會用個SVN。殊不知,當今各大網際網路巨頭和新興起的網際網路黑馬公司,基本都是用的Git,而基本廢棄了對SVN的使用。為什麼呢?我們一起往下看。

Git與SVN的區別

儲存方式不同

Git把內容按元資料方式儲存類似k/v資料庫,而SVN是按檔案(新版SVN已改成元資料儲存)

這裡,我們給出一個簡單的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的使用過程。

為什麼網際網路巨頭們紛紛使用Git而放棄SVN?

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

為什麼網際網路巨頭們紛紛使用Git而放棄SVN?

版本的管理模式不同

Git是一個分散式的版本管理系統,而要SVN是一個遠端集中式的管理系統。

例如,我們可以使用下圖來表示SVN的集中式管理。

為什麼網際網路巨頭們紛紛使用Git而放棄SVN?

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

為什麼網際網路巨頭們紛紛使用Git而放棄SVN?

Git核心命令總結

Git客戶端安裝

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

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

Git命令的使用

(1)基於遠端倉庫克隆至本地

git clone

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

git init

(3)基於mvn 模板建立專案

mvn archetype:generate

本地新增

(1)新增指定檔案至暫存區

git add

(2)新增指定目錄至暫存區

git add

(3)新增所有

git add -A

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

git rm ——cached target -r

(5)新增忽略配置檔案 。gitignore

本地提交

(1)提交至本地倉庫

git commit file -m ‘提交的註釋資訊’

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

git commit -am ‘快捷新增與提交’

分支管理

(1)檢視當前分支

git branch [-avv]

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

git branch

(3)基於提交新建分支

git branch

$ git branch -d {dev}

(4)切換分支

git checkout

(5)合併分支

git merge

(6)解決衝突

如果因衝突導致自動合併失敗,此時 status 為mergeing 狀態。需要手動修改後重新提交(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)將本地分支與遠端建立關聯

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

Tag管理

(1)檢視當前

git tag

(2)建立分支

git tag

(3)刪除分支

git tag -d

日誌管理

(1)檢視當前分支下所有提交日誌

git log

(2)檢視當前分支下所有提交日誌

git log {branch}

(3)單行顯示日誌

git log ——oneline

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

git log master。。experiment

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

git log ——pretty=format:‘%h %s’ ——graph

Git底層原理

GIT儲存對

(hashMap)

Git 是一個內容定址檔案系統,其核心部分是一個簡單的鍵值對資料庫(key-value data store),你可以向資料庫中插入任意內容,它會返回一個用於取回該值的hash 鍵。

(1) Git 鍵值庫中插入資料

echo ‘binghe’ | git hash-object -w ——stdin 79362d07cf264f8078b489a47132afbc73f87b9a

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

git cat-file -p 79362d07cf264f8078b489a47132afbc73f87b9a

Git基於該功能 把每個檔案的版本中內容都儲存在資料庫中,當要進行版本回滾的時候就透過其中一個鍵將其取回並替換。

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 其實就是把修改之後的內容 插入到鍵值庫中。當我們執行 git add README。MF 等同於執行了 git hash-object -w README。MF 把檔案寫到資料庫中。

我們解決了儲存的問題,但其只能儲存內容同並沒有儲存檔名,如果要進行回滾 怎麼知道哪個內容對應哪個檔案呢?接下來我們就看下樹物件,它解決了檔名儲存的問題 。

Git樹物件

樹物件解決了檔名的問題,它的目的將多個檔名組織在一起,其內包含多個檔名稱與其對應的Key和其它樹物件的用引用,可以理解成作業系統當中的資料夾,一個資料夾包含多個檔案和多個其它資料夾。

每一個分支當中都關聯了一個樹物件,他儲存了當前分支下所有的檔名及對應的 key。透過以下命令即可檢視

git cat-file -p master^{tree}

Git提交物件

一次提交即為當前版本的一個快照,該快照就是透過提交對像儲存,其儲存的內容為:一個頂級樹物件、上一次提交的對像啥希、提交者使用者名稱及郵箱、提交時間戳、提交評論。

$ git cat-file -p b2395925b5f1c12bf8cb9602f05fc8d580311836

tree 002adb8152f7cd49f400a0480ef2d4c09b060c07

parent 8be903f5e1046b851117a21cdc3c80bdcaf97570

author binghe 1532959457 +0800

committer binghe 1532959457 +0800

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

一個內容物件:儲存了檔案內容

一個樹物件:儲存了檔名及內容對像的key

一個提交物件:儲存了樹對像的key 及提交評論。

Git引用

當我們執行 git branch {branchName} 時建立了一個分支,其本質就是在git 基於指定提交建立了一個引用檔案,儲存在 。git\refs\heads\ 下。

(1)建立分支

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}

Tags:git提交分支儲存