Git 合併時 no ff 的作用

2021-08-26 08:19:51 字數 1191 閱讀 7702

在許多介紹 git 工作流的文章裡,都會推薦在合併分支時,加上--no-ff引數:

$ git checkout develop

$ git merge --no-ff feature

--no-ff在這的作用是禁止快進式合併。

git 合併兩個分支時,如果順著乙個分支走下去可以到達另乙個分支的話,那麼 git 在合併兩者時,只會簡單地把指標右移,叫做「快進」(fast-forward),比如下圖:

a---b---c feature

/d---e---f master

要把 feature 合併到 master 中,執行以下命令

$ git checkout master

$ git merge feature

結果就會變成

a---b---c feature

/ master

d---e---f

因為 feature 就在 master 的下游,所以直接移動了 master 的指標,master 和 feature 都指向了 c。而如果執行了git merge --no-ff feature的話,是下面的結果:

a---b---c feature

/ \

d---e---f-----------g master

由於--no-ff禁止了快進,所以會生成乙個新的提交,master 指向 g。

從合併後的**來看,結果其實是一樣的,區別就在於--no-ff會讓 git 生成乙個新的提交物件。為什麼要這樣?通常我們把 master 作為主分支,上面存放的都是比較穩定的**,提交頻率也很低,而 feature 是用來開發特性的,上面會存在許多零碎的提交,快進式合併會把 feature 的提交歷史混入到 master 中,攪亂 master 的提交歷史。所以如果你根本不在意提交歷史,也不愛管 master 幹不乾淨,那麼--no-ff其實沒什麼用。不過,如果某一次 master 出現了問題,你需要回退到上個版本的時候,比如上例,你就會發現退乙個版本到了 b,而不是想要的 f,因為 feature 的歷史合併進了 master 裡。

git merge之 no ff 的作用

no ff 在這的作用是禁止快進式合併。git 合併兩個分支時,如果順著乙個分支走下去可以到達另乙個分支的話,那麼 git 在合併兩者時,只會簡單地把指標右移,叫做 快進 fast forward 比如下圖 注意 這種是master沒有前進的情況,所以會這樣,如果master也前進了,則可以不用這個...

git多分支合併時的坑

有兩個分支,master和基於master建立的dev分支 master分支對檔案a執行了移動路徑的操作 rename dev分支也對檔案a執行了相同的移動路徑的操作 rename 現在,想要把dev分支合併回master分支,檔案a會不會衝突?合併結果 實際測試一下,發現不會衝突,因為兩邊相對位置...

git 中的 no ff 引數是什麼意思

git在合併分支時,一般都會加上 no ff 引數,像這樣 git checkout develop git merge no ff feature那這裡的 no ff 引數具體作用是什麼呢?主要是為了禁止 git 的快進式合併。git 在合併兩個分支時,如果順著乙個分支走下去可以到達另乙個分支的話...