5.1、概述
每一次提交,Git 都會生成相關的版本號;每個版本號由 40 位 16 進位制的數字組成。
這 40 位 16 進位制的數字,是根據提交的內容,透過 SHA-1 演算法計算出來的。
版本號具體還分為兩部分,前 2 位是目錄名,後 38 位是檔名。
5.2、檔案操作
5.2.1、初始化本地庫
如上圖所示,剛建立的 Git 本地倉庫沒有提交資訊,也沒有版本號。
5.2.2、新增檔案並提交
如上圖所示,新增檔案並提交後,透過 git reflog 命令可以查到對應的(精簡)提交版本號:7896eb8
注意:本文使用精簡的版本號演示,需要檢視完整的版本號,請參考3.9.2節
5.2.3、根據版本號查詢第一次提交的檔案
因為版本號的前 2 位是目錄名,後 38 位是檔名;所以可以快速定位出檔案所在的位置。
如上圖所示,直接開啟檔案時,內容是一堆亂碼。
git cat-file -p 版本號
如上圖所示,使用命令列指令才能讀取版本號對應的檔案內容。
可以看到,該檔案內容並沒有提交的檔案的內容資訊,但有另一個版本號。
如上圖所示,讀取上文發現的新版本號,還是沒有提交的檔案的內容資訊,但又有新的版本號,而且對應提交的檔案的名稱。
如上圖所示,讀取上文發現的新版本號,可以看到了提交的檔案的內容資訊。
5.2.4、第一次提交的版本號圖解
如上圖所示,提交日誌中的版本號所對應的檔案,包含的內容是狀態資訊的版本號;
狀態資訊的版本號所對應的檔案,包含的內容是本次提交版本的全部檔案的版本號。
5.2.5、修改檔案並提交
如上圖所示,修改檔案並提交後,透過 git reflog 命令可以查到對應的(精簡)提交版本號:774e05f
5.2.6、根據版本號查詢第二次提交的檔案
如上圖所示,根據第二次提交的版本號,可以查出本次提交的狀態資訊的版本號(tree)和上一次(即第一次)提交的版本號(parent)。
如上圖所示,根據狀態資訊的版本號,可以查出本次提交版本的全部檔案的版本號。
注意:修改後的a.txt檔案的版本號已經變了,沒有修改的b.txt檔案的版本號和原來的一樣。
如上圖所示,修改後的a.txt檔案的內容已經從“111”變為“333”了,沒有修改的b.txt檔案的內容還是原來的“222”。
5.2.7、第二次提交的版本號圖解
如上圖所示,所謂的修改檔案,實質是新增了一個版本號不同但名稱相同的檔案,然後再新增一個狀態版本用來記錄新的檔案版本號列表。
實際上,原來的檔案還存在,這也是為什麼能實現版本回退(穿梭)的原因。
5.2.8、刪除檔案並提交
如上圖所示,刪除檔案並提交後,透過 git reflog 命令可以查到對應的(精簡)提交版本號:a140418
5.2.9、根據版本號查詢第三次提交的檔案
如上圖所示,根據第三次提交的版本號,可以查出本次提交的狀態資訊的版本號(tree)和上一次(即第二次)提交的版本號(parent)。
如上圖所示,根據狀態資訊的版本號,可以查出本次提交版本的全部檔案的版本號。
注意:已刪除的b.txt檔案的版本號已經沒了,沒刪除的a.txt檔案的版本號還在。
5.2.10、第三次提交的版本號圖解
如上圖所示,所謂的刪除檔案,實質是新增一個狀態版本用來記錄新的檔案版本號列表。
實際上,原來的檔案還存在,這也是為什麼能實現版本回退(穿梭)的原因。
5.3、分支操作
5.3.1、HEAD檔案
HEAD檔案中,記錄了當前分支版本檔案(本例為 master 分支)的路徑。
5.3.2、master分支版本檔案
master分支版本檔案中,記錄了該分支的最新提交版本號。
5.3.3、master分支版本圖解
5.3.4、建立新分支user
如上圖所示,建立新分支user後,也多了一個分支版本檔案user。
如上圖所示,新建立的user分支版本檔案中記錄的該分支的最新提交版本號,和master分支版本檔案記錄的別無二致。
5.3.5、新建立的user分支版本圖解
5.3.6、切換到user新分支
如上圖所示,切換到user分支後,HEAD檔案中記錄的當前分支版本檔案的路徑是user分支版本檔案的路徑。
5.3.7、切換後的user分支版本圖解
5.3.8、user分支新增檔案並提交
如上圖所示,user分支新增檔案並提交後,user分支版本檔案中記錄的該分支的最新提交版本號,和master分支版本檔案記錄的不一樣了。
5.3.9、新增檔案後的user分支版本圖解
5.3.10、切換回master分支
如上圖所示,切換回master分支後,HEAD檔案中記錄的當前分支版本檔案的路徑是master分支版本檔案的路徑。
此外,master分支的工作目錄中,並沒有顯示在user分支時新增的c.txt檔案,說明在user分支的操作不會影響到master分支。