← 上一章:合併分支 下一章:【常見問題】合併過的分支要留著嗎? →


【狀況題】為什麼我的分支都沒有「小耳朵」?

我看別人的合併都會有小耳朵耶,為什麼我的都沒有?

這裡指的「小耳朵」是指在合併的時候產生的線圖:

merge graph

不是每次的合併都要這麼複雜的…

以上圖這個例子來說,其實會有這個線圖也是不得已的,cat 分支跟 dog 分支雖是本是同根生,但後來已各自長大、分家了,所以最後要合併回來的時候,Git 就會做出一個額外的 Commit 記錄來自是來自哪兩個 Commit。

再看看這個例子:

merge graph

cat 分支是從 master 分支切出去的,目前領先 master 兩次 Commit。如果這時候回到 master 並且合併 cat 分支,Git 會發現「其實你是從我這邊出去的啊,除了這兩個新的 Commit 之外的東西我都有了」,所以 Git 就會自動選用「快轉模式(Fast Forward)」來進行合併:

$ git merge cat
Updating e12d8ef..b174a5a
Fast-forward
 cat1.html | 0
 cat2.html | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 cat1.html
 create mode 100644 cat2.html

你有注意到上面這段訊息裡也有提到「Fast-forward」字樣嗎?這個所謂的「快轉」模式合併,其實就是把 master 這張貼紙撕起來,然後往前貼到 cat 分支所指的那個 Commit 而已:

merge graph

這種快轉模式的合併不會有額外的線圖出現(也就是小耳朵)。

不管,就是要!

硬是要有線圖也是可以的,只要在合併的時候,加上 --no-ff 參數:

$ git merge cat --no-ff
Merge made by the 'recursive' strategy.
 cat1.html | 0
 cat2.html | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 cat1.html
 create mode 100644 cat2.html

--no-ff 參數是「不要使用快轉模式合併」的意思,這樣一來就會額外做出一個 Commit 物件:

merge graph

這個做出來的 Commit 物件一樣會指向前面的兩個 Commit。

如果使用 SourceTree 要做這件事,請選擊上面的「Merge」按鈕,在跳出來的這個對話框中,勾選「Create a commit even if merge resolved via fast-forward」選項,就可以做出跟 --no-ff 的效果了

merge graph

有必要嗎?

那到底這個東西到底需要嗎?硬是要做出這個小耳朵有意義嗎?非快轉模式合併的好處是可以完整保留分支的樣子,但如果你不是很介意這件事的話其實也就沒必要硬要做出小耳朵囉。


← 上一章:合併分支 下一章:【常見問題】合併過的分支要留著嗎? →

Comments