数据里的“平行宇宙”:用分支管理实现数据的版本控制

大数据领域数据架构的版本控制与管理 想象一下:你所在的公司用数据湖存储了10年的用户行为数据,上周刚上线了基于Hudi的增量更新功能,今天业务部突然说“需要恢复3个月前的用户标签计算逻辑”——但没人记得当时的ETL脚本长什么样;或者数据团队有5个人同时修改同一个Hive表的分区规则,结果A改了字段类型,B删了分区字段,最后系统直接报错。这些场景的核心问题,就是大数据架构的版本失控。 阅读详情

适用版本提示:本文提及的 Data Branch 功能适用于 MatrixOne v3.0 及以上版本。

我们想解决的不是“怎么再备份一份”,而是这三件事:随时落一个可靠锚点、开出互不打扰的试验台、把变更做成可审阅/可回放的补丁。


序幕:双线并行的一张表,怎么不互相踩?

“今晚必须把风控规则修掉。”
“同时运营要做活动,数据得按新口径重算。”
“你们都别动 orders 表,我先拷一份出来吧……”

这句“我先拷一份”,在很多团队里几乎是条件反射:复制库、复制表、复制到新集群、再把一堆脚本跑一遍。
问题也跟着来:

  • 拷贝很慢(数据越大越慢),而且越急越容易拷错、漏拷
  • 成本很高(存储、带宽、算力、时间都在烧)
  • 最麻烦的是:你很难说清楚“到底改了哪些数据”,更难把它“有选择地带回去”

MatrixOne Data Branch 想做的,是把这件事改造成一种“像工程一样可重复”的流程:不靠一堆临时副本,也不靠口头约定。


1. 先把目标说清楚:我们需要的是 5 个动作

如果把“数据变更”当成主角,那工作流里最常用的动作其实就五个:

  1. Snapshot:在你动手之前,先留一个“可回到的点”
  2. Clone/Branch:从这个点开出一张“试验台”(隔离修改)
  3. Diff:把试验台上的改动“讲清楚”(可审阅、可追溯)
  4. Merge:把“确认正确的改动”带回主表(并处理冲突)
  5. Restore:如果后悔了,回到那个点(止血优先)

在 MatrixOne 里,这些动作都能用 SQL 串起来:CREATE SNAPSHOT、DATA BRANCH DIFF、DATA BRANCH MERGE、RESTORE ... FROM SNAPSHOT,再配合 CLONE(或新版本中的专用创建语义)把“分支表”拉出来。


2. 一段可复现的“剧情脚本”:两条线并行修改,同步回主表

下面这套 SQL 你可以按顺序跑一遍,感受它和“复制数据库做实验”的区别。

2.1 第一幕:主表就绪,先把“锚点”打上

drop database if exists demo_branch;
create database demo_branch;
use demo_branch;

create table orders_base (
  order_id     bigint primary key,
  user_id      bigint,
  amount       decimal(12,2),
  risk_flag    tinyint,           -- 0=normal, 1=high risk
  promo_tag    varchar(20),
  updated_at   timestamp
);

insert into orders_base values
(10001, 501,  99.90, 0, null, '2025-12-01 10:00:00'),
(10002, 502, 199.00, 0, null, '2025-12-01 10:00:00'),
(10003, 503,  10.00, 0, null, '2025-12-01 10:00:00');

create snapshot sp_orders_v1 for table demo_branch orders_base;

你可以把 sp_orders_v1 理解成“所有人都认可的起跑线”。后面无论怎么折腾,都能回得来。

2.2 第二幕:开两张试验台(风控线 / 活动线)

如果你的版本支持专用“创建分支表”语义,可以直接用它;如果没有,也可以用 CLONE 方式(两者的使用体验是一样的:从快照视图拉出一张新表用于独立改动)。

-- Option A: CLONE (works as a branch table in current versions)
create table orders_riskfix clone orders_base {snapshot='sp_orders_v1'};
create table orders_promo  clone orders_base {snapshot='sp_orders_v1'};

-- Option B: if your version supports it
-- data branch create table orders_riskfix from orders_base{snapshot='sp_orders_v1'};
-- data branch create table orders_promo  from orders_base{snapshot='sp_orders_v1'};

