Git理解

工做原理 / 流程:git

 

 

 

 

1:git init初始化算法

  主要目錄說明緩存

  objects-存儲對象的目錄,本地倉庫,git中對象分爲三種:commit對象,tree對象(多叉樹),blob對象;文件都是blob對象,二進制存儲;spa

  Refs-存儲指向branch的最近一次commit對象的指針,也就是commit對象的sha-1值(就是hash值,sha-1是一種散列算法);.net

  HEAD文件-該文件表示當前本地簽出的分支;3d

  Index文件-存儲緩衝區(GitExtensions中的stage)的內容,內容包括它指向的文件的時間戳、文件名、sha1值等;(git三大區域:工做區,緩衝區,歷史記錄區)指針

2:git add * 指定文件寫入緩存區,生成Git對象日誌

  在objects目錄建立目錄和文件對象

  git是一套內容尋址系統,它是怎樣尋址的呢?blog

  Git從核心上來看不過是簡單地存儲鍵值對(key-value)(hashmap),大概結構以下:

  Key=sha-1(file header + file content)

  Value=壓縮(file content)

  Key是一個40位字符的校驗和,前2位做爲子目錄,後38位做爲文件名保存在子目錄下。

           

3:git cat-file -t 58c9 查看object的類型

  其中58是目錄,C9是文件名前兩位(58c9也可替換爲key(目錄+文件名)), 此時返回blob

4:git cat-file -p 58c9 查看文件內容

  返回文件內容信息,不包括文件名等其餘信息

5:git commit -m用於提交暫存區的文件;git commit -am用於提交跟蹤過的文件

  git commit -am提交已跟蹤過本地修改未執行add進入緩存區的文件=git add +git commit -m合併執行

       其中已跟蹤並修改的文件產生新的object

  提交後Git倉庫裏面object的類型發生變化,增長了其它目錄(tree commit兩種類型)可用第3點執行新的目錄和文件,一個是commit,一個是tree

  git cat-file -p 4caa查看tree類型的文件信息,從它儲存的內容來看能夠發現它儲存了一個目錄結構(相似於文件夾),以及每個文件(或者子文件夾)的權限、類型、對應的身份證(SHA1值)、以及文件名。

  

 

 

  此時的Git倉庫關係是tree-blob結構

 

   

 

   commit類型信息,它儲存的是一個提交的信息,包括對應目錄結構的快照tree的哈希值,上一個提交的哈希值  

            

 

   能夠理解爲commit是一次提交的根節點

  

 

  git add 在暫存區索引Index創建與blob object的連接關係

  git commit 根據索引區的連接信息建立commit-tree-blob的新連接關係,

  同時將版本指針指向新的連接關係,在commit記錄上一版本的key

 

 6:分支信息儲存-.git/refs/heads/master文件存儲最新commit的key地址

             

 

 7:Git的三個分區(工做目錄、Index 索引區域、Git倉庫)

  工做區:就是你在電腦裏能看到的目錄。

  版本庫:工做區有一個隱藏目錄.git,這個不算工做區,而是Git的版本庫,由Git object記錄着每一次提交的快照,以及鏈式結構記錄的提交變動歷史。

  暫存區:通常存放在 「.git目錄下」 下的index文件(.git/index)中,因此咱們把暫存區有時也叫做索引(index)這裏面的代碼會在下一次commit被提交到Git倉庫。。

  

 

   

經常使用命令:

  git log命令顯示從最近到最遠的顯示日誌

  git reset --hard HEAD^  回退到上一個版本,若是要回退到上上個版本只需把HEAD^ 改爲 HEAD^^ 以此類推。那若是要回退到前100個版本的話,使用上面的方法確定不方便,咱們可使用下面的簡便命令操做:git reset --hard HEAD~100 便可

  git reflog 查看提交記錄版本號

  git reset --hard 版本號退到指定版本

  git checkout -- 文件名 把在工做區中的文件作的修改所有撤銷(若是已commit則退回最後一個版本,若是add則從緩存區獲取)

  查看分支:git branch

  建立分支:git branch name

  切換分支:git checkout name

  建立+切換分支:git checkout –b name

  合併某分支到當前分支:git merge name

  刪除分支:git branch –d name

參考資料

  https://mp.weixin.qq.com/s/UQKrAR3zsdTRz8nFiLk2uQ

  https://blog.csdn.net/Miracle_Yan/article/details/80224839

  https://mp.weixin.qq.com/s/f1nQvj6tX4asH4l3uer6mw

     https://mp.weixin.qq.com/s/IDChhMK_BR1dUJemOnwv9Q

相關文章
相關標籤/搜索