跳到主內容

【Git】head, tag, commit, branch的關係

這是一個非常關鍵的 Git 理解核心:
HEADtagcommitbranch 彼此的關係
我幫你用「定義 + 關聯圖 + 對照表 + 比喻」完整整理如下:


✅ 一張圖:理解 Git 中 HEAD、分支、Tag、Commit 的關係

          HEAD
            ↓
        ┌────────┐
        │ branch │──┐
        └────────┘  │
                    ↓
         ┌────────────────┐
         │     commit     │◄──┐
         └────────────────┘   │
                  ▲          │
        ┌─────────┴──────┐   │
        │     another     │  │
        │     branch      │  │
        └─────────────────┘  │
                             │
                        ┌─────────┐
                        │  tag    │──► 同樣也指向 commit
                        └─────────┘

🧠 核心定義

名稱 定義說明
commit Git 的基本單位,是一個「版本快照」,有父子連結,不會變動
branch 指向某個 commit 的「可移動指標」,像捷徑,可以新增、移動
HEAD 代表你目前工作的「游標」,通常指向一個分支(或直接指向 commit)
tag 指向某個 commit 的「不可變名稱」(常用來標記版本,如 v1.0.0

🔗 它們的關係總結

關係 說明
branchcommit 分支就是指向某個 commit 的「指標」
HEADbranch or commit HEAD 是你「目前所在的位置」,可以指向分支或直接指向 commit(detached HEAD)
tagcommit Tag 永遠指向某個 commit,是不可變的
commit 之間 commit 是鏈狀連結(每個有一個 parent commit)

📁 類比說明(像檔案系統)

Git 概念 類比 說明
commit 檔案版本 是實際的內容快照(不可變)
branch 資料夾捷徑 可以移動、可以新建、可以切換
HEAD 滑鼠游標 你目前的編輯焦點(在哪個捷徑/檔案上)
tag 唯一標籤貼紙 永久貼在某個版本上,表示這是一個重要的版本點

📌 補充:變動性比較

元件 是否可變動 常見操作
commit ❌ 不可變 一旦建立就不會改變
branch ✅ 可變動 可以移動、刪除、重新建立
tag ✅ 可刪除(內容不可變) 可以刪除再重建,但本身是不可移動的指標
HEAD ✅ 一直在動 跟著你切換分支、commit 而變動

✅ 常見操作對應關係

操作說明 HEAD 變動 branch 變動 commit 變動 tag 變動
git switch dev
git commit ✅(會跟著 HEAD 一起動) ✅(新增)
git reset --hard HEAD^ ✅(可能丟失)
git tag v1.0
git checkout <commit> ✅(分離)
git switch -c new-feature ✅(新建)

✅ 總結一句話:

  • commit 是內容

  • branch/tag 是「名字」,用來指向某個 commit

  • HEAD 是「你目前在哪裡」,通常跟著分支動,也可以離開分支進入 detached 狀態