《Git/Gitlab進(jìn)階》九:測(cè)試merge和rebase分支合并、解決沖突及特征對(duì)比

本章主要測(cè)試講解

  • git mergegit rebase指令的用法和進(jìn)行分支合并,并做簡(jiǎn)單比較分析。

測(cè)試過(guò)程內(nèi)容較多,每個(gè)步驟都逐一截圖以便真實(shí)說(shuō)明,也有列示用法。若不感興趣,可直接查看總結(jié)部分。

測(cè)試過(guò)程

前置說(shuō)明

關(guān)于無(wú)論是使用 merge 還是 rebase 進(jìn)行合并,出現(xiàn)沖突的原因都是在不同的分支修改了同一處的代碼,合并時(shí)版控工具 git 不知道保留哪一份的修改,從而導(dǎo)致沖突,需要合并人員去判斷并解決。

使用 merge 和 rebase 合并的做法

1.png

大概流程:

測(cè)試 git merge 和 git rebase 的合并及解決沖突效果:

  • 1 準(zhǔn)備測(cè)試項(xiàng)目及分支記錄
    • 創(chuàng)建 master、dev1、dev2 三個(gè)分支
    • 除了 master 創(chuàng)建 dev1 和 dev2 的初始提交外,3 個(gè)分支各自有兩個(gè)不同的提交記錄
      • 時(shí)間順序?yàn)椋?br> master 新建空文件,再初始提交 –>
        創(chuàng)建 dev2 –> dev2 commit 第一次文件修改 –> dev2 commit 第二次文件修改 –>
        切回 master 創(chuàng)建 dev1 –> dev1 commit 第一次文件修改 –> dev1 commit 第二次文件修改 –>
        切回 master –> master commit 第一次文件修改 –> master commit 第二次文件修改 –>
        進(jìn)行使用 git merge/git merge 合并測(cè)試……
  • 2 使用 git merge 進(jìn)行合并
  • 3 使用 git rebase 進(jìn)行合并
  • 4 對(duì)比兩者合并的歷史記錄,分析優(yōu)缺點(diǎn)和使用場(chǎng)景

測(cè)試步驟

準(zhǔn)備測(cè)試項(xiàng)目及分支記錄

相關(guān)命令請(qǐng)看截圖

準(zhǔn)備測(cè)試項(xiàng)目 test-conflict,新建一個(gè) test1.txt 文件(后續(xù)新建的文件,最好都改成 UTF-8,windows 下默認(rèn)是 ANSI,操作可能會(huì)產(chǎn)生亂碼),內(nèi)容為空,并 master 分支初始提交。

2.png

以 master 分支創(chuàng)建 dev2 分支

3.png

dev2 以 master 分支為基準(zhǔn),所以 test1.txt 還是為空的,兩次修改 test1.txt

4.png

此時(shí) dev2 的歷史記錄為

5.png

切換到 master 分支,并創(chuàng)建分支 dev1 并修改文件 test1.txt,然后分別提交

6.png

然后再修改一次,然后第二次提交

7.png

此時(shí) dev1 的日志記錄如下

8.png

此時(shí)切回到 master 分支,自行也修改并提交兩次 test1.txt 的修改

9.png

此時(shí) master 分支的記錄為

10.png

直至,準(zhǔn)備工作完整,我們打包一份,保留 2 個(gè)一模一樣的項(xiàng)目,一個(gè)測(cè)試 git merge,一個(gè)測(cè)試 git rebase

使用 git merge 進(jìn)行合并測(cè)試

步驟說(shuō)明:

  • 切換到 master 分支,先合并 dev1 到 master,再合并 dev2 到 master
  • 因?yàn)?dev1、dev2 和 master 原本分支都有修改到 test1.txt 的同一行,所以會(huì)出現(xiàn)多次的合并沖突,需要手動(dòng)解決
  • 合并完成之后,查看 git merge 的 master 的日志

創(chuàng)建時(shí)現(xiàn)有 dev2 的提交,但是合并時(shí),先合并 dev1
合并 dev1 到 master,出現(xiàn)沖突

11.png

手動(dòng)解決沖突并提交

12.png

再合并 dev2 到 master,依然報(bào)沖突

13.png

手動(dòng)解決并提交

14.png

至此,使用 git merge 已把 dev1 和 dev2 合并到 master 分支,查看 master 分支的日志。

15.png

至此使用 git merge 合并和解決沖突測(cè)試完成。

使用 git rebase 合并沖突

使用之前的備份項(xiàng)目測(cè)試 git rebase

