merge
merge命令把不同的分支合并起來。如下圖,HEAD處于master分支的ed489提交點(diǎn)上,other分支處于33104提交點(diǎn)上,項(xiàng)目負(fù)責(zé)人看了下覺得other分支的代碼寫的不錯(cuò),于是想把代碼合并到master分支,因此直接執(zhí)行g(shù)it merge other,如果沒有發(fā)生沖突,other成功合并到master分支了。
rebase
rebase又稱為衍合,是合并的另外一種選擇。merge把兩個(gè)分支合并到一起進(jìn)行提交,無論從它們公共的父節(jié)點(diǎn)開始(如上圖,other分支與master分支公共的父節(jié)點(diǎn)b325c),被合并的分支(other分支)發(fā)生過多少次提交,合并都只會(huì)在當(dāng)前的分支上產(chǎn)生一次提交日志,如上圖的f8bc5。所以merge產(chǎn)生的提交日志不是線性的,萬一某天需要回滾,只能把merge整體回滾。而rebase可以理解為verbosely merge,完全重演下圖分支topic的演化過程到master分支上。如下圖:
在開始階段,我們處于topic分支上,執(zhí)行g(shù)it rebase master,那么169a6和2c33a上發(fā)生的事情都在master分支上重演一遍,分別對(duì)應(yīng)于master分支上的e57cf和f7e63,后checkout切換回到topic分支。這一點(diǎn)與merge是一樣的,合并前后所處的分支并沒有改變。git rebase master,通俗的解釋是topic分支想站在master的肩膀上繼續(xù)下去。