2013-08-22 79 views
2

我已經和一個小團隊一起工作,使用'合併工作流程',最近我們根據Sandofsky's article切換到了'rebase工作流程'。git merge --no-ff和git merge有什麼區別--squash

我們目前的工作流程:

  1. git的結帳大師,混帳拉原點主
  2. git的結帳-b feature_branch,做了一些工作,git的承諾-am 「味精特性分支」
  3. git的結帳master,git pull origin master,git rebase master feature_branch
  4. git checkout master,git merge --squash
  5. git commit -am「msg for master branch」,git push origin master

重新綁定特徵分支後,我們將其合併到我們的主分支中。如果我們用--no-ff代替,會發生什麼? git merge --squashgit merge --no-ff之間的區別是什麼?

+0

請參閱http://stackoverflow.com/q/11983749/1885037有一個很好的解釋。 – kaveish

+0

['''--squash \'和''''''''''''''''''''''''''''''可能有重複的地方(https://stackoverflow.com/questions/11983749/what-are -the-差異-壁球間 - 和 - 無-FF-沒有提交) – rds

回答

2

--squash創建所有合併的變化(這南瓜整個合併的分支的歷史進入一個提交)提交。 --no-ff也在分支中合併,創建合併提交併保留合併分支的整個歷史記錄。

2

git merge --squash創建一個提交,它將應用所有適用的更改應用於正常merge。因此,它可以在單個提交中將所有提交給分支的提交融合到中。

git merge --no-ff防止快進 - 如果源和目標沒有發散,只是將分支指針移動到較新的提交的操作。所以,使用--no-ff你保證你會有一個新的提交,其父母將是您當前的HEADfeature_branch頭。

當你log這兩種情況下,在第一個只會看到提交的單行線,每一個是feature_branch消化,而在第二個,你會看到很多後果的,每一個feature_branch,並且再次加入master

由於git merge --squash生成一個新的基礎上,feature_branch那些承諾,它們是不同的提交,所以你可以有麻煩,如果你獨自一人發表feature_branch - 比方說,你可以不git merge --squash feature_branchgit多次理解它,但你必須衝突。

0

最大的區別在於你的分支歷史。使用--squash,您將擁有線性分支歷史記錄,其中分支上的每個提交都包含該提交的合併所執行的所有更改。使用--no-ff,你將有一個不同的分支歷史記錄,合併提交顯示兩個分支與多個父母一起出現的位置,父提交將包含所做的實際更改。個人而言,我更喜歡使用--squash方法,因爲它可以更容易地識別更改的來源(因爲更改是在實際壓縮的提交中,而不是父提交)。缺點是它是一個獨特的提交而不是提交歷史記錄,所以如果您繼續在該分支上開發並進行另一個壓縮提交,您將獲得另一個提交,其中包含該分支的所有更改歷史記錄。這可以確定更加困難的變化來自哪裏,因爲在兩個不同的提交中可能會出現相同的變化。解決這個問題的方法是在你做一個壁球提交之後刪除這個分支,並且任何改變或者改進都應該放在一個新的分支之外,這個分支包含其歷史上的壁球提交。

相關問題