git merge與git rebase的區別

2021-10-08 03:35:52 字數 1271 閱讀 2770

merge,官方文件給的說明是:git-merge - join two or more development histories together顧名思義,當你想要兩個分支交匯的時候應該使用merge。根據官方文件給的例子,是master merge topic

如圖1:

然而在實踐中,在h這個commit上的merge經常會出現merge conflict。為了避免解決衝突的時候引入一些不必要的問題,工程中一般都會規定no conflict merge。比如你在github上發pull request,如果有conflict就會禁止merge。所以才會有題主問的問題:在當前的topic分支,想要引入master分支的f、g commit上的內容以避免merge conflict,方便最終合併到master。這種情況下用merge當然是乙個選項。用merge代表了topic分支與master分支交匯,並解決了所有合併衝突。然而merge的缺點是引入了一次不必要的history join。如圖2:

其實仔細想一下就會發現,在引入master分支的f、g commit這個問題上,我們並沒有要求兩個分支必須進行交匯(join),我們只是想避免最終的merge conflict而已。

rebase是另乙個選項。rebase的含義是改變當前分支branch out的位置。這個時候進行rebase其實意味著,將topic分支branch out的位置從e改為g, 如圖3:

在這個過程中會解決引入f、g導致的衝突,同時沒有多餘的history join。但是rebase的缺點是,改變了當前分支branch out的節點。如果這個資訊對你很重要的話,那麼rebase應該不是你想要的。rebase過程中也會有多次解決同乙個地方的衝突的問題,不過可以用squash之類的選項解決。個人並不認為這個是rebase的主要問題。綜上,其實選用merge還是rebase取決於你到底是以什麼意圖來避免merge conflict。實踐上個人還是偏愛rebase。乙個是因為branch out節點不能改變的情況實在太少。另外就是頻繁從master merge導致的冗餘的history join會提高所有人的認知成本。

git merge 與 git rebase的區別

merge與rebase的區別 假設我們有如下圖一所示倉庫,該倉庫有master和develop兩個分支,且develop是在 3.added merge.txt file commit處從master拉出來的分支。假設現在head在 6.added hello.txt file 處,也就是在mas...

git merge 與 git rebase的區別

其實這個問題困擾我有一段時間,相信也有人和我一樣有這個困擾,網上已有很多這種解釋了,但是要麼就是無圖,要麼就是解釋的很亂,沒太看懂,經過自己對git的使用,加上向同事請教,算是理解了這個問題,所以寫下來分享一下,我盡量詳細說明 merge與rebase的區別 假設我們有如下圖一所示倉庫,該倉庫有ma...

git merge 與 git rebase的區別

前言 其實這個問題困擾我有一段時間,相信也有人和我一樣有這個困擾,網上已有很多這種解釋了,但是要麼就是無圖,要麼就是解釋的很亂,沒太看懂,經過自己對git的使用,加上向同事請教,算是理解了這個問題,所以寫下來分享一下,我盡量詳細說明 merge與rebase的區別 假設我們有如下圖一所示倉庫,該倉庫...