Git基本原理

jopen 10年前發布 | 25K 次閱讀 Git 版本控制系統

一. git基礎


Git基本原理

二.git原理

.git目錄

Git基本原理

git對象

Git內部有四種對象,各種命令操作這四種對象,從而實現版本控制功能。

四種對象分別為:commit, tree, blob, tag

PS:tag對象可以暫時忽略

 通過一個示例git項目,可以清楚看到這四種對象的意義。

示例項目目錄結構:

Git基本原理

demo目錄為根文件夾,src,lib,java為文件夾,Hello.java,resourc.xml,rt.jar,readme.txt為文件。


第一步:

在demo目錄下,git init ,使demo目錄成為一個git項目。此時,在demo目錄下,生成.git目錄。


第二步:

git add , git commit 。將demo下所有文件提交commit。

此時git生成了一個commit對象,demo,src,java,lib四個tree對象,hello.java,resource.xml,rt.jar,readme.txt四個blob對象。

這些對象都是經過git處理的二進制文件,都存放在.git\objects目錄里。


示意圖如下:

Git基本原理

PS:572dc,8a3ab等等,為這些對象的id,也是他們的Hash值。可以在.git\objects目錄里找到這些對象對應的文件。

綠色為commit對象

紫色為tree對象

紅色為blob對象


可以通過命令行,查看這些對象的內容:

commit對象:

Git基本原理

tree對象:

demo目錄的tree對象:

Git基本原理

src目錄tree對象:

Git基本原理

java目錄tree對象:

Git基本原理

lib目錄tree對象:

Git基本原理

Blob對象:

readme.txt的blob對象:

Git基本原理

Hello.java的blob對象:

Git基本原理

resource.xmlblob對象:

Git基本原理

rt.jarblob對象:

Git基本原理

PS:因為jar文件是二進制文件,因此此處為亂碼


第三步:

修改Helloword.java文件,然后git add,gitcommit。

此時會新生成一個Helloword.java的blob對象,java目錄tree對象,src目錄tree對象,demo目錄tree對象。

此時,git庫的內部示意圖如下:

Git基本原理

PS:注意觀察各個方塊中的字符串變化。

只有Helloword.java,java,src,demo對應的ID值變化了,意味著他們指向了.git\objects文件夾里的其他文件了。


通過命令行,查看新增的這幾個對象的內容:

commit對象的內容:

Git基本原理

demo目錄的tree對象內容:

Git基本原理

src目錄的tree對象內容:

Git基本原理

java目錄的tree對象內容:

Git基本原理

新的Hello.javablob對象的內容:

Git基本原理


第四步:

如果我們做了很多修改,而且提交了很多git commit,那么上述示意圖可以簡化為:

Git基本原理

再簡化:

Git基本原理

每一個圓圈代表一個commit

這就是分支圖的由來。

三. git分支

Git基本原理

分支名,其實可以理解為java中的變量,他存儲著指向的commit的id。

PS:分支是如何記住它當前指向的commit的id呢?

其實分支指向的commit的id,都存儲在了.git\refs\heads中的分支同名文件中。


來自:http://my.oschina.net/sunchp/blog/346076

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!