#65 Git 練習網站介紹 — Learn Git Branching

在軟體開發的世界裡,程式碼是我們的創作媒介,而它的管理則是我們成功的關鍵。然而,Git 作為一個程式碼版本控制系統,一開始可能會令人感到困惑和不好懂。它有著複雜的概念和指令,對於新手來說可能會有一定的學習曲線。

不過幸運的是, Learn Git Branching 學習網站可以幫助我們克服這個困難。這個網站提供了互動式的學習環境,以一種類似於闖關遊戲的方式,讓我們透過 command line 視窗和 git 指令來學習 Git 的基本操作和概念,同時使用圖形化的方式呈現最終的結果。透過這種練習方式,我們可以在遊戲中慢慢感受 Git 的使用方法,讓學習過程更加生動有趣。

Learn Git Branching 提供了一系列的關卡,讓你一步步地學習 Git 的基本操作和概念。

基礎篇1: 介紹 git commit

每一關都有 git 指令的介紹及說明,讓你了解 commit 的作用和意義。

git commit

一個 commit 在 git repo 中會記錄目錄下所有文件的快照。感覺像是大量的複製和貼上,但 git 的速度更快!

git 希望 commit 儘可能地不占空間,所以每次進行 commit 的時候,它不會單純地複製整個目錄。實際上它把每次 commit 視為從目前的版本到下一個版本的變化量,或者說一個 “(delta)”。

git 會保存 commit 的歷史紀錄,所以,絕大部分的 commit 的上面都會有 parent commit,在我們的圖形表示中,箭頭方向表示從 parent commit 到所對應的 child commit,保存這樣子的一個歷史紀錄是非常有用的。

每一關一開始會有預設的節點,像這關一開始只有 C0 跟 C1 二個節點,你要執行一連串的 git 指令,來達到目標圖示的需求

左邊 command line 視窗

左邊是操作的 command line 視窗,跟平常使用的終端機視窗一樣,按 tab 可以完成後續的指令。

最終目標

按左上的顯示目標,可以看到最終目標的結果應該是如何

執行二次 git commit 後,可以看到 main 從 c1 指到 c3

完成關卡後,輸入 “levels” 嘗試其他關卡,或者輸入 “sandbox” 回到沙盒中

有時候在操作 Git 時,可以類比你在玩電腦遊戲時遇到的情況一樣。像是當你在遊戲中進行一系列的動作後,你可能會想要保存遊戲的進度,以防止遊戲因為某些原因而丟失了。這時你就會選擇存檔,這樣下次你再打開遊戲時,就可以從存檔的地方繼續遊戲。也許你想要試驗不同的結局,於是會有不同的存檔。而這個過程正好對應到 Git 的概念,每次的 commit 就像是遊戲的存檔一樣,記錄了程式碼的特定狀態,讓你隨時可以回溯到先前的某個版本。

基礎篇2:建立分支

學習如何建立和切換分支,這就像在電腦遊戲中建立不同的存檔一樣,讓你可以在不同的分支上進行實驗和開發。

建立一個叫 bugFix 的新的 branch,然後切換過去。

基礎篇3:branch 以及 merge

在這裡,我們有兩個 branch:各自都有一個唯一的 commit。這意味著沒有一個 branch 包含我們對文件的所有修改。讓我們 merge 這兩個 branch 來解決這個問題。

我們要 merge bugFixmain

git checkout bugFix
git merge main

題目說明:

解決步驟:

以此類推,透過一個個的案例,讓你了解 git 要解決的情境,及對應的指令用法,讓你有能力解決日常的 git 任務。

剩下就自行探索啦,附錄是我的練習筆記。

參考

【GIT 小教室】Learn Git Branching 攻略 — 主要篇 1/2 https://www.youtube.com/watch?v=NXSHZooBDn4

附錄

基礎篇4: rebase

$ git branch bugFix
$ git checkout bugFix
$ git commit
$ git checkout main
$ git commit
$ git checkout bugFix
$ git rebase main

在 Git 中,rebase 是一個常用的操作,用於將一個分支的提交歷史移動到另一個分支的頂端。這個操作可以讓你的提交歷史看起來更加線性,減少分支合併所產生的歷史分叉。

rebase 的過程是將一系列的提交應用到另一個分支上,然後重新擺放這些提交的順序,使得它們看起來彼此緊密相連,就像是在目標分支上進行連續的提交一樣。

使用 rebase 的主要優勢是可以保持提交歷史的乾淨和整潔,減少不必要的合併提交。這對於團隊協作和代碼審查來說非常重要,因為它使得提交歷史更整潔和有序,容易理解和維護。

不過需要小心的是,rebase 可能會改變提交的 SHA-1 值,因此在對已經共享的提交進行 rebase 操作時,需要小心使用,以避免對他人的工作產生影響。

進階篇1: 分離 HEAD, 在 git 中前後移動

checkout commit 的 hash 值

練習:$ git checkout C4

$ git checkout C4

在 Git 中,git checkout 命令用於切換分支或恢復文件。當你執行 git checkout <branch> 時,你會切換到指定的分支。但是,當你使用 git checkout <commit> 時,你將會分離 HEAD,也就是說你將處於一個“無分支”狀態,直接將 HEAD 指向特定的 commit。

在這個例子中,git checkout C4 的意思是切換到 commit C4,這將使 HEAD 指向該 commit,並將你的工作目錄和索引恢復到該 commit 的狀態。這樣做的結果是你將處於分離 HEAD 的狀態,你不再處於任何分支上,而是直接處於 commit C4 的歷史狀態。

在這種情況下,如果你進行任何修改並提交,將會創建一個新的分支,而不是在現有的分支上進行修改。這對於查看特定 commit 的狀態或者進行實驗性的更改是非常有用的。

總之,git checkout <commit> 命令用於將 HEAD 指向特定的 commit,這樣你就可以查看該 commit 的內容或進行相關操作。

進階篇2: hash 值 相對引用

git checkout main^

首先看看插入(^)這一個符號。把這個符號接在某一個 reference 後面,就表示你告訴 git 去找到該 reference 所指向的 commit 的 parent commit。

所以 main^ 相當於 "main 的 parent commit"。

main^^main 的 grandparent commit(往前推兩代)

切換到 main的 parent commit

練習: $ git checkout bugFix^

$ git checkout bugFix^

^ 符號和相對引用的使用可以更方便地導航和操作 Git 中的歷史記錄,這樣的用法有幾個優點:

  1. 快速導航: 有時候,你可能需要快速地移動到一個 commit 的 parent commit 或更早的 commit,而不必記住它們的具體哈希值。使用 ^ 符號可以使得這樣的導航更加容易和直觀。
  2. 提高可讀性: 相對引用提高了 Git 命令的可讀性。當你使用 ^ 符號時,它告訴你在引用之後的 commit 中向上移動一個層級。這樣的命名方式更容易理解和記憶,尤其是在處理複雜的 commit 歷史時。
  3. 方便比較: 在查看 commit 歷史時,相對引用可以讓你方便地比較不同 commit 之間的更改。例如,你可以使用 main^main^^ 來比較 main 分支的連續兩個 commit 之間的差異。

相對引用使得 Git 的操作更加直觀和便捷,特別是在導航和比較 commit 歷史時,不僅提高了 Git 操作的可讀性和可理解性,還使得我們在日常使用 Git 時更加高效和便捷,並降低了出錯的風險。

持續練習中

祝你也順利掌握 Git 的技巧!

--

--