#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 bugFix
到 main
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 中的歷史記錄,這樣的用法有幾個優點:
- 快速導航: 有時候,你可能需要快速地移動到一個 commit 的 parent commit 或更早的 commit,而不必記住它們的具體哈希值。使用
^
符號可以使得這樣的導航更加容易和直觀。 - 提高可讀性: 相對引用提高了 Git 命令的可讀性。當你使用
^
符號時,它告訴你在引用之後的 commit 中向上移動一個層級。這樣的命名方式更容易理解和記憶,尤其是在處理複雜的 commit 歷史時。 - 方便比較: 在查看 commit 歷史時,相對引用可以讓你方便地比較不同 commit 之間的更改。例如,你可以使用
main^
和main^^
來比較main
分支的連續兩個 commit 之間的差異。
相對引用使得 Git 的操作更加直觀和便捷,特別是在導航和比較 commit 歷史時,不僅提高了 Git 操作的可讀性和可理解性,還使得我們在日常使用 Git 時更加高效和便捷,並降低了出錯的風險。
持續練習中
祝你也順利掌握 Git 的技巧!