[!NOTE]
技术原理小贴士:为什么建分支这么快?
MatrixOne 的快照和分支基于 Copy-on-Write (CoW) 机制。创建分支时,并没有真的复制一份数据,而是建立了一个指向原数据的引用。只有当你开始修改分支表时,存储层才会为变更的数据块分配新空间。所以,无论原表有几百 GB 还是 TB 级,建分支都是毫秒级的,且几乎不占额外存储。

2.3 第三幕:两条线各自修改,互不干扰

-- Risk-fix line
update orders_riskfix
   set risk_flag = 1,
       updated_at = '2025-12-01 10:05:00'
 where order_id = 10002;

delete from orders_riskfix where order_id = 10003;
insert into orders_riskfix values
(10003, 503, 10.00, 0, 'repaired', '2025-12-01 10:06:00');

-- Promo line
update orders_promo
   set promo_tag = 'double11',
       amount = amount * 0.9,
       updated_at = '2025-12-01 10:07:00'
 where order_id in (10001, 10002);

insert into orders_promo values
(10004, 504, 39.90, 0, 'double11', '2025-12-01 10:07:30');

这一步最关键的感受是:你不用先复制一份 TB 级数据,也不用担心“我改表会不会把别人搞崩”。两条线天然隔离,谁也不需要“先等等我”。

2.4 第四幕:把“改了什么”说清楚(Diff)

为了让 diff 可重复、可定位,一般会给分支表再打一次快照:

create snapshot sp_riskfix for table demo_branch orders_riskfix;
create snapshot sp_promo   for table demo_branch orders_promo;

data branch diff orders_riskfix{snapshot='sp_riskfix'}
  against orders_promo{snapshot='sp_promo'};

执行结果示意(你会看到每一行具体的差异):

diff orders_riskfix against orders_promo   flag     order_id   risk_flag   promo_tag   amount
orders_promo                               UPDATE   10001      0           double11    89.91
orders_riskfix                             UPDATE   10002      1           null        199.00
orders_promo                               UPDATE   10002      0           double11    179.10
orders_riskfix                             UPDATE   10003      0           repaired    10.00
orders_promo                               INSERT   10004      0           double11    39.90

DATA BRANCH DIFF 会把两边的行级差异列出来(插入/删除/更新),让“数据变更”从口头描述变成可以审阅的结果。

2.5 第五幕:把确认的改动带回主表(Merge + 冲突策略)

-- Merge risk fix first
data branch merge orders_riskfix into orders_base;

-- Then try promo (choose a conflict strategy if needed)
data branch merge orders_promo into orders_base when conflict skip;
-- data branch merge orders_promo into orders_base when conflict accept;

这里的“冲突”你可以把它理解成:两条线都动到了同一行、同一主键,目标表应该听谁的。
FAIL/SKIP/ACCEPT 三种策略,让你把“合并规则”写进 SQL,而不是写进微信群里。

2.6 第六幕:不满意就回到起跑线(Restore)

如果合并后发现方向不对,先止血:

restore database demo_branch table orders_base from snapshot sp_orders_v1;

这句 SQL 的意义不是“把你当成不会操作的人”,而是把“回退”从高风险操作变成常规动作:敢试验,才跑得快。

2.7 第七幕:测试结束,清理环境

-- 无论是测试还是正式环境,用完即焚是好习惯
drop database demo_branch;

3. 一张图把流程连起来(主表 / 分支表 / diff / merge / restore)

在这里插入图片描述


4. 进阶:把 diff 做成“补丁文件”,跨集群/跨环境重放

很多团队真正头疼的不是“我能不能 diff/merge”,而是这些工程问题:

  • 预发需要每天刷新,但不想整库搬运
  • 灾备演练想验证“能不能把关键变更快速补齐”
  • 多集群部署时,希望把变更从 A 端“带到” B 端,而不是重新跑一遍脚本

Data Branch 提供了一个很实用的落点:把 diff 输出成文件。文件就是补丁:能带走、能存档、能在别处回放。

4.1 把 diff 输出到本地目录

data branch diff branch_tbl against base_tbl output file '/tmp/diffs/';

执行后系统会明确告诉你文件去哪了,以及怎么用它:

