メインコンテンツにスキップ ナビゲーションにスキップ フッターにスキップ
期間限定:デザインパートナープログラム。BUSINESSプランはずっと無料

ブランチ: コミットとロールバック

リポジトリの状態を不変のコミットとして固め、ブランチで名前をつけ、任意のコミットを書き込み可能なフォークとしてチェックアウトします。

ブランチ: コミットとロールバック

コードのようにリポジトリをバージョン管理します。コミットはフォークを不変イメージに固めます。ブランチは名前をつけます。チェックアウトは任意のコミットを新しい書き込み可能なフォークに戻します。このチュートリアルでは既知の良い状態をコミットし、実際に PostgreSQL のテーブルを削除して、数秒で全行を復元します。

チュートリアル動画

モデル

コミット、ブランチ、チェックアウト

コミットは決して変わりません。マウントすら拒否します。フォークは待ちません。チェックアウトはほぼ瞬時のリフリンクによるクローンです。完全なメンタルモデルはブランチングガイドにあります。

チェックポイントを作る

バージョンを目に見える形にするマーカーファイルと、ロールバックを意味のあるものにする実際のデータベースを用意します。customers テーブルには3行が入っています。

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

作業中のforkに状態のバージョン1を書き込みます。

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テーブルには3行のデータがあります。

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

作業中のforkをcommitします。データベースを含むrepositoryの完全な状態が、不変の名前付きスナップショットとして保存されます。

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

commitを指すブランチを作成します。フリーズされた状態に付ける、わかりやすい名前です。

コミットはファイルと PostgreSQL のデータディレクトリの両方をキャプチャします。stable ブランチがその固定された状態を指します。

作業を続ける

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

作業を続けます。forkは変化しても、commitされた履歴はフリーズされたままです。

災害

危険な変更でテーブルが削除されます。クエリで被害が現実であることが確認されます。

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"'

テーブルへのクエリが失敗します。リレーション「customers」は存在しません。データは作業中のforkから本当に消えています。

ERROR: relation "customers" does not exist。3行が消えました。実際の現場ではお腹が沈む瞬間ですが、ここではその後の見せ場への前置きです。

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

削除されたテーブルを含む新しい状態もcommitします。履歴はgit logのように積み重なります。

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

repo logでcommitの履歴をたどります。メッセージ、作成者、親情報が確認できます。

履歴には実際に起きたことが記録されます。壊れた状態も含めて:一番上に v2 risky change、その下に v1 baseline

数秒でロールバックする

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

stableブランチを新しい書き込み可能なforkにcheckoutします。copy-on-writeのおかげでほぼ瞬時に完了します。

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のマーカーファイルを読み取ります。commitされたとおり、バージョン1です。

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テーブルにクエリを実行します。commitされたとおり3行あります。ロールバックはファイルだけでなく、データベースも復元しました。

ロールバックフォークは v1 を読み込み、customers テーブルが3行すべて揃って戻ります。ロールバックはファイルだけでなくデータベースを復元しました。何も上書きされていません。作業フォークにはバージョン2がそのまま残っており、動画では両方を VS Code で開いてそれを証明しています。


次: ライブマイグレーション