Git的fast forward和no fast forward和 three way merge 以及squash(聚合)

github上上傳了版本庫https://github.com/ChuckGitMerge   包括merge和rebasehtml

沒時間畫圖,貌似也不太會用畫圖工具,先寫了一個文字版本的git

更新:2015年08月11日,使用了git for windows自帶的git gui做爲圖片說明github

 

1、Fast Forward,No Fast Forward 和 Squash的對比

1.fast forward

假設從master分支有三個節點C1,C2,C3windows

從C3切出develop分支,並在develop分支上開發了C4,C5工具

如今切回master分支,將develop分支合併到master。默認使用fast forward,master分支會直接指向C5。master分支的節點爲C1,C2,C3,C4,C5ui

  

develop分支和master分支,看起來是徹底同樣的spa

 

2.no fast forward

假設從master分支有三個節點C1,C2,C3htm

從C3切出develop分支,並在develop分支上開發了C4,C5blog

如今切回master分支,將develop分支合併到master。若是使用no  fast forward,在master分支上會生成一個新的commit爲C6。master分支的節點爲C1,C2,C3,C4,C5,C6three

 

3.squash(第一種)    

 第一種squash,develop分支切出以後,master分支沒有新的提交

假設從master分支有三個節點C1,C2,C3

從C3切出develop分支,並在develop分支上開發了C4,C5

下面的圖的狀況和fast forward以及no fast forward處理以前是同樣的

如今切回master分支,將develop分支合併到master。

若是使用聚合的方式進行合併的話,那麼git會將develop分支上全部的commit壓縮成一個新的commit爲C6直接合併到master分支。

最後master分支上的節點爲C1,C2,C3,C6

從版本庫的分支歷史記錄,是沒法看出develop合併到master分支上的記錄的。這是squash和其餘合併方式的最主要的區別。

而且master和develop還保持着相互獨立

 

 

 

2、Three Way Merge和Squash的對比

1.three way merge

假設從master分支有三個節點C1,C2,C3

從C3切出develop分支,並在develop分支上開發了C4,C5

master分支在C3的基礎上開發了C6,C7這樣進行合併的話,是沒法fast forward的。

合併方式:1.找到master分支的最新節點C7   

              2.找到develop分支的最新節點C5

              3.找到master分支和develop分支的共同祖先節點C3

              4.對C3,C5,C7進行三方合併,最後生成新的commitC8

 

 

 

2.squash(第二種)

第二種squash,develop分支切出以後,master分支也有了新的提交

假設從master分支有三個節點C1,C2,C3

從C3切出develop分支,並在develop分支上開發了C4,C5

master分支在C3的基礎上開發了C6,C7這樣進行合併的話

下面的圖的狀況和three way merge處理以前是同樣的

合併方式,直接把develop上的2個結點的變化提取出來,而後直接應用在master分支上。

從版本庫的分支歷史記錄,是沒法看出develop合併到master分支上的記錄的。這是squash和其餘合併方式的最主要的區別。

而且master和develop還保持着相互獨立

 

 

參考資料

http://www.open-open.com/lib/view/open1328069889514.html  git詳解之三 git分支

http://ariya.ofilabs.com/2013/09/fast-forward-git-merge.html   Fast-Forward Git Merge

http://stackoverflow.com/questions/2850369/why-does-git-fast-forward-merges-by-default

相關文章
相關標籤/搜索