+---------------------------------------------+-------------------------------------------------------+
| FILE SAVED TO                               | HINT                                                  |
+---------------------------------------------+-------------------------------------------------------+
| /tmp/diffs/diff_branch_base_20251219.sql    | DELETE FROM demo_branch.orders_base, REPLACE INTO ... |
+---------------------------------------------+-------------------------------------------------------+

如果是全量同步(即目标表为空),则会生成 CSV 文件:

+---------------------------------------------+-----------------------------------------------------------------------------------+
| FILE SAVED TO                               | HINT                                                                              |
+---------------------------------------------+-----------------------------------------------------------------------------------+
| /tmp/diffs/diff_branch_base_init.csv        | FIELDS ENCLOSED BY '"' ESCAPED BY '\\' TERMINATED BY ',' LINES TERMINATED BY '\n' |
+---------------------------------------------+-----------------------------------------------------------------------------------+

输出结果会告诉你文件保存位置,同时给出导入/执行提示。常见形态是两类:

  • CSV:更适合“目标为空/初始化”的全量导入
  • .sql:更适合“目标非空/增量同步”的补丁回放(通常由 DELETE FROM ... + REPLACE INTO ... 组成)

4.2 把 diff 直接写到 stage(例如 S3)

Stage 是 MatrixOne 用于连接外部存储(如 S3、HDFS 或本地文件系统)的逻辑对象。

为什么要引入这个概念? 主要是为了安全和解耦:

  1. 屏蔽密钥:无需在每次执行 SQL 时都暴露 AK/SK,管理员配置一次 Stage,开发者直接用别名即可。
  2. 统一路径:将复杂的 URL 路径封装成简单的对象名,像挂载磁盘一样使用对象存储。
create stage stage01 url =
  's3://bucket/prefix?region=cn-north-1&access_key_id=xxx&secret_access_key=yyy';

data branch diff t1 against t2 output file 'stage://stage01/';
+-------------------------------------------------+-------------------------------------------------------+
| FILE SAVED TO                                   | HINT                                                  |
+-------------------------------------------------+-------------------------------------------------------+
| stage://stage01/diff_t1_t2_20251201_091329.sql  | DELETE FROM test.t2, REPLACE INTO test.t2             |
+-------------------------------------------------+-------------------------------------------------------+

这让“把补丁发给另一个集群”变得很直白:源端写到对象存储,目标端拿到文件即可。

4.3 回放补丁:执行 SQL 或导入 CSV

  • 回放 SQL(增量):在目标集群执行生成的 .sql 文件即可(MatrixOne 兼容 MySQL 协议)
  • 导入 CSV(初始化):用 LOAD DATA 把 CSV 导入目标表即可

[!TIP]
小技巧:不离开终端查看补丁内容
如果文件还在 Stage 上,你可以直接用 SQL 查看它的内容,确认无误后再执行:

select load_file(cast('stage://stage01/diff_t1_t2_xxx.sql' as datalink));

示意(SQL 文件回放):

mysql -h <mo_host> -P <mo_port> -u <user> -p <db_name> < diff_xxx.sql

示意(CSV 导入):

load data local infile '/tmp/diffs/diff_xxx.csv'
into table demo_branch.orders_base
fields enclosed by '"' escaped by '\\' terminated by ','
lines terminated by '\n';

5. 落地小抄:把它变成团队习惯,而不是一次“炫技”

如果你准备把 Data Branch 用进真实项目,下面这几条比“会不会写 SQL”更重要:

  • 先定命名规则:快照名、分支表名要能一眼看懂用途(例如 sp_orders_yyyymmdd_hhmm)
  • 关键表要有主键/唯一键:diff/merge 的可控性依赖于“怎么定位一行数据”
  • 把 diff 当成评审材料:让数据变更也能做 review(尤其是高风险口径调整)
  • 先小表试流程:把“创建 → 修改 → diff → merge → restore” 跑顺,再扩到核心链路

延伸阅读

【SourceTree】项目版本控制 目录一、下载二、基本概念三、本地使用3.1、仓库的创建和提交 一、下载 官网正常下载安装即可. 二、基本概念 简单介绍一下,SourceTree是和Github一样的一个基于Git的版本控制软件。其他基本概念: 三、本地使用 一个人开发,一台主机,不需要同步内容。 3.1、仓库的创建和提交 先新建一个工作文件:workspace 再打开下载好的SourceTree软件: 点击Create,加入刚才新建的工作文件workspace: ... 阅读详情

