Git:Git merge的–ff和–no-ff

NO IMAGE

通往老兵驛站之路。

前言

Git merge最容易糊塗的地方就是這個--ff引數和--no-ff 引數,通過本文,把這個整理清楚。

其實官網講的非常清楚,不過可能因為是英文的,所以大家閱讀起來會有一些障礙。(PS:其實還是應該逐步逐步提高自己閱讀英文文件的能力,想達到一個更高的高度,是需要客服自己本身很多的弱點的)

例項

假設合併前的分支是這樣,這個一個非常常見的場景,如果不明白,可以參考另外一篇文章Git Flow工作流:
這裡寫圖片描述
這是一個很常見的用例,功能開發分支是iss53,在開發新功能,master分支是線上分支,出現了問題,開闢了hotfix分支進行修復,修復完成,進行合併,需要把hotfix合併回master

$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2   
1 file changed, 2 insertions( )

步驟如下:
1. 切換回master分支。
2. 將hotfix分支合併會master分支。
然後看到了Fast-forward 的字樣,這個片語的意思就是快進,播放電影的時候,可以注意一下,快進按鈕上面就是這個片語。
那麼實際變成了什麼樣呢?
這裡寫圖片描述
僅僅是master指標指向了這個提交C4。這樣是一種比較快的合併方式,輕量級,簡單。
這個時候,我們往往會刪掉hotfix分支,因為它的歷史作用已經結束,這個時候,我們的iss53這個功能又向前開發,進行了一次提交,到了C5,那麼變成了這樣:
這裡寫圖片描述
然後,我們要把iss53 這個分支合併回master,就變成了這樣:
這裡寫圖片描述
這個時候生成了一個新的commit號,這種提交就不是fast-forward(這個時候也無法生成fast-forward提交,因為要將兩個版本的內容進行合併,只有在沒有需要合併內容的時候,會有這個fast-forward 方式的提交)。
如果我們對第一次合併,使用了--no-ff引數,那麼也會產生這樣的結果,生成一個新的提交,實際上等於是對C4 進行一次複製,建立一個新的commit,這就是--no-ff的作用。
這裡寫圖片描述

參考:https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging,這裡講了原理。
參考:https://git-scm.com/docs/git-merge,這裡是參考。