github上上傳了版本庫https://github.com/ChuckGitMerge 包括merge和rebasehtml
沒時間畫圖,貌似也不太會用畫圖工具,先寫了一個文字版本的git
更新:2015年08月11日,使用了git for windows自帶的git gui做爲圖片說明github
假設從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
假設從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
第一種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還保持着相互獨立
假設從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
第二種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