Git基本原理
一. git基礎
二.git原理
Ⅰ.git目錄
Ⅱgit對象
Git內部有四種對象,各種命令操作這四種對象,從而實現版本控制功能。
四種對象分別為:commit, tree, blob, tag
PS:tag對象可以暫時忽略
通過一個示例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目錄里。
示意圖如下:
PS:572dc,8a3ab等等,為這些對象的id,也是他們的Hash值。可以在.git\objects目錄里找到這些對象對應的文件。
綠色為commit對象
紫色為tree對象
紅色為blob對象
可以通過命令行,查看這些對象的內容:
commit對象:
tree對象:
demo目錄的tree對象:
src目錄tree對象:
java目錄tree對象:
lib目錄tree對象:
Blob對象:
readme.txt的blob對象:
Hello.java的blob對象:
resource.xml的blob對象:
rt.jar的blob對象:
PS:因為jar文件是二進制文件,因此此處為亂碼
第三步:
修改Helloword.java文件,然后git add,gitcommit。
此時會新生成一個Helloword.java的blob對象,java目錄tree對象,src目錄tree對象,demo目錄tree對象。
此時,git庫的內部示意圖如下:
PS:注意觀察各個方塊中的字符串變化。
只有Helloword.java,java,src,demo對應的ID值變化了,意味著他們指向了.git\objects文件夾里的其他文件了。
通過命令行,查看新增的這幾個對象的內容:
新commit對象的內容:
新demo目錄的tree對象內容:
新src目錄的tree對象內容:
新java目錄的tree對象內容:
新的Hello.java的blob對象的內容:
第四步:
如果我們做了很多修改,而且提交了很多git commit,那么上述示意圖可以簡化為:
再簡化:
每一個圓圈代表一個commit。
這就是分支圖的由來。
三. git分支
分支名,其實可以理解為java中的變量,他存儲著指向的commit的id。
PS:分支是如何記住它當前指向的commit的id呢?
其實分支指向的commit的id,都存儲在了.git\refs\heads中的分支同名文件中。
來自:http://my.oschina.net/sunchp/blog/346076