吭哧吭哧开发2周,老板突然说这个功能不要了。。。

640?wx_fmt=png

今天老板突然给我说,涛总,我们Y功能不要了哈,你从生产环境给下掉吧。

什么???我辛辛苦苦写了半个月的功能就不要了,还没用几天呢?大哥你这是在逗我么?虽然你比我长得帅,但是也不能这样玩儿我吧。

640?wx_fmt=gif

吐槽了大概2个小时之后,我还是老老实实的继续搬砖,毕竟工作还是要继续的,我不吃饭,我娃还要吃饭的嘛。

作为一名优秀兼具高级搬砖农民工,要下线某一个功能,无非是要把关于这个功能的代码都回退了嘛,直接到代码库点几个按钮的事儿,还是简单,直接干,分分钟的事儿嘛。

到代码库一看傻眼了,因为这个功能比较大涉及了多次提交合并啊,中间还穿插了很多其他的提交,并且还做数据库表的变更啊,不是那么简单啊。

嗯,就是因为不那么简单,老板才把这么「艰巨」的任务给我了,于是我想了300秒,发现无非是git的玩法嘛。

解决步骤如下:

  1. 回退提交:通过git revert commit_id 回退某个提交,我这里面操作了大概8次提交

  2. 处理冲突:回退过程中,估计会有冲突,要注意处理冲突。

  3. 重置提交:由于回退涉及了数据库表的变更,我们不能把migrations代码回退了。

  4. 处理数据库变更:最后重新生成数据库的变更 migrations

  5. 合并提交:回退生成了多个提交,我们通过reset操作,进行合并rebase一下合并多个revert提交。

  6. 跑测试

上面就是关于整个回退操作,大概的解决方案就是这样了,如果你已经知道了,本文就不用往下看了,如果不清楚,下面我再来细细聊一下:

回退提交

我们要下线某一个功能首先是需要回退代码,回退主要是revert操作

git revert commit_id 回退某个提交,并且重新生成提交的方式
通过 git revert --help可以看到对应的方法

640?wx_fmt=png

处理冲突

由于代码之间跨度较大,回退的过程可能会有一定冲突,这里面我主要使用 git 的 mergetool的可视化工具进行操作,对比工具可以使用 gvimdiff/kdiff3/meld/vimdiff。

git mergetool -t vimdiff # 这里面大家可以通过help的方式进行学习。

640?wx_fmt=png

重置提交

我们把代码都进行revert掉生成了新的提交之后,再进行

git reset --soft commit_id  # 重置HEAD(当前分支顶端)到指定commits
这样我们本地就会出现未commit的文件了,这儿之所以用soft不会删除代码。

640?wx_fmt=png

处理数据库变更

上面我提到了我们需要额外处理数据库的代码的migrations,为什么需要这样呢?我们以在Python Django框架为例子,我们数据库变更通过migrations文件,大概内容如下:

# 0123_auto_20180614_12.py

from __future__ import unicode_literals

from django.db import migrations, models
class Migration(migrations.Migration):

    dependencies = [
        ('XXXX''0122_address'),
    ]

    operations = [
        migrations.RenameField(
            model_name='YYY',
            old_name='ZZZ',
            new_name='MMMM',
        ),
        migrations.AddField(
            model_name='AAAA',
            name='NNN_id',
            field=models.CharField(blank=True, db_index=True, default=b'', help_text='test', max_length=30, verbose_name='test'),
        ),
    ]

我们回退代码,会把这个文件给删除掉,由于数据库上下有依赖,这里我们只需要删除model的某个字段就行了(而不需要去删除这个文件migraionts)。

所以这儿我们要单独处理掉migrations文件的变更(不回退变更文件,只把model变更的代码回退就行),到时候我们重新进行生成新的migrations文件。

合并提交

最后这一步其实可以不用操作了,因为回退操作,我们已经做完了,但是出于习惯,我们通过rebase的方式进行合并多个提交,让多个revert的操作最后只剩下一个,整个提交目录树看起来更为整洁干净。这样后期如果我们需要这个功能的时候也能很方便找回来。

操作如下:

git rebase -i HEAD~3 # 以交互形式把最近三个提交合并

rebase常用就是把一个分支修改合并到另一个分支,由于较为复杂,这里面我就不过多进行解释了,大家可以自行去查看。

最后我们就可以提交我们代码发起新的Pull Request进行合并了,然后跑单元测试,集成测试,黑盒等等,然后上线代码,下线我们Y功能,至此全文完毕,谢谢大家。

往期阅读:

聊聊最近的几件小事儿 

第5次赠书,无套路包邮送14本书,赶紧来!

640?wx_fmt=jpeg

喜欢请给我个「好看」

猜你喜欢

转载自blog.csdn.net/wuShiJingZuo/article/details/88324869