一、HEAD
在git
中,可以存在很多分支,其本質上是一個指向commit
對象的可變指針,而Head
是一個特別的指針,是一個指向你正在工作中的本地分支的指針
簡單來講,就是你現在在哪兒,HEAD 就指向哪兒
例如當前我們處於master
分支,所以HEAD
這個指針指向了master
分支指
然后通過調用git checkout test
切換到test
分支,那么HEAD
則指向test
分支,如下圖:
但我們在test
分支再一次commit
信息的時候,HEAD
指針仍然指向了test
分支指針,而test
分支指針已經指向了最新創建的提交,如下圖:
這個HEAD
存儲的位置就在.git/HEAD
目錄中,查看信息可以看到HEAD
指向了另一個文件
$ cat .git/HEAD ref: refs/heads/master $ cat .git/refs/heads/master 7406a10efcc169bbab17827aeda189aa20376f7f
這個文件的內容是一串哈希碼,而這個哈希碼正是master
分支上最新的提交所對應的哈希碼
所以,當我們切換分支的時候,HEAD
指針通常指向我們所在的分支,當我們在某個分支上創建新的提交時,分支指針總是會指向當前分支的最新提交
所以,HEAD指針 ——–> 分支指針 ——–> 最新提交
二、工作樹和索引
在Git
管理下,大家實際操作的目錄被稱為工作樹,也就是工作區域
在數據庫和工作樹之間有索引,索引是為了向數據庫提交作准備的區域,也被稱為暫存區域
Git
在執行提交的時候,不是直接將工作樹的狀態保存到數據庫,而是將設置在中間索引區域的狀態保存到數據庫
因此,要提交文件,首先需要把文件加入到索引區域中。
所以,憑借中間的索引,可以避免工作樹中不必要的文件提交,還可以將文件修改內容的一部分加入索引區域並提交
三、區別
從所在的位置來看:
-
HEAD 指針通常指向我們所在的分支,當我們在某個分支上創建新的提交時,分支指針總是會指向當前分支的最新提交
-
工作樹是查看和編輯的(源)文件的實際內容
-
索引是放置你想要提交給 git倉庫文件的地方,如工作樹的代碼通過 git add 則添加到 git 索引中,通過git commit 則將索引區域的文件提交到 git 倉庫中