15/19 本篇章節
第五篇 · 19 章
開始使用 Git
- 01 新增、初始 Repository
- 02 把檔案交給 Git 控管
- 03 工作區、暫存區與儲存庫
- 04 檢視紀錄
- 05 【狀況題】如何在 Git 裡刪除檔案或變更檔名?
- 06 【狀況題】修改 Commit 紀錄
- 07 【狀況題】追加檔案到最近一次的 Commit
- 08 【狀況題】新增目錄?
- 09 【狀況題】有些檔案我不想放在 Git 裡面...
- 10 【狀況題】檢視特定檔案的 Commit 紀錄
- 11 【狀況題】等等,這行程式誰寫的?
- 12 【狀況題】啊!不小心把檔案或目錄刪掉了…
- 13 【狀況題】剛才的 Commit 後悔了,想要拆掉重做…
- 14 【狀況題】不小心使用 hard 模式 Reset 了某個 Commit,救得回來嗎?
- 15 【冷知識】HEAD 是什麼東西?
- 16 【狀況題】可以只 Commit 一個檔案的部份的內容嗎?
- 17 【冷知識】那個長得很像亂碼 SHA-1 是怎麼算出來的?
- 18 【超冷知識】在 .git 目錄裡有什麼東西?Part 1 僅收錄於電子書
- 19 【超冷知識】在 .git 目錄裡有什麼東西?Part 2 僅收錄於電子書
第五篇 · 開始使用 Git
【冷知識】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 的內容會改變之外,在上個章節提到的 Reflog,當 HEAD 的內容改變的時候也會留下紀錄。