1. 程式人生 > 實用技巧 >Git的merge和rebase

Git的merge和rebase

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

分支是Git的最強大的功能之一,相比於SVN和CVS,在Git上使用分支快速和方便許多。在Git上把分支的內容合併到主幹有兩種方式:merge和rebase,這裡以sourcetree為工具介紹一下merge和rebase的功能和區別。

假設我們現在有一個repository,這個repository有一個主幹master,我在本地基於master的初始狀態建立了一個分支dev,我在dev上開發一個新的功能並提交程式碼到dev,於此同時master上的程式碼也有別人在提交。現在我已經開發完了這個新功能,準備把修改的程式碼從dev合併到master上,假設從建立dev分支到現在master提交過一次,dev提交過一次,在sourcetree上我們看到的版本歷史是這樣的(藍線是dev,紅線是master

):

把程式碼從dev上合併到master上我們可以使用merge或者rebase。

首先來看merge,merge和SVN的merge是同樣的功能,把分支的初始版本,分支的最新版本,主幹的最新版本,三者進行一次三方合併計算,得到合併後的最新的版本,然後提交到主幹。在sourcetree上merge的方式是現在當前working copy切換到master,然後在dev上選擇merge dev into master,如圖所示:


merge完成後我們看到的Git歷史記錄是這樣的(紅線是dev,藍線是master)

使用merge,我們可以在歷史記錄裡清楚地看到master的最後一次commit是來自dev的merge,而且"從dev合併到master"的這個資訊會一直體現在歷史記錄裡(即使以後dev這個分支被刪除了)。

除了merge,我們還有另一個選擇,那就是rebase。rebase的原理是把dev上的所有歷史提交在master的最新版本上再逐個提交一遍。在sourcetree上rebase的操作方式如圖

rebase完成後的Git歷史記錄如下圖

我們看到如果使用rebase的話,從歷史記錄上完全看不出master的最後一次commit是從dev合併而來的,就好像這次合併是在master上直接修改並提交的一樣。以後如果刪除了dev,那麼dev曾經存在過的痕跡將從歷史記錄裡完全消失,我們從歷史記錄裡將無法知道"曾經有一個dev分支,修改了一些程式碼,併合併到了master"這樣一個"歷史事件"。但是從另一面看,master的歷史記錄將變得比較清晰,不會被各種臨時的分支合併記錄搞得看的人頭昏眼花。

轉載於:https://my.oschina.net/fifadxj/blog/546651