相关推荐

C#版本控制的终极武器:从代码宇宙到企业级版本黑洞防御

企业级系统开发中,版本控制是确保代码稳定性和可追溯性的关键。本文通过C#生态探讨了如何构建“版本黑洞防御系统”,包括变更追踪、合并策略和自动化审计。重点解析了IChangeTracking接口的对象级变更感知机制,以及如何结合Git的原子提交策略实现精准版本管理。同时,通过模拟GitFlow分支策略和冲突解决机制,展示了自动化合并工具的设计思路。这套方案将技术风险转化为可控流程,为企业级开发提供了可落地的版本控制实践。

墨夶的博客 1732

Git | Git 版本控制 —— 空间法则 — 分支管理

假设你们团队准备开发一个系统,这个系统比较大,包含了前端、后端、数据库,你一个人写时间不够,此时就可以让你团队中的小伙伴来协作你进行开发,一个人负责前端、一个人负责后端、一个人负责数据库,这样就有三条子分支了。由于通过 Git 创建、合并和删除分支非常快,所以 Git 鼓励用户使用分支完成某个任务,等任务完成了再合并后删除该分支,这和直接在 master 分支上工作的效果是一样的,但是过程会更加安全。随后我们每次提交,master 分支都会向前一步,这样,随着你的不断提交,master 分支也将越来越长。

Blue17 の 小窝 1045

Selenium测试代码版本控制:Git最佳实践与协作流程

本文旨在为自动化测试工程师和开发团队提供一套完整的Git版本控制实践指南,特别针对Selenium测试代码的管理。我们将覆盖从基础配置到高级协作技巧的全方位内容,帮助团队建立高效的测试代码管理流程。本文将首先介绍Selenium测试代码版本控制的基本概念,然后深入探讨Git在测试代码管理中的具体应用,包括分支策略、合并技巧和冲突解决。接着我们会讨论团队协作流程和最佳实践,最后通过实际案例展示如何将这些原则应用到真实项目中。Selenium: 一个用于Web应用程序测试的自动化工具Git。

项目管理的博客 990

平行宇宙部署员:给每个分支版本写墓志铭

摘要:软件测试从业者通过为代码分支撰写"墓志铭",建立了一套完整的分支生命周期管理体系。这种实践将测试活动深度嵌入版本控制流程,包含三个核心维度:1)基于Git的分支隔离与验证,确保每个功能、热修复或发布分支都有独立测试集;2)通过IaC管理测试环境,实现动态配置与数据安全;3)建立自动化测试门禁和缺陷追踪机制,量化质量指标。案例显示,系统化的分支墓志铭实践能减少30%回归缺陷,既是对技术债务的警示,也是团队知识沉淀的有效载体。这种创新方法将传统的版本控制提升为可度量的质量文化实践。

2501_94471289的博客 387

C#机器学习模型版本控制实战:从代码到宇宙的版本管理

C#机器学习模型版本控制指南 本文介绍了C#机器学习项目的版本控制全流程,重点解决数据漂移、代码混乱和模型爆炸三大痛点。核心方案采用Git+DVC+ML.NET工具链: 代码版本:Git管理代码变更,分支策略隔离实验与生产 数据版本:DVC实现大型数据集版本控制,支持快速回滚 模型版本:ML.NET自动添加时间戳/版本号,Azure ML实现部署管理 工业案例展示了电商图像分类系统的版本号规则(v2.1.0)和自动化日志。高级技巧包括模型回滚、强名称程序集配置,以及Azure DevOps的CI/CD集成。

墨夶的博客 701

C#需求变更的“时间机器”:版本控制的终极救赎指南!

摘要 本文介绍如何利用Git版本控制和语义化版本管理(SemVer)有效应对软件开发中的需求变更问题。通过Git分支策略避免"主干地狱",使用SemVer规范(MAJOR.MINOR.PATCH)明确版本兼容性边界。文章详细展示了C#项目中版本控制的实践方法:包括特性分支管理、冲突解决、版本号自动化升级脚本、程序集绑定重定向技术,以及通过IChangeTracking接口和审计日志实现变更追踪。最后强调将版本控制与CI/CD集成,使其成为需求变更管理的有效工具,而非简单的代码备份手段。

