《Git/Gitlab进阶》九:测试merge和rebase分支合并、解决冲突及特征对比

本章主要测试讲解

  • git mergegit rebase指令的用法和进行分支合并,并做简单比较分析。

测试过程内容较多,每个步骤都逐一截图以便真实说明,也有列示用法。若不感兴趣,可直接查看总结部分。

测试过程

前置说明

关于无论是使用 merge 还是 rebase 进行合并,出现冲突的原因都是在不同的分支修改了同一处的代码,合并时版控工具 git 不知道保留哪一份的修改,从而导致冲突,需要合并人员去判断并解决。

使用 merge 和 rebase 合并的做法

1.png

大概流程:

测试 git merge 和 git rebase 的合并及解决冲突效果:

  • 1 准备测试项目及分支记录
    • 创建 master、dev1、dev2 三个分支
    • 除了 master 创建 dev1 和 dev2 的初始提交外,3 个分支各自有两个不同的提交记录
      • 时间顺序为:
        master 新建空文件,再初始提交 –>
        创建 dev2 –> dev2 commit 第一次文件修改 –> dev2 commit 第二次文件修改 –>
        切回 master 创建 dev1 –> dev1 commit 第一次文件修改 –> dev1 commit 第二次文件修改 –>
        切回 master –> master commit 第一次文件修改 –> master commit 第二次文件修改 –>
        进行使用 git merge/git merge 合并测试……
  • 2 使用 git merge 进行合并
  • 3 使用 git rebase 进行合并
  • 4 对比两者合并的历史记录,分析优缺点和使用场景

测试步骤

准备测试项目及分支记录

相关命令请看截图

准备测试项目 test-conflict,新建一个 test1.txt 文件(后续新建的文件,最好都改成 UTF-8,windows 下默认是 ANSI,操作可能会产生乱码),内容为空,并 master 分支初始提交。

2.png

以 master 分支创建 dev2 分支

3.png

dev2 以 master 分支为基准,所以 test1.txt 还是为空的,两次修改 test1.txt

4.png

此时 dev2 的历史记录为

5.png

切换到 master 分支,并创建分支 dev1 并修改文件 test1.txt,然后分别提交

6.png

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

7.png

此时 dev1 的日志记录如下

8.png

此时切回到 master 分支,自行也修改并提交两次 test1.txt 的修改

9.png

此时 master 分支的记录为

10.png

直至,准备工作完整,我们打包一份,保留 2 个一模一样的项目,一个测试 git merge,一个测试 git rebase

使用 git merge 进行合并测试

步骤说明:

  • 切换到 master 分支,先合并 dev1 到 master,再合并 dev2 到 master
  • 因为 dev1、dev2 和 master 原本分支都有修改到 test1.txt 的同一行,所以会出现多次的合并冲突,需要手动解决
  • 合并完成之后,查看 git merge 的 master 的日志

创建时现有 dev2 的提交,但是合并时,先合并 dev1
合并 dev1 到 master,出现冲突

11.png

手动解决冲突并提交

12.png

再合并 dev2 到 master,依然报冲突

13.png

手动解决并提交

14.png

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

15.png

至此使用 git merge 合并和解决冲突测试完成。

使用 git rebase 合并冲突

使用之前的备份项目测试 git rebase

步骤说明:

  • 切到 dev1 分支,rebase dev1 到 master,解决合并冲突
  • 切回 master 分支(此时 master 的日志还没变),进行一次快速合并到 dev1(现在就变了)
  • 切到 dev2 分支,rebase dev2 到 master,解决合并冲突
  • 切回 master 分支,进行一次快速合并到 dev2
  • 合并完成之后,查看 git rebase 的 master 的日志

切回 dev1 分支,rebase dev1 到 master,会产生冲突。

16.png

修改成以下内容之后,再执行 git add .(没有执行 commit),然后继续进行 rebase

17.png

继续进行 rebase,则弹出第二次冲突提示

18.png

从文本来看,因为有两行是冲突的,第一次解决冲突是 master 中于 dev1 第一次提交有冲突的内容,现在报的是与 dev1 第二次提交有冲突的内容,同样手动解决,然后继续,可见 rebase 完成。

19.png

至此,使用 rebase,已经把 dev1 上的两次提交的修改变基到了 master 分支的提交修改上。

现在切回 master 分支(当然,此时 master 的日志还没变),进行一次快速合并到 dev1(现在就变了)

20.png

同样的,再合并 dev2,同样解决两次冲突,
第一次冲突

21.png

解决如下

22.png

第二次冲突

23.png

解决如下:

24.png

合并完成

25.png

同样,现在切回 master 分支,进行一次快速合并到 dev2,查看日志

26.png

git merge 和 git rebase 的结果对比

使用 git rebase 后,3 个分支的历史记录如下

27.png

git merge 历史记录如下

28.png

总结

git merge 和 git rebase 进行合并的区别:

  1. 历史记录不同
    • git merge 保留了各个分支各自的提交记录,如果有解决冲突,会单独创建一次 commit 记录冲突的解决,历史记录完整。
    • git rebase 只有一根线的分支记录历史,手动解决的冲突不会创建保留记录,历史记录清晰简单
  2. 操作步骤不同
    • git merge 操作简单,
    • git rebase 操作步骤繁琐。
  3. 影响范围不同
    • git merge 操作未对 dev1 和 dev2 的项目内容(或提交记录)进行异动,不会影响后续人员对此两个分支进行接续作业。
    • git rebase 操作已经对 dev1 和 dev2 分支进行了异动,如果有后续分支使用了这两个分支,可能会导致提交历史记录的混乱和其它异常情况。

建议:
只对尚未推送或分享给别人的本地修改执行变基操作清理历史,不要对已推送至别处的提交执行变基操作。

29.png

个人建议
对于合并,如果始终不清楚 merge 和 rebase 的区别,推荐使用 merge。
merge 的一大优点是简单,不会对其它分支造成影响。
唯一可能的不足就是会有比较多(不清晰)的提交记录,这一点可以使用 git rebase -i <commit id="" style="box-sizing: border-box;">,进入 interactive 模式(后续文章有介绍),对历史记录进行修改</commit>

新手提醒:如果需要合并的分支还有未提交的修改,是没有办法合并的。

30.png

Bonus:修改分支的名字

假如从 master 分支创建了一个 feature-branch 分支,结果写成了 future-brunch

31.png

直接使用git branch -m参数修改即可

git branch -m future-brunch feature-branch
32.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容