寫在前面
最近發現很多小夥伴對於工作中的一些基本工具的使用還不是很瞭解,比如: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的使用過程。
版本的管理模式不同
Git是一個分散式的版本管理系統,而要SVN是一個遠端集中式的管理系統。
例如,我們可以使用下圖來表示SVN的集中式管理。
我們可以使用下圖來表示Git的分散式管理。
Git核心命令總結
Git客戶端安裝
官方客戶端下載:https://git-scm.com/downloads
其他客戶端下載:https://tortoisegit.org/download/
Git命令的使用
(1)基於遠端倉庫克隆至本地
git clone <remote_url>
(2)當前目錄初始化為git 本地倉庫
git init <directory>
(3)基於mvn 模板建立專案
mvn archetype:generate
本地新增
(1)新增指定檔案至暫存區
git add <fileName>
(2)新增指定目錄至暫存區
git add <directory>
(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 <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 狀態。需要手動修改後重新提交(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 <tag name> <branch name>
(3)刪除分支
git tag -d <tag name>
日誌管理
(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 <binghe@gmail.com> 1532959457 +0800
committer binghe <binghe@gmail.com> 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}
重磅福利
關注「 冰河技術 」微信公眾號,後臺回覆 “設計模式” 關鍵字領取《深入淺出Java 23種設計模式》PDF文件。回覆“Java8”關鍵字領取《Java8新特性教程》PDF文件。回覆“限流”關鍵字獲取《億級流量下的分散式限流解決方案》PDF文件,三本PDF均是由冰河原創並整理的超硬核教程,面試必備!!
好了,今天就聊到這兒吧!別忘了點個贊,給個在看和轉發,讓更多的人看到,一起學習,一起進步!!
寫在最後
如果你覺得冰河寫的還不錯,請微信搜尋並關注「 冰河技術 」微信公眾號,跟冰河學習高併發、分散式、微服務、大資料、網際網路和雲原生技術,「 冰河技術 」微信公眾號更新了大量技術專題,每一篇技術文章乾貨滿滿!不少讀者已經通過閱讀「 冰河技術 」微信公眾號文章,吊打面試官,成功跳槽到大廠;也有不少讀者實現了技術上的飛躍,成為公司的技術骨幹!如果你也想像他們一樣提升自己的能力,實現技術能力的飛躍,進大廠,升職加薪,那就關注「 冰河技術 」微信公眾號吧,每天更新超硬核技術乾貨,讓你對如何提升技術能力不再迷茫!