用導航地圖比喻理解 Git 的 Commit 與 reset 操作邏輯
更新日期: 2024 年 12 月 22 日
本文為 Git 提交拆解案例探討,第 2 篇:
- 如何將一個分支上的多項功能代碼分離到不同分支
- 用導航地圖比喻理解 Git 的 Commit 與 reset 操作邏輯 👈 所在位置
- 初學者指南:如何使用 git cherry-pick 挑選特定提交
- Git 推送失敗的解決方案:non-fast-forward 問題指南
對於初學者來說,Git 的一些操作方式可能會顯得複雜,例如 git reset --hard
或分支之間的提交共享。
本文將用導航地圖和地點標記的生活類比來解釋,讓你輕鬆理解 Git 是如何管理提交和分支的。
Git 的核心概念
提交(Commit)是地圖上的地點
在 Git 中,每個提交就像地圖上的一個地點,比如「餐廳A」或「商場B」。
每個地點都有唯一的編號(提交的哈希值,如 a789012
)。
- 提交是固定的:一旦創建,它的位置(內容)不會改變,除非被刪除。
- 地點之間有路徑連接:提交記錄之間有順序,就像地點之間有路徑。
分支(Branch)是地圖上的標記
分支就像地圖上的一個標記,可以指向一個特定的地點。
- 分支只是一個「指針」,指向一個提交(地點)。
- 你可以移動分支指針來標記不同的提交。
生活場景:如何使用分支標記不同的提交
問題場景
假設你有以下兩個提交:
a789012
:搜尋結果頁代碼(餐廳A)b123456
:收藏模型代碼(商場B)
目前,分支 issues/40
指向「商場B」,我們希望:
- 創建分支
issues/31
,用於標記「餐廳A」。 - 保持
issues/40
不變。
操作分解
切換分支,移動標記到目標地點
初始狀態
地點:
a789012:餐廳A(搜尋結果頁代碼)
b123456:商場B(收藏模型代碼)
分支標記:
issues/40 -> 商場B
issues/31 -> (尚未標記)
操作步驟
- 創建並切換到
issues/31
:
git branch issues/31
git switch issues/31
- 使用
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
簡單總結
- 提交是全局的地點:
- 提交是固定存在的,任何分支都可以引用。
- 分支是標記:
- 分支可以自由地標記地點,通過移動指針來變更狀態。
git reset --hard
:- 移動分支指針到指定提交。
- 同步你的環境到提交的狀態。
通過這種地圖和標記的比喻,希望你能更輕鬆地掌握 Git 的操作邏輯。如果還有其他不理解的地方,隨時提問!