跳至主要内容 跳至导航 跳至页脚
限时:设计合作伙伴计划,BUSINESS 套餐永久免费

分支:提交与回滚

将仓库状态冻结为不可变的提交,用分支命名,将任意提交检出为可写 fork。

分支:提交与回滚

像管理代码一样管理仓库版本。commit 将 fork 冻结为不可变镜像;branch 为其命名;checkout 将任意提交还原为全新可写 fork。本教程中,我们提交一个已知良好的状态,然后误删一张真实的 PostgreSQL 表,再用秒级回滚找回每一行数据。

观看教程

模型说明

提交、分支、检出

提交永不改变:它们甚至拒绝挂载。Fork 从不等待:checkout 是近乎即时的 reflink 克隆。完整的心智模型详见分支指南

创建检查点

标记文件让版本一目了然,真实数据库让回滚更有说服力:customers 表里有三行数据。

rdc term connect --machine <machine-name> --repository app:work --command 'echo v1 > version.txt && cat version.txt'

将状态的第一个版本写入工作 fork。

rdc term connect --machine <machine-name> --repository app:work --command 'docker exec db psql -U app -d app -c "SELECT count(*) FROM customers"'

该 fork 还运行着一个真实的 PostgreSQL 数据库,customers 表中有三行数据。

rdc repo commit --name app:work --message 'v1 baseline' --machine <machine-name>

提交工作 fork,包括数据库在内的完整 repository 状态被冻结为一个不可变的命名快照。

rdc repo branch --branch stable --name app:work

创建一个指向该提交的分支,为冻结状态起一个易读的名字。

提交捕获了一切:文件 PostgreSQL 数据目录。stable 分支现在指向这个冻结状态。

继续工作

rdc term connect --machine <machine-name> --repository app:work --command 'echo v2 > version.txt && cat version.txt'

继续工作,fork 发生变化,已提交的历史记录保持冻结。

灾难

一次危险的操作删掉了这张表。随后的查询证实损坏是真实的。

rdc term connect --machine <machine-name> --repository app:work --command 'docker exec db psql -U app -d app -c "DROP TABLE customers"'

危险操作在工作 fork 中删除了 customers 表。

rdc term connect --machine <machine-name> --repository app:work --command 'docker exec db psql -U app -d app -c "SELECT count(*) FROM customers"'

现在查询该表会失败:relation "customers" does not exist。数据确实从工作 fork 中消失了。

ERROR: relation "customers" does not exist。三行数据,消失了。现实中这是让人心跳骤停的时刻;在这里,它是反转剧情的铺垫。

rdc repo commit --name app:work --message 'v2 risky change' --machine <machine-name>

同样提交新状态,包括已删除的表,历史记录像 git log 一样增长。

rdc repo log --name app:work --machine <machine-name>

使用 repo log 查看提交历史,包括提交信息、作者和父提交。

历史记录了真实发生的一切,包括损坏状态:v2 risky change 在上,v1 baseline 在下。

秒级回滚

rdc repo checkout --ref stable --from app:work --tag rollback --machine <machine-name>

将 stable 分支检出到一个全新的可写 fork,得益于写时复制技术,几乎即时完成。

rdc repo up --name app:rollback --machine <machine-name>

启动回滚 fork,它与工作 fork 并行运行。

rdc term connect --machine <machine-name> --repository app:rollback --command 'cat version.txt'

读取回滚 fork 中的标记文件:第一个版本,与提交时完全一致。

rdc term connect --machine <machine-name> --repository app:rollback --command 'docker exec db psql -U app -d app -c "SELECT count(*) FROM customers"'

在回滚 fork 中查询 customers 表:三行数据,与提交时完全一致。回滚恢复的是整个数据库,而不仅仅是文件。

回滚 fork 读取的是 v1customers 表连同三行数据全部归位。回滚恢复的是数据库,不只是文件。没有任何内容被覆盖:工作 fork 仍保留版本二,视频在 VS Code 中同时打开两者以作证明。


下一篇:在线迁移