git的工作原理

1、git操作說明

git操作說明
  • 1、commit:對當(dāng)前操作目錄、資源文件、代碼等的一個快照
  • 2、diff:commit與commit之間的差異
  • 3、branch:分支--在一個commit之間進(jìn)行分開的時候
  • 4、merge:合并--兩個commit合并到一起
  • repository:倉庫--記錄上面四個操作的過程叫倉庫

Git與SVN的差別

svn存儲的是diff,這就意味著我們在當(dāng)前commit下,想要回到之前指定的某個commit,只能一個一個進(jìn)行回撤
git存儲的是整個快照commit,如果我們不對.git文件進(jìn)行處理,會導(dǎo)致.git文件越來越大

git工作流程

git工作流程

我們平時都是在workspace工作區(qū)中,然后通過git add提交到Index\Stage索引區(qū)、暫存區(qū),再通過git commit提交到Repository倉庫,倉庫再通過git push到遠(yuǎn)程倉庫,遠(yuǎn)程倉庫再通過pull或者fetch/clone -- > checkout到本地倉庫

git命令工作流程

git reset與git checkout命令

HEAD

HEAD是用來指向分支的最后一次提交
git reset:回退版本,可以指定退回到某次提交的版本
git reset --soft HEAD~1:回退到上次提交的暫存區(qū),不會改變當(dāng)前工作區(qū)
git reset HEAD .:移除當(dāng)前暫存區(qū)文件
git reset --hard HEAD~1:回退到上次提交的工作目錄,會改變當(dāng)前工作區(qū)
git checkout master:切換到master分支
git checkout -- .:重新存儲工作區(qū)文件到暫存區(qū)

Git key-value?件系統(tǒng)

我們在使用Git時會發(fā)現(xiàn)無法提交空目錄,那是因?yàn)樵贕it中是沒有目錄的概念,只有文件,使用過保存路徑來對應(yīng)相應(yīng)的文件
如果我們想提交一個空目錄,那我們可以在目錄下創(chuàng)建.gitkeep或者.keep文件,然后在項(xiàng)目的.gitignore中設(shè)置不忽略.gitkeep

我們在提交修改commit的時候,git會根據(jù)本次提交修改的文件的哈希值Key,修改的文件的壓縮版本為Value,通過樹結(jié)構(gòu)來存儲提交

Git Key-value

git hash-object:計(jì)算文件的哈希值作為key存到系統(tǒng)里,文件內(nèi)容作為value存放到.git目錄
git update-index:將文件計(jì)算出來的哈希值存儲到暫存區(qū)
git write-tree:將暫存區(qū)的內(nèi)容生成樹結(jié)構(gòu)(本質(zhì)上也是個哈希值),然后將樹結(jié)構(gòu)提交到commit tree

commit

.git目錄會存儲每次文件修改的壓縮版本和每次提交的commit信息的壓縮版本

Git對象存儲

Git將存儲對象的40位HASH分為兩部分:

    1. 頭兩位作為?件夾
    1. 后38位作為對象?件名 .git/objects/hash[:2]/hash[2:40]

為什么要這么設(shè)計(jì)?錄結(jié)構(gòu),?不直接使?40位hash作為?件名?

    1. 部分?件系統(tǒng)對?錄下的?件數(shù)量有限制。例如,F(xiàn)AT32限制單?錄下的最??件數(shù)量是65535個。
    1. 部分?件系統(tǒng)查找?件屬于線性查找,?錄下的?件越多,訪問越慢。

git init后的.git文件目錄如下圖所示

git init后的.git文件

git add ..git文件目錄如下圖所示
git add .

git cat-file -p打印哈希值對應(yīng)的信息
git cat-file -p

哈希值對應(yīng)的信息
文件信息

Git index?件

Git在 .git ?件夾下?存放了 index ?件,該?件表示Git stage 的內(nèi)
容。該?件是?進(jìn)制?件,保存了被stage的?件的所有信息,像inode信息、hash值等等

git status

index文件

hexdump

hexdump命令查看index文件二進(jìn)制數(shù)據(jù)信息

index二進(jìn)制數(shù)據(jù)信息

index二進(jìn)制數(shù)據(jù)信息搜索4f

git ls-files -s

git ls-files -s 查看暫存區(qū)的文件具體信息
100644對應(yīng)的是?個mode值,代表普通?件。在Git?,?個常?的mode值包括:

  • 100644 - 普通?件;
  • 100755 - 可執(zhí)??件;
  • 120000 - 符號鏈接(symbolic link);
  • 040000 - ?錄;
git ls-files -s

git hash-object

git hash-object:計(jì)算?個?件的git對象ID,即SHA1的哈希值
git hash-object -w:將指定對象(哈希值)寫?數(shù)據(jù)庫
當(dāng)文件內(nèi)容沒有改變,對應(yīng)的哈希值不會改變

git hash-object

git update-index

git update-index:將?作?錄的?件加?索引/暫存區(qū)域

git update-index

git write-tree

git write-tree:生成文件樹,本質(zhì)也是個哈希值,也是存放在.git/objects目錄下

git write-tree

git read-tree

git read-tree :將給出的樹寫?索引但不寫?暫存

git read-tree

git commit-tree

git commit-tree:將給出的樹提交到倉庫

遠(yuǎn)程倉庫

創(chuàng)建一個倉庫,就可以提交代碼到該倉庫

git init --bare

初始化git環(huán)境

git init

添加一個遠(yuǎn)程倉庫,可以添加多個remote

git remote add
添加遠(yuǎn)程倉庫

拉取遠(yuǎn)程代碼合并到本地倉庫

git pull
拉取代碼

提交本地代碼到遠(yuǎn)程倉庫

git push --set upstream origin master
提交代碼

當(dāng)遠(yuǎn)程的master沒有新的commit的時候,會將新提交的commit放到master分支最后,如果有新的commit會快速合并失敗報(bào)錯

快速合并

git mergetool打開圖形界面,解決合并沖突

git rebase并不是創(chuàng)建一個新的commit,而是將指定的一個分支放到另一個分支的結(jié)尾

git rebase origin/master
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容