2012-10-09 63 views
11

我的工作流中有許多短命的分支,我希望將它們分開。所以,我打算使用git config --add merge.ff false。然而,當我正在做一個拉(我理解的是獲取+合併) - 然後我想要一個快進行爲,以避免不必要的額外提交。合併分支時使用pull和no-ff時快速轉發

這是一件好事嗎?這可能嗎?

+0

注:'混帳配置push.ff only'將在Git中2.0幫助。參見[編輯我的回答以下(http://stackoverflow.com/a/12798995/6309) – VonC

+0

@VonC我認爲你的意思'pull.ff',而不是'push.ff'。在您的答案編輯中也會出現一次。 – Kelvin

+0

我知道這是不一樣的,但我相信'git pull --rebase'可以解決您的問題。 –

回答

13

注:Git的2.0(Q2 2014)將與commit b814da8推出配置push.ff

pull.ff:: 

默認情況下,Git不會創建合併的提交,當額外合併提交是的後裔當前提交。相反,當前分支的尖端被快速轉發。

  • 設置爲false時,此變量告訴Git在這種情況下創建額外的合併提交(等同於從命令行提供--no-ff選項)。
  • 僅當設置爲僅允許進行這種快進合併(相當於從命令行提供--ff-only選項)。

初始答案(2012年10月)

嘗試:

git pull --ff 

應該優先考慮你的合併配置設置。
它會將--ff選項傳遞給git pull命令中的基礎合併。

謹防--no-ff選項雖然,如「Understanding the Git Workflow

提到有足夠的標誌,你可以強制Git的行動,你認爲它應該,而不是它的方式希望的方式。但這就像使用像錘子一樣的螺絲刀;它完成了工作,但它做得不好,需要更長的時間,並且會損壞螺絲刀。

請考慮常見的Git工作流如何分崩離析。

Create a branch off Master, 
do work, 
and merge it back into Master when you’re done 

這其中大部分表現爲你想到,因爲既然你支法師變的時間。然後有一天你將一個功能分支合併到Master中,但是Master並沒有發生分歧。而不是創建一個合併提交的,Git的指向主最新提交的特性分支,或「快進」(圖)

不幸的是,你的功能分支包含關卡承諾,頻繁的提交該備份的工作,但捕獲代碼處於不穩定狀態。現在這些提交與Master的穩定提交沒有區別。您可以輕鬆地重新陷入災難。

因此,您添加了一條新規則:「當您在功能分支中合併時,請使用–no-ff強制進行新的提交。」這會完成工作,然後繼續。

然後有一天,你發現在生產中關鍵的錯誤,你需要時,剛開始追查。您運行bisect但保持在檢查點提交上着陸。你放棄手工調查。

您縮小錯誤到一個文件中。您運行blame以查看它在過去48小時內的變化情況。你知道這是不可能的,但blame報告文件在幾周內沒有被觸及。
原來blame報告初始的時間變化犯,合併不能當。幾周前您的第一次檢查點提交修改了此文件,但是此更改在今天已合併。

no-ff創可貼,折斷對開,怪罪奧祕都是你用螺絲刀當作錘子的所有症狀。

有關詳細信息,請參見:

+0

我真的不知道這個引用是如何證明爲什麼'--no-ff'不好。如果合併是FF,你仍然可以用當合並實際發生的謎一樣面對(它甚至更爲神祕,因爲沒有任何記錄)。如果你使用'--no-ff',你可以結合'blame'和'git的日誌--graph --ancestry-path'弄清楚當代碼鑽進了分公司。 – Kelvin

+0

@凱文真。其他好的讀取ff:http://stackoverflow.com/a/29319178/6309和http://git-blame.blogspot.fr/2015/03/fun-with-non-fast-forward.html。 – VonC