【Git】head, tag, commit, branch的關係
這是一個非常關鍵的 Git 理解核心:HEAD
、tag
、commit
、branch
彼此的關係。
我幫你用「定義 + 關聯圖 + 對照表 + 比喻」完整整理如下:
✅ 一張圖:理解 Git 中 HEAD、分支、Tag、Commit 的關係
HEAD
↓
┌────────┐
│ branch │──┐
└────────┘ │
↓
┌────────────────┐
│ commit │◄──┐
└────────────────┘ │
▲ │
┌─────────┴──────┐ │
│ another │ │
│ branch │ │
└─────────────────┘ │
│
┌─────────┐
│ tag │──► 同樣也指向 commit
└─────────┘
🧠 核心定義
名稱 | 定義說明 |
---|---|
commit | Git 的基本單位,是一個「版本快照」,有父子連結,不會變動 |
branch | 指向某個 commit 的「可移動指標」,像捷徑,可以新增、移動 |
HEAD | 代表你目前工作的「游標」,通常指向一個分支(或直接指向 commit) |
tag | 指向某個 commit 的「不可變名稱」(常用來標記版本,如 v1.0.0 ) |
🔗 它們的關係總結
關係 | 說明 |
---|---|
branch ➝ commit |
分支就是指向某個 commit 的「指標」 |
HEAD ➝ branch or commit |
HEAD 是你「目前所在的位置」,可以指向分支或直接指向 commit(detached HEAD) |
tag ➝ commit |
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 狀態