Git分支管理技巧-使用rebase让你的分支笔直生长

发现问题

之前写过一篇博客《30分钟教你轻松使用Git做代码管理》,其中有提到本地提交代码的一些步骤:

  1. 如果新参与一个项目,首先需要本地clone远程仓库。之后会有一个master(若不特殊说明,均指代本地master)和远端的master(以下称为remote/master)是关联的,即remote/master是本地master的up-stream。


    从远程仓库进行克隆
  2. 做开发时,要新建一个分支,如dev1,作为你的开发分支。开发完新特性后,将工作区(work tree)的修改提交至暂存区(index),然后commit,此时会在dev1分支上生成一个新的commit单号。


    提交你的修改
  3. 切换回master分支,然后使用pull或者fetch+merge命令与remote/master同步一下(此时可能会有来自其他开发者的提交),再合并(merge)dev1分支的,如果有冲突,则解决冲突。最后推送代码到远端仓库。


    更新本地主分支

    合并dev1分支,推送
    合并dev1分支,推送

    这是我刚开始实习时,常用的一个开发,推送代码的流程。久而久之,我发现了几个问题:

  • 在master分支上解决冲突,可能会有些风险。比如一不注意,冲突没有正确解决,导致本地修改与别人的修改混在一起,本来稳定的与远程保持同步的master分支被你改混乱了,且没有其他的备份了。

  • 在master分支上merge开发分支,如果master分支上有dev1没有的commit单号,则会产生一个携带merge信息的提交单。这个commit你也要推送到远端。企业开发一般会有一个评审分支,主管会对commit单号进行review,然后submit合并进remote/master分支中。merge信息的提交单也会让reviewer做一次review,然而没什么必要的。

  • 一个人提交时,会有一个merge commit,那么10个人提交,就会有10个merge commit,此时分支树看起来会很混乱。零零散散的merge commit信息穿插在你的特性commit之间。

因此,我考虑使用另外一种本地分支管理策略,来改善这样的问题。

使用rebase命令。

先简要说下rebase命令的作用。

比如在dev1分支上,你提交了2个单,c1和c2。然后你在dev1分支上将master分支rebase到当前分支git rebase master。此时,如果master分支已经与remote/master做了同步,更新了2个来自其他人的提交,c3和c4。

场景描述

rebase会做如下操作:

  1. 把dev1分支上的c1和c2“拆”下来,并临时保存成c1'和c2'。git里将其称为patch
  2. 将master分支上更新的提交c3和c4合并进dev1分支上。


    rebase操作,拆分提交
    rebase操作,拆分提交
  3. 将c1'和c2',再按顺序接在c3和c4的提交后面,如果没有冲突,则rebase成功。此时c1'和c2'虽然和c1和c2的修改完全一样,但却已经不是原来的提交了,commit id已经变化了。
    连接patch

    此时dev1分支包含master分支的所有commit,并且超前了两个commit。如果你现在切换至master分支,并执行git merge dev1操作,由于没有不同于dev1的提交,merge操作就不会产生merge commit了。此时推送代码,也只会有两个commit。同时,master分支树笔直前进,分支很清晰地展示一个个提交。并且,上述的更新和提交代码的过程,是在dev1分支上修改冲突的,相对来说会比在master分支上修改更安全,如果不小心改混了,也能通过切换回master分支来找到稳定代码。
    在master分支上合并dev1分支

    基于上述内容,可以使用如下流程来提交代码:

  1. 在dev1分支上进行开发,然后commit提交,在dev1分支上生成一个提交单。
  2. 切换到master分支,与remote/master分支同步。
  3. 切换回dev1分支,将master分支rebase到dev1分支上,如果有冲突,修改冲突。rebase操作的冲突修改与merge不一样,修改完冲突后,保存进index,然后直接git rebase --continue即可,不同再多做一次提交。
  4. 切换回master分支,合并dev1分支,此时合并会非常顺畅。然后push。

rebase的风险

之前提到,rebase会将当前分支的新提交拆下来,保存成patch,然后合并进其他分支新的commit,最后将patch接进当前分支。这是rebase对多条分支的操作。对于单条分支,rebase还能够合并多个commit单号,将多个提交合并成一个提交。

git rebase -i [commit id]命令能够合并(整改)commit id之前的所有commit单。加上-i选项能够提供一个交互界面,分阶段修改commit信息并rebase。

但这里就会出现一个问题:如果你合并多个单号时,一不小心合并多了,将别人的提交也合并了,此时你本地的commit history和远程仓库的commit history不一样了,无论你如何push,都无法推送你的代码了。如果你并不记得rebase之前的HEAD指向的commit的commit ID的话,git reflog都救不了你。

tips: 你可以push时带上-f参数,强制覆盖远程commit history,你这样做估计会被打,因为覆盖之后,团队的其他人的本地commit history就与远程的不一样了,都无法推送了。

因此,请保证仅仅对自己私有的提交单进行rebase操作,对于已经合并进远程仓库的历史提交单,不要使用rebase操作合并commit单。

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

推荐阅读更多精彩内容

  • 四、 分支开发工作流 现在你已经学会新建和合并分支,那么你可以或者应该用它来做些什么呢? 在本节,我们会介绍一些常...
    常大鹏阅读 2,031评论 3 24
  • 文| 烂君 ​ “你们几个准备好红包啊!” 喝酒开心时阿道总这么说,他和女朋友感情很稳定,坚信最后一定会过上一儿一...
    烂人君子阅读 411评论 0 0
  • 有人为了拿五杀,通宵达旦,恶战开黑小学生,绝不投降。有人为了见爱人,翻透口袋,穷到只剩公车费,也要赴约 。也有人...
    托尼阳工作室阅读 69评论 0 1
  • 今天中午去找中医大夫做了理疗,采用针灸的方式为我清理体内湿气,这是中医的治疗方式和专用术语,不做过多的表述。数了数...
    digman阅读 188评论 0 0
  • 毫无征兆,不知不觉,看到一部电影火了,就是情人节上映的《五十度灰》,在中国还没上映,只能看各色评论,短片花絮。说实...
    吴国荣阅读 302评论 0 2