一. 合并多個(gè)commit
...略過(guò)
二. git rebase 和 git merge 區(qū)別
栗子: 葉塵基于master 分支c0 拉出 dev 分支邪铲,在dev分支提交? c1、c2、c3,路人在 master 分支 c4柿顶,葉塵準(zhǔn)備把dev合并到master...
1.git merge
-將兩個(gè)分支的最新提交點(diǎn)c3 和c4 合并后生成一個(gè)新的提交 c5(有沖突解決沖突),
-將以上兩個(gè)分支master和dev 從c0到c5上所有提交點(diǎn)按commit時(shí)間的先后順序一次放到master上位迂。
2.git rebase 后再git merge
-rebase之前需要將master分支拉到最新
-切換分支到需要rebase的分支,這里是dev分支
-執(zhí)行g(shù)it rebase master(有沖突解決沖突)九秀,解決后直接git add . 再git rebase --continue即可
-此時(shí): dev分支的git log 并沒(méi)有像git merge一樣多出一次新的commit遗嗽,而是dev后面幾次commit(c1、c2鼓蜒、c3 )的hash值變了
-切換到master分支痹换,git merge dev 合并dev到master;
????????發(fā)現(xiàn)采用rebase的方式進(jìn)行分支合并都弹,整個(gè)master分支并沒(méi)有多出一個(gè)新的commit娇豫,原來(lái)dev分支上的那幾次(C3,C4畅厢,C5)commit在rebase之后其hash值發(fā)生了變化冯痢,不在是當(dāng)初在dev分支上提交的時(shí)候的hash值了,但是提交的內(nèi)容被全部復(fù)制保留了或详,并且整個(gè)master分支的commit記錄呈線性記錄系羞;
總結(jié):
git merge 操作合并分支會(huì)讓兩個(gè)分支的每一次提交都按照提交時(shí)間(并不是push時(shí)間)排序,并且會(huì)將兩個(gè)分支的最新一次commit點(diǎn)進(jìn)行合并成一個(gè)新的commit霸琴,最終的分支樹呈現(xiàn)分叉交錯(cuò)式的形式;
c0---------------c4-c5
? ? ? ?\c1-c2-c3/
git rebase(顧名思義-變基)
實(shí)質(zhì)是將當(dāng)前分支原本基于原分支提交點(diǎn)(c0)之后的所有提交打散成一個(gè)個(gè)patch椒振,再次基于原分支的最新commit(c4)重新提交并生成新的commit hash;并不根據(jù)兩個(gè)分支的實(shí)際提交時(shí)間點(diǎn)排序梧乘;rebase完成后澎迎,切到基分支進(jìn)行合并后也不會(huì)生成新的commit,
保持一條直線 c0-c4-c1-c2-c3
參考文檔:http://www.reibang.com/p/6960811ac89c