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

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

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

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


吐槽了大概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可以看到对应的方法

image.png

处理冲突

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

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

image.png

重置提交

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

git reset --soft commit_id  # 重置HEAD(当前分支顶端)到指定commits

这样我们本地就会出现未commit的文件了,这儿之所以用soft不会删除代码。

image.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功能,至此全文完毕,谢谢大家。


相关文章
|
Dubbo Java 应用服务中间件
从源码全面解析 dubbo 服务端服务调用的来龙去脉
从源码全面解析 dubbo 服务端服务调用的来龙去脉
|
6月前
|
传感器 人工智能 搜索推荐
教育随身而行——可穿戴设备如何赋能未来课堂?
教育随身而行——可穿戴设备如何赋能未来课堂?
151 16
|
12月前
|
边缘计算 人工智能 安全
阿里云边缘云连续四年蝉联第一
全球领先的IT市场研究和咨询公司IDC发布《中国边缘云市场跟踪研究,2023H2》报告,中国边缘公有云服务市场阿里云连续四年蝉联第一。
|
11月前
|
弹性计算 搜索推荐 安全
如何编写有效的Prompt模板:提升大模型性能的关键
在大模型应用中,编写有效的Prompt至关重要。本文介绍了如何编写高质量的Prompt模板,包括明确任务定义、选择高质量示例、优化任务指示和调整示例顺序。详细探讨了百炼平台提供的三种主要Prompt模板(ICIO、CRISPE、RASCEF)及静态和动态样例库的创建与应用,帮助提升模型性能。
781 0
|
12月前
|
存储 开发框架 开发工具
Electron有哪些使用场景
【10月更文挑战第13天】Electron有哪些使用场景
749 0
|
存储 关系型数据库 MySQL
MySQL中数据库的相关操作
MySQL中数据库的相关操作
299 62
|
JavaScript API
Vue3新的状态管理库-Pinia(保姆级别教程)
Vue3新的状态管理库-Pinia(保姆级别教程)
634 0
|
存储 小程序
【边做边学】uni.switchTab的目标页面获取不到url携的参数
【边做边学】uni.switchTab的目标页面获取不到url携的参数
687 1
在vscode下将ipynb文件转成markdown(.md文件)的方法
在vscode下将ipynb文件转成markdown(.md文件)的方法
2192 0
|
数据处理 数据格式
hook项目实例之原始数据形成ant design table表格 2
hook项目实例之原始数据形成ant design table表格
106 0