Git Merge 的基本觀念和使用方式

在第一篇 什麼是 Git?為什麼軟體工程師一定要會? 中,我們介紹了基本的 git 功能。

在這一篇中,我們要來介紹一個學 git 就一定要會的技能:git merge!

我們會從什麼是 git merge 開始說起,接著討論實際例子,以及該如何處理合併衝突,最後討論到不同種類的 merge。

什麼是 git merge

如果有好好讀上一章的人,一定都很熟悉分支 branch 的概念。

其實 git merge 的概念非常簡單,就是合併兩個分支。

這個用途在大型合作專案上非常有用,因為每個人可以各自負責不同的子項目,等到某個子項目完成後,再合併到主要項目中。

範例

簡單 git merge

這邊我們來講一個簡單的範例,來看看該如何執行一般的 merge。

建立 feature branch

首先,我們先來建立一個新的分支,我們把它叫做 feature。

git checkout -b feature
新增檔案

接著,我們在這個 feature branch 上做一點修改,這邊我們來新增一個叫做 test.txt 的檔案,並新增一個 commit。

echo "Test" >> test.txt
git add test.txt
git commit -m "add test.txt"
合併回主分支

最後,我們要將這個修改回併回 main branch。

我們首先需要先切換回 main branch,在執行合併。

git checkout main
git merge feature

成功合併的話,就會看到類似這樣的訊息啦!

Updating 1701820..87e5d54
Fast-forward
 test.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt

處理衝突

今天假設,在我們在 feature branch 建立 test.txt 的同時,有人在 main branch 上同時也建立了一份 test.txt

這樣一來,當我們在合併分支時,git 就會不知道到底哪一個才是應該要接受的版本。

因此,git 就會回報「衝突」,讓我們開發者自己去解決。

如果有衝突發生,我們會看到類似這樣的輸出:

Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.

我們可以打開我們最喜歡的編輯器,我自己個人是 VS Code。

然後就可以看到這樣的畫面:

我們可以利用編輯器選擇想要哪一個分支上的版本,這麼做非常直觀。

接著,我們要為解決完成的衝突建立一個新的 commit。

git add test.txt
git commit -m "fixed merge conflicts"

這樣一來就完成啦!

不同種類的 git merge

其實,merge 有三種不同的種類,分別是:

  1. Fast-forward Merge
  2. Three-way Merge
  3. Squash Merge

我們一個一個來看看這些彼此之間有什麼差別。

Fast-forward Merge

假設我們有一個分支叫做 feature,這個分支是從 main 分支出來的。

再假設今天我們在 feature branch 上完成了工作,想要 merge 回 main branch 時,這時候如果 main branch 上沒有新的 commit,那麼 git 會簡單地將指標移動到 feature 的最前端。

這種 merge 通常會發生在目標分支沒有發生分歧時。

用這樣的圖示幫助你們更好理解:

我們可以看到,執行了 git merge 後,原本在 main 分支上的指標直接移動到 feature 分支上最新的 commit(橘色 -> 綠色)。

因為是直接向前移,因此大家叫他 fast-forward merge。

Three-way Merge

和第一種 merge 不同的地方在於,main branch 現在和 feature branch 有了分歧(C3)。

這種時候,如果我們合併兩個分支,那麼 git 就會幫我們多創造一個 commit(C6),用來處理合併。

而這種 merge 也是最常見的 merge 種類,因為通常在你做事的同時,別人也在做事。

Squash Merge

其實,merge 只要搞懂前面兩種差不多就行了。

第三種的 merge,基本上只是用來把雜亂的 commit 歷史給處理乾淨。

Squash merge 會將 feature branch 的 commit 全部打包起來變成一個 commit,然後再和 main branch 合併。

這種 merge 在我們希望將 feature branch 的所有 commit 合併為單一 commit 時非常有用,這樣可以更輕鬆地追蹤和搜尋所做的變更。

結尾

這樣我們就介紹完 git merge 啦!

這個功能是每個學 git 的人都一定一定要會的技能!

如果你說你會 git 但你不會使用 git merge 合併分支,或是處理衝突,那你一定會被笑的!

那這篇文章就到這裡啦~

以後我們還會再繼續介紹更多和 git 有關的知識和技術!

有學到東西的話歡迎給五星評價喔!