分支:提交与回滚
像管理代码一样管理仓库版本。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 读取的是 v1,customers 表连同三行数据全部归位。回滚恢复的是数据库,不只是文件。没有任何内容被覆盖:工作 fork 仍保留版本二,视频在 VS Code 中同时打开两者以作证明。
下一篇:在线迁移。