Git基本原理總結

2021-09-23 18:23:33 字數 3474 閱讀 5073

本質上,git是一套內容定址(content-addressable)檔案系統,而和我們直接接觸的git介面,只不過是封裝在其之上的乙個應用層。這個關係頗有點類似於計算機網路中應用層和下屬層的關係。在git中,那些和應用層相關的命令(也就是我們最常用的命令,如git commit、 git push等),我們稱之為porcelain命令(瓷器之意,意為成品、高階命令);而和底層相關的命令(幾乎不會在日常中使用,如git hash-object、git update-index等),則稱之為plumbing命令(管道之意,是連線git應用介面和git底層實現的乙個管道,類似於shell,底層命令)。要了解git的底層原理,就需要了解git是如何利用底層命令來實現高層命令的。在此之前,讓我們先來看一下git的目錄結構,和各個檔案在git中的作用。

在作業系統中,我們的倉庫就是乙個資料夾。但是為什麼這些資料夾就是git倉庫呢?這是因為git在初始化的時候會生成乙個.git的資料夾,而git進行版本控制所需要的檔案,則都放在這個資料夾中。在桌面上新建乙個目錄,然後利用命令列在該目錄下執行git init命令即可完成git倉庫的初始化。如果這個時候你看不到.git目錄,這是因為你的作業系統自動隱藏了該資料夾,需要在系統設定中設定隱藏檔案可見。進入.git目錄,便可以看到其中有很多的檔案和資料夾,這每乙個檔案都有各自的作用,下面結合圖1來進行說明。

圖1 .git目錄結構示意圖

在上圖中,第一排的幾個檔案和資料夾是git的核心,而第二排的則是一些不需要特別關注的。核心檔案包括:config檔案、objects資料夾、head檔案、index檔案以及refs資料夾。下面依次對其進行說明。

config檔案:該檔案主要記錄針對該項目的一些配置資訊,例如是否以bare方式初始化、remote的資訊等,通過git remote add命令增加的遠端分支的資訊就儲存在這裡;

objects資料夾:該資料夾主要包含git物件。關於什麼是git物件,將會在下一節進行詳細介紹。git中的檔案和一些操作都會以git物件來儲存,git物件分為blob、tree和commit三種型別,例如git commit便是git中的commit物件,而各個版本之間是通過版本樹來組織的,比如當前的head會指向某個commit物件,而該commit物件又會指向幾個blob物件或者tree物件。objects資料夾中會包含很多的子資料夾,其中git物件儲存在以其sha-1值的前兩位為子資料夾、後38位位檔名的檔案中;除此以外,git為了節省儲存物件所占用的磁碟空間,會定期對git物件進行壓縮和打包,其中pack資料夾用於儲存打包壓縮的物件,而info資料夾用於從打包的檔案中查詢git物件;

head檔案:該檔案指明了git branch(即當前分支)的結果,比如當前分支是master,則該檔案就會指向master,但是並不是儲存乙個master字串,而是分支在refs中的表示,例如ref: refs/heads/master。

index檔案:該檔案儲存了暫存區域的資訊。該檔案某種程度就是緩衝區(staging area),內容包括它指向的檔案的時間戳、檔名、sha1值等;

refs資料夾:該資料夾儲存指向資料(分支)的提交物件的指標。其中heads資料夾儲存本地每乙個分支最近一次commit的sha-1值(也就是commit物件的sha-1值),每個分支乙個檔案;remotes資料夾則記錄你最後一次和每乙個遠端倉庫的通訊,git會把你最後一次推送到這個remote的每個分支的值都記錄在這個資料夾中;tag資料夾則是分支的別名,這裡不需要對其有過多的了解;

git的核心是它的物件資料庫,其中儲存著git的物件,其中最重要的是blob、tree和commit物件,

blob物件實現了對檔案內容的記錄,

tree物件實現了對檔名、檔案目錄結構的記錄,

commit物件實現了對版本提交時間、版本作者、版本序列、版本說明等附加資訊的記錄。

這三類物件,完美實現了git的基礎功能:對版本狀態的記錄。

git引用是指向git物件hash鍵值的類似指標的檔案。通過git引用,我們可以更加方便的定位到某一版本的提交。git分支、tags等功能都是基於git引用實現的。

分支的目的是讓我們可以並行的進行開發。比如我們當前正在開發功能,但是需要修復乙個緊急bug,我們不可能在這個專案正在修改的狀態下修復 bug,因為這樣會引入更多的bug。有了分支的概念,我們就可以新建乙個分支,修復 bug,使新功能與 bug 修復同步進行。

git跟傳統的**管理器(如:svn)不同, 主要區別在於git多了個本地倉庫以及快取區,所以即使無法聯網也一樣能提交**。術語解釋:

工作區間:即我們建立的工程檔案, 在編輯器可直觀顯示;

快取區:只能通過git gui或git shell 視窗顯示,提交**、解決衝突的中轉站;

本地倉庫:只能在git shell 視窗顯示,連線本地**跟遠端**的樞紐,不能聯網時本地**可先提交至該處;

接下來, 我們以三個實際操作的例子講解git的日常,**如何在上述4個區域流動。

當你理解rebase是什麼的時候,最重要的就是什麼時候 不能 用rebase。git rebase的**法則便是,絕不要在公共的分支上使用它。

比如說,如果你在develop分支上,rebase到你的feature分支上會發生什麼:

這次rebase將develop分支上的所有提交都移到了feature分支後面。問題是它只發生在你的**倉庫中,其他所有的開發者還在原來的develop上工作。因為rebase引起了新的提交,git會認為你的develop分支和其他人的develop已經分叉了。

同步兩個develop分支的唯一辦法是把它們merge到一起,導致乙個額外的合併提交和兩堆包含同樣更改的提交。不用說,這會讓人非常困惑。

所以重要的再強調一遍,絕不要在公共的分支上使用它。在你執行git rebase之前,一定要問問你自己「有沒有別人正在這個分支上工作?」。如果答案是肯定的,重新找到乙個無害的方式(如git revert)來提交你的更改。不然的話,你可以隨心所欲地重寫歷史。

Git 基本原理

一 雜湊 雜湊是乙個系列的加密演算法,各個不同的雜湊演算法雖然加密強度不同,但是有以下幾個共同點 不管輸入資料的資料量有多大,使用同乙個雜湊演算法,得到的加密結果長度固定 雜湊演算法確定,輸入資料確定,輸出結果保證不變 雜湊演算法確定,輸入資料有變化,輸出結果一定有變化,而且通常變化很大 雜湊演算法...

Git基本原理

學習git的基本原理有利於理解git命令背後的執行原理,需要將腦子裡面之前關於其他版本管理工具比如cvs subversion perforce的知識暫時忘掉,因為它們與git的使用是不太相同的 其他版本工具比如vcs認為它們儲存的資訊是由一系列的檔案組成,以及每個檔案上做出的改動,git儲存資料時...

git筆記 基本原理

git是乙個分布式版本控制工具。乙個git專案有三個部分組成 工作目錄,本地倉庫和遠端倉庫。其中工作目錄和本地倉庫都在本地磁碟上,遠端倉庫一般可以理解為另一台電腦上的倉庫。工作目錄 就是被git管理的那些檔案 本地倉庫 主要包含兩部分 乙個commit樹,和一系列指向commit樹的指標。commi...