Ry 的 Git 教學
一份全面的 Git 版本控制指南,從基本的工作流程(如暫存和提交)出發,逐步深入至進階主題,包括互動式重基、遠端協作,以及 Git 物件資料庫內部機制的剖析。
課程總覽
📚 內容概要
一本全面的 Git 版本控制指南,從基本的工作流程(如暫存與提交)逐步深入至高階主題,包括互動式重基、遠端協作,以及 Git 物件資料庫的內部機制。
從指令到核心內部,全面掌握全球最流行的版本控制系統。
作者: Ryan Hodson
致謝: 前言中未明確提及任何致謝對象。
🎯 學習目標
- 比較並對比本地、集中式與分散式版本控制系統。
- 了解為何因應 Linux 核心開發需求而創建 Git。
- 完成基本 Git 設定,包括安裝驗證、倉儲初始化與檔案追蹤。
- 初始化 Git 倉儲,並識別
.git目錄的角色。 - 設定全域使用者設定,並使用暫存區追蹤專案檔案。
- 執行提交以建立專案快照,並透過倉儲歷史檢視成果。
- 使用提交 ID 定位特定歷史版本,並返回目前專案狀態。
- 建立與管理帶註解的標籤,以標示穩定的發布版本。
- 使用
git revert撤銷特定已提交的變更,同時維持清晰透明的歷史記錄。 - 使用 Git CLI 來識別、建立與切換分支。
🔹 第一課:版本控制的歷史與基礎
概述: 本課追溯版本控制從手動檔案管理演進至複雜分散式系統的歷程。詳細說明本地、集中式與分散式版本控制系統(VCS)之間的架構差異,並解釋促使 Git 為 Linux 核心而誕生的具體歷史背景。學員將學習安裝 Git 及初始化第一個倉儲的基礎步驟。
學習成果:
- 比較並對比本地、集中式與分散式版本控制系統。
- 了解為何因應 Linux 核心開發需求而創建 Git。
- 完成基本 Git 設定,包括安裝驗證、倉儲初始化與檔案追蹤。
🔹 第二課:掌握基礎:暫存與提交
概述: 本課介紹 Git 倉儲的基礎生命週期,從標準專案資料夾轉化為受版本控制的環境。學員將學習如何初始化倉儲、設定使用者身分、追蹤新檔案,並管理變更從暫存區轉移到永久提交歷史的過程。
學習成果:
- 初始化 Git 倉儲,並識別
.git目錄的角色。 - 設定全域使用者設定,並使用暫存區追蹤專案檔案。
- 執行提交以建立專案快照,並透過倉儲歷史檢視結果。
🔹 第三課:還原變更與瀏覽歷史
概述: 本課介紹在倉儲中進行時間旅行的核心 Git 技巧,讓開發者得以檢視過去狀態、標記里程碑,並安全地還原錯誤。學員將精通於在不造成永久變更的情況下檢視舊版修訂,使用帶註解的標籤標示發行版本,並區分還原已提交歷史與清除尚未提交的實驗性工作。
學習成果:
- 使用提交 ID 定位特定歷史版本,並返回目前專案狀態。
- 建立與管理帶註解的標籤,以標示穩定的發行版本。
- 使用
git revert撤銷特定已提交的變更,同時維持透明的歷史記錄。
🔹 第四課:基本分支與合併操作
概述: 本課探討 Git 分支的基本生命週期,從概念上的獨立開發線,到實際執行。學員將學習如何建立、導航與可視化分叉的專案歷史,最終透過快速前進合併(fast-forward merge)與三方合併(3-way merge)整合工作,並清理臨時分支。
學習成果:
- 使用 Git CLI 來識別、建立與切換分支。
- 解讀分叉專案歷史圖表,理解
master分支與功能分支之間的關係。 - 執行並區分「快速前進」合併與「三方」合併。
🔹 第五課:進階分支與衝突解決
概述: 本課探討因專案歷史分歧所必需的進階 Git 操作。內容涵蓋三方合併的理論機制、使用 -a 選項簡化提交的實用技巧,以及長時間運作的功能分支管理。學員將學習如何處理複雜的分支互動、手動解決合併衝突,並透過正確的分支清理維持倉儲整潔。
學習成果:
- 解釋快速前進合併與三方合併之間的結構差異。
- 使用
-a選項將暫存與提交動作合併於已追蹤的檔案上。 - 透過解析 Git 衝突標記,識別並解決合併衝突。
🔹 第六課:以重基維持線性專案歷史
概述: 本課介紹維持乾淨、線性專案歷史的技術,包括移動與壓縮提交。學員將掌握從分歧分支轉換為統一時間軸的方法,使用標準重基、互動式重基(合併小提交)及過程中修改特定提交的能力。完成本模組後,學員將理解如何消除不必要的合併提交,呈現專業且精簡的提交日誌。
學習成果:
- 將功能分支的基礎移動至另一分支的最新版本,以支援快速前進合併。
- 使用互動式重基將多個小提交壓縮為單一有意義的快照。
- 在重基過程中使用
edit與--amend功能修改既有提交。
🔹 第七課:改寫歷史與 Reflog 的安全性
概述: 本課探討維持乾淨專業專案歷史的進階 Git 技巧。學員將掌握「互動式重基」以改寫過去提交,學習精確的流程將一般提交拆解為細微更新,並利用「Reflog」作為強大的安全網,恢復看似遺失的資料。
學習成果:
- 執行互動式重基,以修改、編輯或拆分歷史提交。
- 使用
git reset --mixed將單一一般提交拆解為多個獨立且有意義的提交。 - 使用 Git Reflog 找出並復活不再連結至分支的「懸空提交」。
🔹 第八課:透過推送與取得進行協作
概述: 本課探討多人協作在 Git 中的基本工作流程。你將學習如何建立獨立的倉儲複本、設定本地身分以模擬不同使用者,並建立「遠端」連接以交換程式碼。課程重點在於理解如何在倉儲間拉取資料(fetch)與推送資料(push),以同步開發進度。
學習成果:
- 複製與設定: 成功複製倉儲並設定本地層級的使用者配置。
- 同步遠端: 新增遠端書籤,並使用
fetch與merge整合其他開發者的變更。 - 管理遠端狀態: 导航遠端分支,並理解當檢視非本地代碼時的「脫離頭指針」(detached HEAD)狀態。
🔹 第九課:集中式共用倉儲模型
概述: 本課探討從點對點倉儲共享轉向集中式工作流程的過渡。學員將學習如何建立「裸倉儲」作為溝通中心,重新配置遠端以適應團隊環境,並管理多個開發者之間的變更同步(推送與拉取),以維持一致的專案歷史。
學習成果:
- 初始化並設定裸倉儲,作為中央伺服器。
- 管理遠端連接,將本地工作流程導向集中式中心。
- 執行標準化工作流程,以更新共用內容並使用 fetch、rebase 與 merge 來解決分歧歷史。
🔹 第十課:分散式整合者模型
概述: 本課探討從集中式版本控制轉向使用 Bitbucket 作為主機平台的分散式整合者模型。學員將從設定公開倉儲開始,逐步掌握一個複雜的工作流程:由「整合者」審查並合併來自同儕開發者公開倉儲的貢獻,進而形成官方專案版本。
學習成果:
- 設定 Bitbucket 帳戶,並建立公開遠端倉儲以進行分散式協作。
- 透過管理多個遠端,執行「整合者工作流程」,包含取得、審查與合併外部貢獻。
- 在團隊開發者之間維持私密本地環境與公開面向倉儲的同步。
🔹 第十一課:基於補丁的溝通與工作流程
概述: 本課介紹基於補丁的協作生命周期,這是一種在無需共用中央倉儲的情況下,讓開發者分享單一提交的方法。學員將學習如何從本地提交產生補丁檔案,透過電子郵件傳遞,並將收到的補丁整合至專案主分支。
學習成果:
- 使用
git format-patch從特定提交或分支產生單一補丁檔案。 - 使用
git am命令與標準輸入重定向,將外部補丁檔案套用至本地倉儲。 - 執行完整的整合工作流程,包含在暫時分支上測試補丁,並合併至主分支。
🔹 第十二課:Git 工具、鉤子與進階差異比較
概述: 本課介紹重要的 Git 工具命令與進階倉儲管理的自訂技巧。學員將學習如何透過歸檔與封包來匯出與分享倉儲,使用 .gitignore 與 stash 保持工作空間乾淨,透過 Git 鉤子自動化工作流程,並利用進階差異比較與自訂別名優化命令列體驗。
學習成果:
- 区分並執行倉儲匯出:歸檔(無歷史)與封包(完整歷史)。
- 設定檔案排除規則,並管理暫時性的進行中變更。
- 在 Git 内部鉤子系統中實現自動化腳本,並使用設定別名簡化工作流程。
🔹 第十三課:Git 水管系統:內部物件資料庫
概述: 本課深入探討 Git 友善的「瓷器」命令之下,其「水管」——低階物件資料庫。你將學習 Git 如何使用四種不同的物件類型(資料塊、樹狀結構、提交與標籤)與 SHA-1 檢核值來記錄專案歷史。完成此模組後,你將理解如何手動操作索引與物件資料庫,在不使用標準高階介面的情況下建立提交。
學習成果:
- 定義並區分 Git 的四種物件類型:資料塊(Blobs)、樹狀結構(Trees)、提交(Commits)與標籤(Tags)。
- 解釋 HEAD 與分支參考在指向特定提交物件中的角色。
- 示範「水管」工作流程:手動暫存檔案、撰寫樹狀結構,並建立提交物件。