墨夶的博客 483

在数据库里玩“平行宇宙”:MatrixOne Data Branch 让数据也拥有Git 的分支/合并/对比/回滚(含跨集群同步)

这篇文章讲一件事:当数据像代码一样频繁迭代时,数据库内生的“分支工作流”会比备份/复制更可靠、更省钱、更工程化。

MatrixOrigin的博客 1156

bcftools学习笔记(一)

欢迎关注"生信修炼手册"!本篇主要介绍index, view, query, sort, reheader这五个命令。1. indexindex命令用于对VCF文件建立索...

庐州月光的博客 6012

Git 分支管理完全指南:从基础到团队协作

本文系统讲解了Git分支管理的核心概念与实战技巧。首先阐述了分支的三大意义:并行开发、风险隔离和版本回溯。接着详细介绍了分支基础操作(创建/切换/查看)、进阶操作(合并/删除/冲突解决)以及分支管理规范(禁用Fast-forward模式、分支策略、bug修复流程)。重点强调了团队协作中分支管理的重要性,包括如何正确处理合并冲突、使用stash暂存工作区、规范临时分支管理等实用技巧。文章既适合Git新手入门学习,也为团队协作提供了可落地的分支管理方案,帮助开发者提升效率、降低线上风险。通过科学的Git分支管理

心向往之,行必能至 2465

保姆级教程:在Ubuntu 20.04上从源码编译Apollo自动驾驶平台(含GPU环境配置)

本文提供了一份详细的Ubuntu 20.04上从源码编译Apollo自动驾驶平台的保姆级教程,包括GPU环境配置、Docker部署和编译构建等关键步骤。通过实战经验和避坑指南,帮助开发者高效完成Apollo平台的编译和验证,适用于自动驾驶技术研究和应用开发。

weixin_30876945的博客 409

亚马逊SP-API授权实战:从OAuth流程到Refresh Token获取

本文详细解析了亚马逊SP-API授权流程,从OAuth认证到Refresh Token获取的全过程。通过实战经验分享,帮助开发者快速掌握Marketplace Appstore、Website Workflow和自行授权三种方式,解决常见错误如MD5100和MD9999,并提供了安全存储Refresh Token的最佳实践。

weixin_30379531的博客 519

分支管理(一):创建、切换与合并,体验“平行宇宙”

在 Git 里,分支仅仅是一个指向某个提交对象的可移动指针。创建一个新分支,其实就是创建了一个新的指针,让你可以在当前工作基础上分叉出一条独立的开发线。不同分支上的修改相互隔离,直到你明确将它们合并。分支是 Git 的核心功能,让你在隔离环境中自由开发,不影响主线。创建并切换分支,是最常用的操作之一。git merge将分支上的工作合并到当前分支,默认采用快进模式。合并完成且确认不再需要后,应及时用删除分支,保持仓库整洁。养成良好的分支习惯:为每个独立功能或修复都新建一个分支。

2301_80720675的博客 364

蓝桥杯嵌入式(基础教程)STM32G431RBT6——创建工程以及点灯

首先选择正确的芯片类型:STM32G431RBT6工程的创建主要有配置时钟以及烧录的方式。在配置好之后需要对时钟进行配置,由于蓝桥杯的外部晶振是24MHz因此需要对时钟树进行相应的配置。第一步先点击时钟配置之后就可以对时钟进行相应的配置了最后一步,需要对工程起一个名字,并且要选择KEIL做为其相应的软件之后再需要再生成代码那里进行相应的控制。当然这样根据生成的工程不能直接使用会有一个报错,所以需要添加一个启动文件。这个启动文件可以在官方的LCD文件夹下复制到自己的工程中。

m0_74051113的博客 1093

【PHP开发900个实用技巧】719.Git版本控制:PHP团队协作的“时空穿梭机”

编程如同时空探险,而Git是你最可靠的时光飞船。那些曾让你彻夜难眠的代码冲突、版本丢失、团队扯皮,终将成为宇宙中的星辰碎片。记住:每一次优雅的。

744

机器学习入门指南:Jupyter Notebook实战

