git|面試字節(jié)時,老師問:合并分支中rebase和merge的區(qū)別

實際開發(fā)工作的時候,我們都是在自己的分支開發(fā),然后將自己的分合并到主分支,那合并分支用2種操作,這2種操作有什么區(qū)別呢?

git上新建一個項目,默認是有master分支的,將項目克隆到本地,我們的準備工作就完成了



同學(xué)A:
執(zhí)行g(shù)it log ,可以看到有一個提交記錄,是初始化提交



新增一個文件a.txt, 再次查看我們的提交記錄,有2條提交記錄了



這個時候?qū)⒈镜匦耤ommit的記錄push到遠程倉庫,就可以看到我們的2次提交了



同學(xué)B:
同學(xué)B在已經(jīng)有提交記錄的master分支上,檢出分支dev,并將分支推送到遠程分支,并進行自己的開發(fā)



查看遠程倉庫,多了一個dev分支



此時的git分支類圖是這樣的













此時B同學(xué)開始進行開發(fā),完成了自己的3次提交工作,使用git log 看一下



此時git的分支類圖是這樣子的








重點
現(xiàn)在有這樣一個現(xiàn)實的請況,就是B同學(xué)準備進行第4次提交的時候,同學(xué)A在master主分支上進行了一次提交,master的提交已經(jīng)向前走了

此時的git分支類圖是這樣的



此時我們知道B同學(xué)開發(fā)的dev分支是基于C2提交點切出來的,而這個時候master分支已經(jīng)被更新了

如果B同學(xué)開發(fā)完畢,需要將其所作的功能合并到master分支 ,他可以有兩種選擇:

直接git merge,那么這個時候會這么做
(1)找到master和dev的共同祖先,即C2
(2)將dev的最新提交C5和master的最新提交即C6合并成一個新的提交C7,有沖突的話,解決沖突
(3)將C2之后的dev和master所有提交點,按照提交時間合并到master



直接git rebase
切換分支到需要rebase的分支,這里是dev分支

執(zhí)行g(shù)it rebase master,有沖突就解決沖突,解決后直接git add . 再git rebase --continue即可

發(fā)現(xiàn)采用rebase的方式進行分支合并,整個master分支并沒有多出一個新的commit,原來dev分支上的那幾次(C3,C4,C5)commit記錄在rebase之后其hash值發(fā)生了變化,不在是當初在dev分支上提交的時候的hash值了,但是提交的內(nèi)容被全部復(fù)制保留了,并且整個master分支的commit記錄呈線性記錄

此時git的分支類圖



總結(jié)
git merge 會讓2個分支的提交按照提交時間進行排序,并且會把最新的2個commit合并成一個commit。最后的分支樹呈現(xiàn)非線性的結(jié)構(gòu)

git reabse 將dev的當前提交復(fù)制到master的最新提交之后,會形成一個線性的分支樹

作者:小孔不菜 鏈接:https://juejin.cn/post/7123826435357147166

作者:小孔不菜


歡迎關(guān)注微信公眾號 :前端陽光