git merge squash 和 rebase 区别

声明:本文仅限于简书发布,其他第三方网站均为盗版,原文地址: merge squash 和 merge rebase 区别

在团队合作中,毫无疑问,我们需要一个版本管理工具,相对于 SVN 这种在我们看来是老古董的工具,Git 在年轻化的团队中更受欢迎。并不仅仅是跟着大神们(Linux系)的路子在走,所以感觉很牛逼,而是 Git 真的很牛逼,当然,牛逼的同时你需要的学习曲线也是很陡的。

这几天我就遇到了一个问题,其实也不是遇到问题,而是遇到了疑惑,那就是我在 github 系统中 merge 同时的 PR 的时候发现有好几个选项,但是,却说不清楚这几个选项分别代表什么含义,所以就稍微花了点时间了解了下,顺带做个总结。

merge 的几种形式

在 merge pr 的时候,默认是有三种选项的,分别是

  • 普通的 merge
  • rebase merge
  • squash merge

这其实对应于我们在合并分支的时候的几种方式,所以我就以本地分支的形式来说说有啥区别。

一个简单的模型

假设我们一开始的 master 分支上已经有了几个提交,就像这样:

image

然后,我们切出一条开发的分支,进行了一些 Feature 的开发,然后我们的分支可能就是这种情况:

image

这种情况还好,也比较常遇到,但是,现在问题来了,如果在这个时候 master 有了一些新提交(可能是其他分支合并进来的),那么这个时候情形就成了这样:

image

这个情况很有趣,但是我们不讨论,因为这和我们今天的主题无关,以后可以另外开一个话题来说,今天要说的是第二个情况。

普通 Merge

说到合并分支,可能我们最熟悉的操作是这样的:

  • 先切换到目标分支(master)
  • 执行命令:git merge devel
  • 删除旧分支(可以在上面一同做):git branch -D devel
  • 提交到远程分支:git push origin master

好像这样没啥问题的样子,但是这样操作之后,你知道结果是怎么样吗?假设合并之前的这样的:

15101478786848

我们这么一番操作之后,那么最后我们的分支的历史将会是这样的:

image

是的,看上去很不错,也是一条直直的 commit line,我们在 devel 分支中的 commit 也是一个不差得保留在了 master 中。但是,很多时候,我们并不需要那么多的 commit,假设你给一个开源项目提交一个 Bug Fixes,然后一个简单的修改因为你的粗心大意 pr 了十几个 commit 过去,如果作者给你 merge 了,这就在这个项目的历史长河中增加了十几个 commit 啊,以后的人看 commit history 估计都崩溃了吧;同时,对于你自己管理的项目来说,当你 merge 之后发现有问题,想回滚都蛋疼!

squash merge

在使用 git 的过程中,可能你遇到过想要合并多个 commit 为一个,然后很多人会告诉你用 git commit --amend,然后你发现里面有你的多个 commit 历史,你可以通过 pick 选择,squash 合并等等。同样得,merge 的时候也可以这么干,你只需要这么简单的两步:

  • 切换到目标分支:git checkout master
  • 以 squash 的形式 merge:git merge --squash devel

你会发现,在 master 分支上居然有未提交的修改,然后你就需要在 master 上主动提交了修改,注意,这里是你 commit 的,也就是改变了 commit 的 author。结果是这样的:

image

这里好了,比前面普通的 merge 来说,我们只有一个 commit 了,不管在分支中 commit 了多少,这里都只有一个!

rebase merge

但是,作为处女座的程序员肯定是不能忍受目前的情况的,因为我们既想合并 commits,又想保留作者的信息,那么有没有什么好办法呢?肯定是有的啦,这个时候我们可以尝试一下 rebase,操作步骤是这样的:

  • 先切换到 devel 分支(不一样咯):git checkout devel
  • 变基:git rebase -i master
  • 切换回目标分支:git checkout master
  • 合并: git merge devel

这里完成了第二步之后我想你应该大概知道发生了什么事了,我们在 devel 里面对照 master 进行了变基,所谓的变基其实就是找到两个分支共同的祖先,然后在当前分支上合并从共同祖先到现在的所有 commit,所以我们在第二步的时候会选择怎么处理这些 commit,然后我们就得到了一个从公共commit 到现在的单个 commit,这个时候别人讲我们这个 commit 合并到 master 也只会在 master 上留下一个 commit 记录,就像这样:

image

虽然这个 commit history 线看上去很不错,而且也比较符合实际情况,但是我们需要注意到的有点就是分支上的开发者需要自己执行变基操作,从而导致他的原始 commit history 变化了(可以理解成被合并了)。

对比

相比一下前面三种方式,我们可以总结出一些东西:

  1. rebase 可以尽可能保持 master 分支干净整洁,并且易于识别 author
  2. squash 也可以保持 master 分支干净,但是 master 中 author 都是 maintainer,而不是原 owner
  3. merge 不能保持 master 分支干净,但是保持了所有的 commit history,大多数情况下都是不好的,个别情况挺好

所以,相比这么多,我是推荐使用 rebase 的,但是,当你在使用过程中,你会发现它的要求有点高,[/手动哭脸]

Reference

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

推荐阅读更多精彩内容

  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,449评论 1 26
  • Git是目前最流行的版本管理系统,也是最先进的分布式版本控制系统(distributed version cont...
    pro648阅读 5,672评论 1 17
  • 照着“小进画论”的微信公众号画的,看着挺简单,画了两张才能见人!!!
    木南_1982阅读 284评论 0 1
  • 上班真累啊,太累了,事情那么多,还天天加班,给累出浑身病来,为了什么呀,仅仅为了自己的吃喝拉撒就得这么卖命的工作,...
    墨黎初心阅读 736评论 0 1
  • 清明节本想着好好睡睡觉的,没想到领导一声令下“回武汉”,只好拖着疲惫的身体回到武汉。有假期的人就是好,不像我们春节...
    夏野阅读 194评论 0 0