分支的概念其實就跟 從自己做版控來學 Git 這篇文章很相似。我們可以用「資料夾」來模擬 Git 在建立每一個 commit 時的動作,我們也可以用「資料夾」來模擬建立分支的動作。
這個做法雖然聽起來很奇妙,但真的很好理解。
建立分支
首先,你先把每一個 branch 想成是一個資料夾。
在一開始 git init 的時候會建立一個 master 資料夾(代表 master 分支):
1 | -- master(主分支) |
此時你在 master 分支上做了一些 commit 後,可能會想要開一個新的分支,假設叫做「new_feature」。所以現在你有兩個分支的資料夾:
1 | -- master(主分支) |
接著是重點,假設 new_feature 是在 master_commit2 時新開的分支。這個時候 new_feature 就會有當時 master_commit1 跟 master_commit2 的檔案。(因為它要延續前面的版本接下去做,所以它就必須要有這個時候的所有檔案)
你也可以想成是把 master 中的所有檔案複製到 new_feature 這個資料夾中:
1 | -- master(主分支) |
接著 new_feature 就可以在這條分支上繼續新增自己的 commit:
1 | -- new_feature(新的分支) |
如果到這邊你都理解的話,那恭喜你,你已經理解分支的概念是什麼了,其實就是原本的 commit 資料夾外面再多一層資料夾的概念而已。
master 資料夾(分支)中會有自己專屬的 commit 資料夾;new_feature 資料夾(分支)也會有自己專屬的 commit 資料夾。
合併分支
接著要講解合併分支的情況。
沿用前面的例子,現在當 new_feature 分支上的事情做完後,你就用不到這條分支了,所以你可以把它「接回去」原本的分支(master)。
比較直覺的想法是把在 new_feature 中新增的 commit 直接接回去 master 分支上,像這樣:
1 | -- master(主分支) |
看不懂的話可以思考一下這個流程:
- new_feature 是從 master_commit2 長出來的,所以在那之前的 commit 內容理論上應該都會相同,我不需要管它們。
- 我要做的就是把在 master_commit2 之後的 new_feature_commit 都接回去 master 上。
我知道你也許會問:「阿如果 master 上也有新的 commit3、commit4 的話勒?」。
這種時候可能就會引發「衝突(conflict)」,也就是 兩個分支都改到同一個檔案 的情況,但那是之後會再討論的事,現在只要先理解這個比較單純的狀況就行了。
總結
按照慣例我們來複習一下:
- 每個分支都可以當成是一個資料夾
- 建立新的分支,可以想成是把原本分支上的檔案複製到新的分支上
- 每個分支上的 commit 彼此之間互不相干
- 把 A 分支合併到 B 分支,等於是把在 A 分支新增的 commit 接回去 B 分支的 commit 上