Git merge和rebase分支合併命令的區別

富途web開發團隊發表於2019-03-03

歡迎關注富途web開發團隊,缺人從眾

上週花了時間把futu web部落格分類,文章,入口搞了一下,主要為了解決SEO問題。接下來SEO好不好就看效果了。

futu web 部落格地址

今天分享的文章呢。小編覺得大家看圖就行。正文講的是Git分支合併命令merge和rebase的區別。

那麼在正文開始前,小編還是先送一些彩蛋吧。對於大家去理解Git命令挺有用的。

檔案狀態轉換:

Git merge和rebase分支合併命令的區別

檔案儲存:

Git merge和rebase分支合併命令的區別

上面這兩張圖會對大家理解Git命令有很大的幫助。

正文

在使用 git 進行版本管理的專案中,當完成一個特性的開發並將其合併到 master 分支時,我們有兩種方式:git mergegit rebase。通常,我們對 git merge 使用的較多,而對於 git rebase 使用的較少,其實 git rebase 也是極其強大的一種方法。下面我們就來講一講 git mergegit rebase 的差別和在實際中的使用。

準備工作

為了更好地觀察執行 git mergegit rebase 之後發生的現象,我們首先來做一些準備工作,即建立一個專案倉庫,然後在其中構建兩條分支,再增加幾次提交。

具體如下:

  1. 建立一個目錄 gitTest
  2. 在目錄 myTest 中新建一個檔案 readme.md,隨便新增一個標題,和第一個列表項 add master1 並提交到本地倉庫
  3. 在當前分支的基礎上新建一條分支,名為 feature,將列表項 add master1 修改為 add feature1 並提交到本地倉庫
  4. 隨後切換到分枝 master 上新增一個新的列表項 add master2 並提交到本地倉庫
  5. 隨後切換到分枝 feature 上新增一個新的列表項 add feature2 並提交到本地倉庫
  6. 重複上面的步驟 4 和 5,直至在 masterfeature 上各新增了 4 條列表項

此時你的倉庫分支提交的記錄看起來應該是這樣的:

初始分支提交記錄

初始 master 分支內容應該是這樣的:

初始 master 分支內容

初始 feature 分支內容應該是這樣的:

初始 feature 分支內容

git merge

從目錄 gitTest 拷貝出一份來,命名為 gitMerge 來進行我們的合併操作。

git merge 的使用方法很簡單,假如你想將分支 feature 合併到分支 master,那麼只需執行如下兩步即可:

  • 將分支切換到 master 上去:git checkout master
  • 將分支 feature 合併到當前分支(即 master 分支)上:git merge feature
merge

如上圖所示,git merge 有如下特點:

  • 只處理一次衝突
  • 引入了一次合併的歷史記錄,合併後的所有 commit 會按照提交時間從舊到新排列
  • 所有的過程資訊更多,可能會提高之後查詢問題的難度

為什麼講 git merge 提交的資訊過多可能會影響查詢問題的難度呢?因為在一個大型專案中,單純依靠 git merge 方法進行合併,會儲存所有的提交過程的資訊:引出分支,合併分支,在分支上再引出新的分支等等,類似這樣的操作一多,提交歷史資訊就會顯得雜亂,這時如果有問題需要查詢就會比較困難了。

使用 git merge 之後的分支提交記錄如下:

使用 `git merge` 之後的分支提交記錄

git rebase

git rebase 的合併操作

git merge 一致,git rebase 的目的也是將一個分支的更改併入到另外一個分支中去。

merge

如上圖所示,他的主要特點如下:

  • 改變當前分支從 master 上拉出分支的位置
  • 沒有多餘的合併歷史的記錄,且合併後的 commit 順序不一定按照 commit 的提交時間排列
  • 可能會多次解決同一個地方的衝突(有 squash 來解決)
  • 更清爽一些,master 分支上每個 commit 點都是相對獨立完整的功能單元

那麼我們現在來具體操作一下,看看 git rebase 是如何做的。

首先,和 git merge 不同的是,你需要在 feature 分支上進行 git rebase master 的操作,意味著讓當前分支 feature 相對於 分支 master 進行變基:

在 feature 分支上執行 `git rebase`

可以看出,我們遇到了衝突,進行對比的雙方分別是 master 分支的最新內容和 feature 分支的第一次提交的內容,上圖下方紅框內容告訴我們,在我們解決了衝突之後,需要執行 git rebase --continue 來繼續變基的操作。

在解決衝突之後執行 git rebase --continue 時遇到了提示,看來我們首先需要把我們的修改存到暫存區,隨後再執行 git rebase --continue。執行之後又遇到了衝突,這次是與 feature 分支的第二次提交進行對比出現的衝突,意味著我們需要多次解決同一個地方的衝突。

進行 `git rebase --continue`

繼續重複先解決衝突,再 git rebase --continue 的步驟,直到遇到:

完成 `git rebase --continue`

意味著完成了 feature 最後一次提交的變基操作,至此整個變基就完成了。

再來看看執行 git rebase 之後的 feature 分支:

完成 `git rebase --continue`的 feature

完全符合上面所說的執行 git rebase 的特點,我們引出 feature 分支的位置變了,沒有多餘的提交歷史,且提交的時序也改變了,另外回憶一下,在我們執行變基的過程中也多次解決了同一個地方的衝突。

這個時候我們再切換到 master 分支上,將 feature 分支合併進來。

完成 `git rebase`後再merge

看得出來,feature 分支上的所有提交資訊都會被合併到 master 分支上了,這些資訊對我們來說不是必要的,我們在 masetr 分支上往往只需要知道合併進來了什麼新的功能即可,這些多餘的資訊可以通過 git rebase 的互動模式進行整合,下一節會講到這個。

git rebase 的互動模式

開啟變基的互動模式只需要傳入一個引數 -i 即可,同時還需要指定對哪些提交進行處理,如:

git rebase -i HEAD~4
複製程式碼

上述命令指定了對當前分支的最近四次提交進行操作。下面我們使用上面這行命令將 feature 分支的提交合並。

head rebase

中間紅框內有一些命令,可以用來處理某次提交的,此處我們使用 squash 來將所有的 commit 合併成一次提交,編輯並儲存之後會出現編輯提交的資訊的提示,編輯提交即可。

此時再看 feature 分支上的提交記錄,會看到只有一次提交了。

squash

此時無論是直接將分支合併到 master 還是先變基再合併,master 分支上的提交記錄都會十分清爽了。

總結

當需要保留詳細的合併資訊的時候建議使用git merge,特別是需要將分支合併進入master分支時;當發現自己修改某個功能時,頻繁進行了git commit提交時,發現其實過多的提交資訊沒有必要時,可以嘗試git rebase

相關文章