05/12 本篇章節
第六篇 · 12 章
使用分支
- 01 為什麼要使用分支?
- 02 開始使用分支
- 03 對分支的誤解 僅收錄於電子書
- 04 合併分支
- 05 【狀況題】為什麼我的分支都沒有「小耳朵」?
- 06 【常見問題】合併過的分支要留著嗎?
- 07 【狀況題】不小心把還沒合併的分支砍掉了,救得回來嗎?
- 08 另一種合併方式(使用 rebase)
- 09 合併發生衝突了,怎麼辦?
- 10 【冷知識】為什麼大家都說在 Git 開分支「很便宜」?
- 11 【冷知識】Git 怎麼知道現在是在哪一個分支?
- 12 【狀況題】我可以從過去的某個 Commit 再長一個新的分支出來嗎?
第六篇 · 使用分支
【狀況題】為什麼我的分支都沒有「小耳朵」?
我看別人的合併都會有小耳朵耶,為什麼我的都沒有?
這裡指的「小耳朵」是指在合併的時候產生的線圖:

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

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 而已:

這種快轉模式的合併不會有額外的線圖出現(也就是小耳朵)。
不管,就是要!
硬是要有線圖也是可以的,只要在合併的時候,加上 --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 物件:

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

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