面試官:說說Git 中 HEAD、工作樹和索引之間的區(qū)別?
本文轉(zhuǎn)載自微信公眾號(hào)「JS每日一題」,作者灰灰。轉(zhuǎn)載本文請(qǐng)聯(lián)系JS每日一題公眾號(hào)。
一、HEAD
在git中,可以存在很多分支,其本質(zhì)上是一個(gè)指向commit對(duì)象的可變指針,而Head是一個(gè)特別的指針,是一個(gè)指向你正在工作中的本地分支的指針
簡(jiǎn)單來講,就是你現(xiàn)在在哪兒,HEAD 就指向哪兒
例如當(dāng)前我們處于master分支,所以HEAD這個(gè)指針指向了master分支指針
然后通過調(diào)用git checkout test切換到test分支,那么HEAD則指向test分支,如下圖:
但我們?cè)趖est分支再一次commit信息的時(shí)候,HEAD指針仍然指向了test分支指針,而test分支指針已經(jīng)指向了最新創(chuàng)建的提交,如下圖:
這個(gè)HEAD存儲(chǔ)的位置就在.git/HEAD目錄中,查看信息可以看到HEAD指向了另一個(gè)文件
- $ cat .git/HEAD
- ref: refs/heads/master
- $ cat .git/refs/heads/master
- 7406a10efcc169bbab17827aeda189aa20376f7f
這個(gè)文件的內(nèi)容是一串哈希碼,而這個(gè)哈希碼正是master分支上最新的提交所對(duì)應(yīng)的哈希碼
所以,當(dāng)我們切換分支的時(shí)候,HEAD指針通常指向我們所在的分支,當(dāng)我們?cè)谀硞€(gè)分支上創(chuàng)建新的提交時(shí),分支指針總是會(huì)指向當(dāng)前分支的最新提交
所以,HEAD指針 ——–> 分支指針 ——–> 最新提交
二、工作樹和索引
在Git管理下,大家實(shí)際操作的目錄被稱為工作樹,也就是工作區(qū)域
在數(shù)據(jù)庫(kù)和工作樹之間有索引,索引是為了向數(shù)據(jù)庫(kù)提交作準(zhǔn)備的區(qū)域,也被稱為暫存區(qū)域
Git在執(zhí)行提交的時(shí)候,不是直接將工作樹的狀態(tài)保存到數(shù)據(jù)庫(kù),而是將設(shè)置在中間索引區(qū)域的狀態(tài)保存到數(shù)據(jù)庫(kù)
因此,要提交文件,首先需要把文件加入到索引區(qū)域中。
所以,憑借中間的索引,可以避免工作樹中不必要的文件提交,還可以將文件修改內(nèi)容的一部分加入索引區(qū)域并提交
三、區(qū)別
從所在的位置來看:
- HEAD 指針通常指向我們所在的分支,當(dāng)我們?cè)谀硞€(gè)分支上創(chuàng)建新的提交時(shí),分支指針總是會(huì)指向當(dāng)前分支的最新提交
- 工作樹是查看和編輯的(源)文件的實(shí)際內(nèi)容
- 索引是放置你想要提交給 git倉(cāng)庫(kù)文件的地方,如工作樹的代碼通過 git add 則添加到 git 索引中,通過git commit 則將索引區(qū)域的文件提交到 git 倉(cāng)庫(kù)中
參考文獻(xiàn)
https://backlog.com/git-tutorial/cn/intro/intro1_4.html
https://juejin.cn/post/6844903598522908686
https://www.zsythink.net/archives/3412