步驟說(shuō)明:

  • 切到 dev1 分支,rebase dev1 到 master,解決合并沖突
  • 切回 master 分支(此時(shí) master 的日志還沒(méi)變),進(jìn)行一次快速合并到 dev1(現(xiàn)在就變了)
  • 切到 dev2 分支,rebase dev2 到 master,解決合并沖突
  • 切回 master 分支,進(jìn)行一次快速合并到 dev2
  • 合并完成之后,查看 git rebase 的 master 的日志

切回 dev1 分支,rebase dev1 到 master,會(huì)產(chǎn)生沖突。

16.png

修改成以下內(nèi)容之后,再執(zhí)行 git add .(沒(méi)有執(zhí)行 commit),然后繼續(xù)進(jìn)行 rebase

17.png

繼續(xù)進(jìn)行 rebase,則彈出第二次沖突提示

18.png

從文本來(lái)看,因?yàn)橛袃尚惺菦_突的,第一次解決沖突是 master 中于 dev1 第一次提交有沖突的內(nèi)容,現(xiàn)在報(bào)的是與 dev1 第二次提交有沖突的內(nèi)容,同樣手動(dòng)解決,然后繼續(xù),可見(jiàn) rebase 完成。

19.png

至此,使用 rebase,已經(jīng)把 dev1 上的兩次提交的修改變基到了 master 分支的提交修改上。

現(xiàn)在切回 master 分支(當(dāng)然,此時(shí) master 的日志還沒(méi)變),進(jìn)行一次快速合并到 dev1(現(xiàn)在就變了)

20.png

同樣的,再合并 dev2,同樣解決兩次沖突,
第一次沖突

21.png

解決如下

22.png

第二次沖突

23.png

解決如下:

24.png

合并完成

25.png

同樣,現(xiàn)在切回 master 分支,進(jìn)行一次快速合并到 dev2,查看日志

26.png

git merge 和 git rebase 的結(jié)果對(duì)比

使用 git rebase 后,3 個(gè)分支的歷史記錄如下

27.png

git merge 歷史記錄如下

28.png

總結(jié)

git merge 和 git rebase 進(jìn)行合并的區(qū)別:

  1. 歷史記錄不同
    • git merge 保留了各個(gè)分支各自的提交記錄,如果有解決沖突,會(huì)單獨(dú)創(chuàng)建一次 commit 記錄沖突的解決,歷史記錄完整。
    • git rebase 只有一根線的分支記錄歷史,手動(dòng)解決的沖突不會(huì)創(chuàng)建保留記錄,歷史記錄清晰簡(jiǎn)單
  2. 操作步驟不同
    • git merge 操作簡(jiǎn)單,
    • git rebase 操作步驟繁瑣。
  3. 影響范圍不同
    • git merge 操作未對(duì) dev1 和 dev2 的項(xiàng)目?jī)?nèi)容(或提交記錄)進(jìn)行異動(dòng),不會(huì)影響后續(xù)人員對(duì)此兩個(gè)分支進(jìn)行接續(xù)作業(yè)。
    • git rebase 操作已經(jīng)對(duì) dev1 和 dev2 分支進(jìn)行了異動(dòng),如果有后續(xù)分支使用了這兩個(gè)分支,可能會(huì)導(dǎo)致提交歷史記錄的混亂和其它異常情況。

建議:
只對(duì)尚未推送或分享給別人的本地修改執(zhí)行變基操作清理歷史,不要對(duì)已推送至別處的提交執(zhí)行變基操作。

29.png

個(gè)人建議
對(duì)于合并,如果始終不清楚 merge 和 rebase 的區(qū)別,推薦使用 merge。
merge 的一大優(yōu)點(diǎn)是簡(jiǎn)單,不會(huì)對(duì)其它分支造成影響。
唯一可能的不足就是會(huì)有比較多(不清晰)的提交記錄,這一點(diǎn)可以使用 git rebase -i <commit id="" style="box-sizing: border-box;">,進(jìn)入 interactive 模式(后續(xù)文章有介紹),對(duì)歷史記錄進(jìn)行修改</commit>

新手提醒:如果需要合并的分支還有未提交的修改,是沒(méi)有辦法合并的。

30.png

Bonus:修改分支的名字

假如從 master 分支創(chuàng)建了一個(gè) feature-branch 分支,結(jié)果寫(xiě)成了 future-brunch

31.png

直接使用git branch -m參數(shù)修改即可

git branch -m future-brunch feature-branch
32.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容