用導航地圖比喻理解 Git 的 Commit 與 reset 操作邏輯

更新日期: 2024 年 12 月 22 日

本文為 Git 提交拆解案例探討,第 2 篇

  1. 如何將一個分支上的多項功能代碼分離到不同分支
  2. 用導航地圖比喻理解 Git 的 Commit 與 reset 操作邏輯 👈 所在位置
  3. 初學者指南:如何使用 git cherry-pick 挑選特定提交
  4. Git 推送失敗的解決方案:non-fast-forward 問題指南

對於初學者來說,Git 的一些操作方式可能會顯得複雜,例如 git reset --hard 或分支之間的提交共享。

本文將用導航地圖和地點標記的生活類比來解釋,讓你輕鬆理解 Git 是如何管理提交和分支的。


Git 的核心概念

提交(Commit)是地圖上的地點

在 Git 中,每個提交就像地圖上的一個地點,比如「餐廳A」或「商場B」。

每個地點都有唯一的編號(提交的哈希值,如 a789012)。

  • 提交是固定的:一旦創建,它的位置(內容)不會改變,除非被刪除。
  • 地點之間有路徑連接:提交記錄之間有順序,就像地點之間有路徑。

分支(Branch)是地圖上的標記

分支就像地圖上的一個標記,可以指向一個特定的地點。

  • 分支只是一個「指針」,指向一個提交(地點)。
  • 你可以移動分支指針來標記不同的提交。

生活場景:如何使用分支標記不同的提交

問題場景

假設你有以下兩個提交:

  1. a789012:搜尋結果頁代碼(餐廳A)
  2. b123456:收藏模型代碼(商場B)

目前,分支 issues/40 指向「商場B」,我們希望:

  • 創建分支 issues/31,用於標記「餐廳A」。
  • 保持 issues/40 不變。

操作分解

切換分支,移動標記到目標地點

初始狀態

地點:
  a789012:餐廳A(搜尋結果頁代碼)
  b123456:商場B(收藏模型代碼)

分支標記:
  issues/40 -> 商場B
  issues/31 -> (尚未標記)

操作步驟

  1. 創建並切換到 issues/31
git branch issues/31
git switch issues/31
  1. 使用 git reset --hard 移動 issues/31 的標記到餐廳A:
git reset --hard a789012

結果

分支標記:
  issues/40 -> 商場B
  issues/31 -> 餐廳A

此時,issues/31 指向搜尋結果頁代碼的提交(a789012)。

為什麼提交可以共享?

Git 的特性

在 Git 中:

  • 提交是全局可見的:只要提交存在於本地,任何分支都可以引用它。
  • 分支只是指針:分支不保存提交,它只指向一個提交。

類比

想像提交是地圖上的地點:

  • 餐廳A(a789012)和商場B(b123456)都存在於地圖上。
  • 無論是哪個分支「發現」了這些地點,其他分支都可以標記它們。

git reset --hard 的作用

移動分支指針

git reset --hard 的作用是移動當前分支的指針,並同步你的工作目錄:

  • 移動分支指針:將當前分支標記到指定的提交。
  • 同步環境:清理你的工作目錄和暫存區,讓它們的內容與目標提交一致。

操作效果

執行 git reset --hard a789012,會讓分支指向 a789012 並丟棄其他未保存的改動。

使用示意圖理解流程

初始狀態

地點:
  a789012:餐廳A(搜尋結果頁代碼)
  b123456:商場B(收藏模型代碼)

分支:
  issues/40 -> 商場B
  issues/31 -> (尚未標記)

執行 git reset --hard

地點:
  a789012:餐廳A(搜尋結果頁代碼)
  b123456:商場B(收藏模型代碼)

分支:
  issues/40 -> 商場B
  issues/31 -> 餐廳A

簡單總結

  1. 提交是全局的地點
    • 提交是固定存在的,任何分支都可以引用。
  2. 分支是標記
    • 分支可以自由地標記地點,通過移動指針來變更狀態。
  3. git reset --hard
    • 移動分支指針到指定提交。
    • 同步你的環境到提交的狀態。

通過這種地圖和標記的比喻,希望你能更輕鬆地掌握 Git 的操作邏輯。如果還有其他不理解的地方,隨時提問!

Similar Posts