rebasing
和 merge
都是爲了將一個分支的修改合併到另外一個分支上,可是他們的實現方式不一樣。
好比說,假如咱們有像下面這樣的一些提交內容,merge
操做的結果像是合併了一個分支上的全部提交。而 rebase
操做將從 master 分支的最後一次提交開始添加 feature 分支中的全部更改。html
rebase
master 分支到 feature 分支,實際上是將整個 feature 分支的起點移到了 master 分支的終點Merging
獲取到 feature 分支的內容並將它合併到 master 分支,最後只有 master 分支被改變了,feature 分支保持歷史修改不變。Merging
會添加一個新的 commit
到歷史記錄裏問題:在 second_branch 分支上須要 commit3 修改的內容(或者個人老大想讓個人工做目錄始終與 master 分支保持一致)git
這裏有兩種可能的實現方法:google
merge
(或者偷懶的話可使用 pull
)rebase
提醒:咱們在
second_branch
分支上進行工做以前咱們執行了git checkout second_branch
命令3d
git merge master
的結果fast-forward
(
一篇關於fast-ward
的好文檔)合併的過程,所以 Git 建立了咱們稱之爲合併提交的方法,以將 master 分支的全部修改應用於 second_branch。
這使 git 折線圖產生了一個很差看的邊緣線。指針
可是,它讓全部提交都與合併以前保持一致,由於它們不會更改分支的歷史記錄。code
注意:若是咱們從 Git 提交樹上刪除了(使用 rebase -i
或者 reset
)合併的提交記錄(在咱們的例子中是編號:63c6403),那麼來自這個被合併分支的全部提交也將從分支中撤離。
這使的代碼回滾變得很是容易,當您合併了一個分支的大量提交但它們不能知足需求且必須刪除它們時:只需刪除 merge commit
便可。cdn
git rebase master
的結果second_branch
分支的前一個 HEAD 指針(指向當前選定分支的最後一個提交的指針)指向的是 「Commit 2」,而且經過運行
git rebase
,我但願它的 HEAD 指針與 master 分支相同,所以,分支首先是如出一轍的,而後合併來自 second_branch 上面的提交。 這創造了一個很是好看且線性的樹。
rebasing
以後會改變爲 a018520,這意味着若是有人正在使用 second_branch,他將很難檢索到整個新的 second_branch,由於它的樹已經徹底改變了。 我認可這有點複雜,但實際上它正在將這個分支的舊的 「起點提交」 更改成 「新的」 起點。 若是您須要更好的表示方法,能夠在
google 圖片上查看 git rebase 的一些圖形。
rebase
,何時使用 merge
?若是要同步修改的 feature 分支是和別人共同開發的分支,則不建議使用 rebase
操做,由於 rebase
會使倉庫變得先後不一致。對於我的單獨開發而言,rebase
操做會更有意義。htm
若是您想看到與合併操做發生以前徹底相同的歷史記錄,那就用 merge
吧, merge
會保存歷史記錄,但 rebase
會重寫它。blog
rebase
更好的簡化了複雜的歷史記錄,您能夠經過交互式 rebase
更改提交歷史。您能夠刪除不須要的提交(git rebase --onto )、將兩個或多個提交壓縮到一個提交中或編輯提交消息。圖片
rebase
將一次顯示一個提交衝突,而 merge
將一次顯示全部衝突。一次顯示一個提交衝突會使衝突處理的更容易,更好,可是不要忘了當有不少衝突發生時 revert
rebase 操做比 revert
merge 操做要困可貴多。
git — Basic Rebase
git-difference-between-merge-and-rebase
git-for-each-ref
Rebase vs Merge Interactive Rebase