面試官:說說Git 中 HEAD、工作樹和索引之間的區別?
本文轉載自微信公眾號「JS每日一題」,作者灰灰。轉載本文請聯系JS每日一題公眾號。
一、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 倉庫中
參考文獻
https://backlog.com/git-tutorial/cn/intro/intro1_4.html
https://juejin.cn/post/6844903598522908686
https://www.zsythink.net/archives/3412