ブランチ: コミットとロールバック
コードのようにリポジトリをバージョン管理します。コミットはフォークを不変イメージに固めます。ブランチは名前をつけます。チェックアウトは任意のコミットを新しい書き込み可能なフォークに戻します。このチュートリアルでは既知の良い状態をコミットし、実際に PostgreSQL のテーブルを削除して、数秒で全行を復元します。
チュートリアル動画
モデル
コミットは決して変わりません。マウントすら拒否します。フォークは待ちません。チェックアウトはほぼ瞬時のリフリンクによるクローンです。完全なメンタルモデルはブランチングガイドにあります。
チェックポイントを作る
バージョンを目に見える形にするマーカーファイルと、ロールバックを意味のあるものにする実際のデータベースを用意します。customers テーブルには3行が入っています。
rdc term connect app:work@<machine-name> --command 'echo v1 > version.txt && cat version.txt' 作業中のforkに状態のバージョン1を書き込みます。
rdc term connect app:work@<machine-name> --command 'docker exec db psql -U app -d app -c "SELECT count(*) FROM customers"' このforkでは本物のPostgreSQLデータベースも動いています。customersテーブルには3行のデータがあります。
rdc repo commit app:work --message 'v1 baseline' 作業中のforkをcommitします。データベースを含むrepositoryの完全な状態が、不変の名前付きスナップショットとして保存されます。
rdc repo branch app:work --branch stable commitを指すブランチを作成します。フリーズされた状態に付ける、わかりやすい名前です。
コミットはファイルと PostgreSQL のデータディレクトリの両方をキャプチャします。stable ブランチがその固定された状態を指します。
作業を続ける
rdc term connect app:work@<machine-name> --command 'echo v2 > version.txt && cat version.txt' 作業を続けます。forkは変化しても、commitされた履歴はフリーズされたままです。
災害
危険な変更でテーブルが削除されます。クエリで被害が現実であることが確認されます。
rdc term connect app:work@<machine-name> --command 'docker exec db psql -U app -d app -c "DROP TABLE customers"' 危険な変更が作業中のforkのcustomersテーブルを削除します。
rdc term connect app:work@<machine-name> --command 'docker exec db psql -U app -d app -c "SELECT count(*) FROM customers"' テーブルへのクエリが失敗します。リレーション「customers」は存在しません。データは作業中のforkから本当に消えています。
ERROR: relation "customers" does not exist。3行が消えました。実際の現場ではお腹が沈む瞬間ですが、ここではその後の見せ場への前置きです。
rdc repo commit app:work --message 'v2 risky change' 削除されたテーブルを含む新しい状態もcommitします。履歴はgit logのように積み重なります。
rdc repo log app:work repo logでcommitの履歴をたどります。メッセージ、作成者、親情報が確認できます。
履歴には実際に起きたことが記録されます。壊れた状態も含めて:一番上に v2 risky change、その下に v1 baseline。
数秒でロールバックする
rdc repo checkout stable --from app:work --tag rollback stableブランチを新しい書き込み可能なforkにcheckoutします。copy-on-writeのおかげでほぼ瞬時に完了します。
rdc repo up app:rollback ロールバック用のforkを起動します。作業中のforkと並行して動作します。
rdc term connect app:rollback@<machine-name> --command 'cat version.txt' ロールバック用のforkのマーカーファイルを読み取ります。commitされたとおり、バージョン1です。
rdc term connect app:rollback@<machine-name> --command 'docker exec db psql -U app -d app -c "SELECT count(*) FROM customers"' ロールバック用のforkのcustomersテーブルにクエリを実行します。commitされたとおり3行あります。ロールバックはファイルだけでなく、データベースも復元しました。
ロールバックフォークは v1 を読み込み、customers テーブルが3行すべて揃って戻ります。ロールバックはファイルだけでなくデータベースを復元しました。何も上書きされていません。作業フォークにはバージョン2がそのまま残っており、動画では両方を VS Code で開いてそれを証明しています。
次: ライブマイグレーション