← 上一章:【狀況題】不小心使用 hard 模式 Reset 了某個 Commit,救得回來嗎? 下一章:【狀況題】可以只 Commit 一個檔案的部份的內容嗎? →


【冷知識】HEAD 是什麼東西?

HEAD 是一個指標,指向某一個分支,通常你可以把 HEAD 當做「目前所在分支」看待。在 .git 目錄裡有一個檔名為 HEAD 的檔案,就是記錄著 HEAD 的內容,來看一下這東西長什麼樣子:

$ cat .git/HEAD
ref: refs/heads/master

從這個檔案看起來,HEAD 目前正指向著 master 分支。如果有興趣再深入看一下 refs/heads/master 的內容就會發現,其實所謂的 Master 分支也不過就是一個 40 個字元的檔案罷了:

$ cat .git/refs/heads/master
e12d8ef0e8b9deae8bf115c5ce51dbc2e09c8904

切換分支的時候…

假設目前我這個專案包括 master 共有三個分支,而目前正在 master 分支上:

$ git branch
cat
dog
* master

接下來我們試著切換分支到 cat 分支:

$ git checkout cat
Switched to branch 'cat'

這時候來看一下剛剛那個 HEAD 檔案的內容:

$ cat .git/HEAD
ref: refs/heads/cat

HEAD 的內容變成 refs/heads/cat 了。再試著切到 dog 分支看看:

$ git checkout dog
Switched to branch 'dog'

再確認一下 HEAD 的內容:

$ cat .git/HEAD
ref: refs/heads/dog

它又改成指到 dog 分支了。也就是說,HEAD 通常會指向目前所在的分支。不過 HEAD 也不一定總是會指向某個分支,當 HEAD 沒有指向某個分支的時候便會造成「detached HEAD」的狀態,詳情請參閱「【冷知識】斷頭(detached HEAD)是怎麼一回事?」章節說明。

而在 SourceTree 的介面裡,HEAD 是以一個「空心的小圈圈」圖示呈現:

head

在切換分支的同時,除了 HEAD 的內容會改變之外,在上個章節提到的 Reflog,當 HEAD 的內容改變的時候也會留下紀錄。


← 上一章:【狀況題】不小心使用 hard 模式 Reset 了某個 Commit,救得回來嗎? 下一章:【狀況題】可以只 Commit 一個檔案的部份的內容嗎? →

Comments