初學git,在合併分支上一定會經常使用到 git merge 語法。今日接觸到 git rebase,發現兩者都有用於分支合併的功能,那接下來讓咱們探究一下兩者的不一樣之處。git
主要區別在於git log上:是否保留分支的commit提交節點 。spa
前提:cdn
此時,咱們的主分支Master上有一、二、三、4 四個文檔,branch1分支上則是一、二、五、6 四個文檔,接下來執行咱們的合併操做。blog
咱們直接回到主分支Master上執行 git merge 命令,顯示以下:文檔
此時咱們的 git log 上保留了分支branch1的 5 和 6 的commit提交,且又在主分支Master上自動建立了一個新的commit提交節點 「7」。it
簡單而言就是Master的一、二、三、4和合並的branch1的五、6的提交歷史節點都被記錄下來了,且自動在Master上自動生成第7個節點:io
咱們在分支branch1上執行 git rebase 命令:table
會發現branch1合併了 Master 的 三、4 文檔,因此如今branch1 就有了一、二、三、四、五、6全部文檔,回到Master再合併一下:
這時咱們的 git log 上就獲得一個簡潔的項目歷史,且未生成新的 merge commit(保留了分支上的提交信息成功與Master合併,但刪去了提交歷史記錄):ast
學完rebase,我即刻猜測,如果在分支baranch1上直接merge合併主分支,獲得全部文檔後再回到主分支上執行merge會不會也能獲得一條線,事實證實,這麼想說明仍是沒有徹底理解rebase的真正含義,先看結果吧...class
rebase就是——變基, 變基, 變基 。
即:改變一條分支的 基點 ,使原分支從指定的節點(commit)延續。。
通俗點講,變基操做其實就是保留了該 commit 做出的修改,但刪丟棄了分支上一些現有的提交記錄,刪去了這些節點。
比較 | merge | rebase |
---|---|---|
優勢 | 保留有價值的歷史文檔 | 刪減就繁 |
缺點 | 分支雜亂冗餘 | 沒法體現時間線 |
因此,使用merge仍是rebase仍是得分狀況考慮,具體項目具體分析: