當前位置: 妍妍網 > 碼農

合並程式碼用 merge 還是用 rebase ? 兩者的區別是什麽?

2024-07-10碼農

點選「 IT碼徒 」, 關註,置頂 公眾號

每日技術幹貨,第一時間送達!

1)git rebase 讓你的送出記錄更加清晰可讀

git rebase 的使用

rebase 轉譯為變基,他的作用和 merge 很相似,用於把一個分支的修改合並到當前分支上。

如下圖所示,下圖介紹了經過 rebase 前後送出歷史的變化情況。

圖片

現在我們來用一個例子來解釋一下上面的過程。

假設我們現在有2條分支,一個為 master ,一個為 feature/1,他們都基於初始的一個送出 add readme 進行檢出分支,之後,master分支增加了 3.js 4.js 的檔,分別進行了2次送出,feature/1也增加了 1.js 2.js 的檔,分別對應以下2條送出記錄。

master 分支如下圖:

圖片

feature/1分支如下圖:

圖片

結合起來看是這樣的

圖片

此時,切換到 feature/1 分支下,執行 git rebase master ,成功之後,透過 log 檢視記錄。

如下圖所示:可以看到先是逐個套用了 mater 分支的更改,然後以 master 分支最後的送出作為基點,再逐個套用 feature/1的每個更改。

圖片

所以,我們的送出記錄就會非常清晰,沒有分叉,上面演示的是比較順利的情況,但是大部份情況下,rebase 的過程中會產生沖突的,此時,就需要手動解決沖突,然後使用 git add git rebase --continue 的方式來處理沖突,完成 rebase,如果不想要某次 rebase 的結果,那麽需要使用 git rebase --skip 來跳過這次 rebase。

2)git merge 和 git rebase 的區別

不同於 git rebase 的是, git merge 在不是 fast-forward (快速合並)的情況下,會產生一條額外的合並記錄,類似 Merge branch 'xxx' into 'xxx' 的一條送出資訊。

圖片

另外,在解決沖突的時候,用 merge 只需要解決一次沖突即可,簡單粗暴,而用 rebase 的時候 ,需要一次又一次的解決沖突。

3)git rebase 互動模式

在開發中,常會遇到在一個分支上產生了很多的無效的送出,這種情況下使用 rebase 的互動式模式可以把已經發生的多次送出壓縮成一次送出,得到了一個幹凈的送出歷史,例如某個分支的送出歷史情況如下:

圖片

進入互動式模式的方式是執行:

git rebase -i <base-commit>

參數base-commit就是指明操作的基點送出物件,基於這個基點進行 rebase 的操作,對於上述送出歷史的例子,我們要把最後的一個送出物件(ac18084)之前的送出壓縮成一次送出,我們需要執行的命令格式是:

git rebase -i ac18084

此時會進入一個 vim 的互動式頁面,編輯器列出的資訊像下列這樣。

圖片

想要合並這一堆更改,我們要使用 squash 策略進行合並,即把當前的 commit 和它的上一個 commit 內容進行合並, 大概可以表示為下面這樣。

pick ... ...
s ... ... 
s ... ... 
s ... ... 

修改檔後 按下 : 然後 wq 保存結束,此時又會彈出一個編輯頁面,這個頁面是用來編輯送出的資訊,修改為feat: 更正,最後保存一下,接著使用 git branch 檢視送出的 commit 資訊,rebase 後的送出記錄如下圖所示,是不是清爽了很多?rebase 操作可以讓我們的送出歷史變得更加清晰。

圖片

特別註意,只能在自己使用的 feature 分支上進行 rebase 操作,不允許在整合分支上進行 rebase,因為這種操作會修改整合分支的歷史記錄。

來源:https://blog.csdn.net/qq_24147051

END

PS:防止找不到本篇文章,可以收藏點贊,方便翻閱尋找哦。

往期推薦