Git在rebase时如何保留merge commit(实用!)

前端下午茶

共 1564字,需浏览 4分钟

 · 2021-07-27

rebase是git中一个神奇的命令,可以让并行的提交,变得像线性开发的一样,最近发现rebase在遇到merge commit时可能和认知不太一样,本文通过一个例子来讲解下git rebase遇到merge commit时该如何应对

经典rebase

先来看下rebase的典型使用场景,假设我们有如下一个提交记录


当dev想同步上游(master)的修改时,有两种方案,一种是merge,一种是rebase

merge会创建一个commit节点,并且能够保留分支关系

$ git merge master


但是一般上游到下游的操作,是不需要保留分支关系的,rebase正是为了这个场景设计的,rebase会将dev上的节点,重新在master上重新创建一遍,看起来就是是在master分支最后开发的一样

$ git rebase master


至此就介绍完了rebase常规的使用场景

merge rebase

如果被rebase的分支上有merge commit,会发生什么呢?假设我们有如下的log tree(请原谅我懒得画图了^_^)

* 31ef4ec (HEAD -> master) e
| * b554f2d (dev) Merge branch 'test' into dev
| |\
| | * 853aaf6 (test) c
| * | 1af86fa d
| |/
| * c1b49a5 b
|/
* 763a350 a

master分支在dev分支后面又有了新的提交,dev分支合并了test分支,现在dev分支想同步master分支,继续使用rebase操作

* 8924fda (HEAD -> dev) c
* 06201b2 d
* e0c6b78 b
* 31ef4ec (master) e
| * 853aaf6 (test) c
| * c1b49a5 b
|/
* 763a350 a

可以rebase将merge commit抛弃了,同时test分支上的提交c的内容被patch到了dev分支上

这可能和我的认知不太一样,我希望的效果是继续保留merge commit,rebase 为我们提供--rebase-merges参数来这个问题

$ git rebase --rebase-merges master

看下log tree,变基成功了,merge commit被保留了,但test分支也被变基了,test分支上的commit还是被复制了一份

*   88e6cf7 (HEAD -> dev) Merge branch 'test' into dev
|\
| * e2fae10 c
* | 65869a2 d
|/
* e61592d b
* 31ef4ec (master) e
| * 853aaf6 (test) c
| * c1b49a5 b
|/
* 763a350 a

总结

最后建议大家merge和rebase尽量使用一种即可,即rebase的代码,不要包含merge commit;使用了merge操作,就不要在rebase了


最后



如果你觉得这篇内容对你挺有启发,我想邀请你帮我三个小忙:

  1. 点个「在看」,让更多的人也能看到这篇内容(喜欢不点在看,都是耍流氓 -_-)

  2. 欢迎加我微信「 sherlocked_93 」拉你进技术群,长期交流学习...

  3. 关注公众号「前端下午茶」,持续为你推送精选好文,也可以加我为好友,随时聊骚。


点个在看支持我吧,转发就更好了



浏览 43
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报