对于机器学习工程师而言,他们更擅长的是算法、模型、数据探索的工作,而对于工程化的能力则并不是其擅长的工作。Jupyter Notebook生成PMML文件1​​​​​​​。Jupyter Notebook生成PMML文件2​​​​​​​。PySpark Notebook建模 -折线图​​​​​​​。TensorFlowNotebook建模​​​​​​​。R Notebook建模 - 散点图​​​​​​​。PySpark Notebook建模​​​​​​​。R Notebook获取训练数据集​​​​​​​。

datacreating的博客 1977

调试备忘录-SWD协议解析

目录--点击可快速直达 文章目录写在前面1  SWD协议简介2  SWD物理层协议解析2.1  SWD通信时序分析2.2  SWD 寄存器简介2.2.1  DP寄存器2.2.2  AP寄存器2.3  SWD通信流程2.3.1  SWD复位2.3.2  SWD读IDCODE2.3.3  SWD清除错误标志位,并且使能AP调试2.3.4  SWD读取AP IDR(也就是AP寄存器的ID CODE)2.3.5  SWD读写MCU任意寄存器 写在前面 最近由于公司需要,所以就做了个基于SWD协议的离线烧写器。由于.

洛神殇的博客 1万+

版本控制系统Fossil学习笔记

用最简单的方式解释 Fossil 的版本控制思路,即使你完全没接触过版本控制也能理解

m0_57855259的博客 1736

乌鸦搜索算法(CSA)详解:从鸟类智能到优化引擎

乌鸦搜索算法(Crow Search Algorithm,CSA)是2016年由Askarzadeh等人提出的一种新型元启发式优化算法,该算法灵感来源于自然界中乌鸦群体的智能觅食行为。这一创新性算法已成为群体智能优化算法家族中的重要成员,与粒子群优化、遗传算法等传统算法相比,CSA具有原理新颖、参数设置简单、全局搜索能力强等特点。

qq_42212808的博客 1278

SVN版本控制:从小白到实战高手的蜕变之路

本文系统介绍了SVN版本控制系统的使用指南,涵盖从基础概念到高级应用的完整知识体系。首先阐述了SVN作为集中式版本控制系统的工作原理和基本概念,详细讲解了服务器端与客户端的安装配置步骤。在实战操作部分,重点介绍了版本库创建、项目导入与检出、日常提交与更新等核心操作流程,并针对文件冲突等常见问题提供了解决方案。高级应用部分深入讲解了分支管理、权限控制和备份恢复等专业技巧。文章最后强调了版本控制在软件开发中的重要性,并展望了版本控制技术的发展趋势。

大雨淅淅的博客 1565

UE5 GAS 学习笔记 1.2游戏标签

这一节对GameplayTag游戏标签进行详细的讲解。

CloudHuCoding 1928

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【DataRecovery/GitOps】2026年度全量数据回滚与多重宇宙版本控制基准索引 (Phase 3-End & Phase 4-Start)

构建虚假的灾难场景(Elementals),骗取**最高权限密钥(EDITH)**的控制权。,切断中央服务器(Dreykov)对全球**潜伏僵尸进程(Widows)**的远程控制连接。:《神盾局特工 第六季》 (Agents of S.H.I.E.L.D. S6):《神盾局特工 第七季》 (Agents of S.H.I.E.L.D. S7)(修剪),最终揭示了**单一主干(Sacred Timeline)**的虚假性。替身镜像(Sarge)**引发的身份验证混乱。

2503_94697186的博客 799

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

版本控制的重要性及 Git 入门

版本控制的重要性及 Git 入门

1389

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

基于Matlab2025a实现Git管理代码

本文介绍了如何在最新版的Matlab2025a在使用git管理代码,还附上科研工作流指南。

m0_55795604的博客 811

Git分支管理完全指南:像专业人士一样工作

一文吃透 Git 核心:从基础操作到分支协作,新手也能快速上手的版本控制指南

好好学习,天天向上 1171

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 477
上一篇: 在数据库里玩“平行宇宙”:MatrixOne Data Branch 让数据也拥有Git 的分支/合并/对比/回滚(含跨集群同步)
下一篇: 矩阵起源 × 戴尔:用 MOI+“小魔盒” 破 AI 算力难题!
MatrixOrigin
博客等级 码龄5年 708粉丝 230原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值