“ロールバック”と“リバート”は、システム、コード、またはデータを以前の状態に戻すことを意味する用語です。開発において、これはバージョン管理システム、データベース、デプロイメントメカニズムに組み込まれた基本的な操作です。Gitドキュメントによると、ロールバック操作には安全なもの(新しいコミットを作成するrevert)と破壊的なもの(履歴を失うreset)があります。これらの違いを理解することで、以前のバージョンに戻す際のデータ損失を防ぐことができます。
重要なポイント
ロールバック とは、システムを以前の安定した状態に戻す操作です。開発の文脈では、Gitでのコミットの取り消し、データベーストランザクションのロールバック、サーバー上のアプリケーションの以前のバージョンへの復帰などを意味します。この用語は英語の“rollback”に由来し、すべてのプラットフォームの開発者の語彙にしっかりと定着しています。
ロールバックの必要性は、新しい変更が機能を壊したり、エラーを引き起こしたり、品質チェックに合格しなかったりした場合に生じます。よく組織された開発プロセスでは、ロールバックは失敗の兆候ではなく、ワークフローに組み込まれた標準的な手順です。チームが問題のある変更を迅速にロールバックできるほど、ユーザーへのバグの影響は小さくなります。
さまざまなツールが異なるロールバックメカニズムを提供しています。Gitは安全なrevertと破壊的なresetの選択肢を提供し、データベースはトランザクションロールバックをサポートし、CI/CDシステムはバージョン間でトラフィックを切り替えることができます。アプローチの選択は、コンテキストと変更履歴の保存要件によって異なります。
Git revert は、以前の変更を元に戻す新しいコミットを作成する安全なロールバック方法です。履歴は線形のままで、古いコミットはすべて保存されます。これは、複数の開発者が作業する共有ブランチで元に戻すための唯一の正しい選択です。Git revertは履歴を削除しません — ロールバックの事実を新しい変更として追加します。
Git reset は、現在のブランチポインタを指定されたコミットに移動し、後続のすべての変更を破棄します。フラグ(soft、mixed、hard)に応じて、resetはワーキングディレクトリとインデックスを異なる方法で処理します。hardモードは履歴から変更を完全に削除するため、共有ブランチでは危険であり、ローカル作業にのみ適しています。
Revert は共有ブランチ(main、develop、release)で使用します。履歴を保存し、他の開発者が変更が元に戻されたことを理解できるようにします。revert後は安全にgit pullを実行できます — システムは書き換えられた履歴に関連する競合を発生させません。チーム作業では、revertがデフォルトの標準です。
# 新しいコミットを作成して最後のコミットを取り消す
git revert HEAD
# ハッシュで特定のコミットを取り消す
git revert a1b2c3d
Reset は、まだ変更を公開していないローカルブランチで適切です。実験していて履歴を完全にクリーンにしたい場合 — reset hardで実現できます。ローカルブランチでは、reset mixedを使用してコミットを元に戻しながら、ワーキングディレクトリに変更を保持して再コミットすることができます。
# 最後のコミットを取り消し、ワーキングディレクトリの変更を保持する
git reset HEAD~1
# 完全に取り消す — 変更は完全に削除される
git reset --hard HEAD~2
トランザクションロールバック は、現在のトランザクション内で行われたすべての変更を元に戻し、データベースをトランザクション開始時の状態に戻す操作です。これにより、原子性が保証されます — ACIDの4つの原則(Atomicity、Consistency、Isolation、Durability)の1つです。トランザクションのどの段階でエラーが発生しても、ロールバックが実行され、データは元の状態に戻ります。
ロールバックメカニズムは書き込み先行ログ(WAL)を介して実装されます。データページを変更する前に、DBMSはログに古い値と新しい値を書き込みます。ロールバック中、システムはログを読み取り、変更されたすべてのページの元の値を復元します。これにより、停電が発生した場合でも、トランザクションを正しく元に戻すことができます。
BEGIN TRANSACTION;
UPDATE accounts
SET balance = balance - 100
WHERE id = 1;
-- Rollback on error
ROLLBACK;
長いトランザクションでは、セーブポイントを使用すると便利です — トランザクション全体を完了せずにロールバックできる中間保存ポイントです。これにより、複雑な操作内でエラーを処理しながら、他の部分の進行状況を失うことはありません。セーブポイントは、PostgreSQL、MySQL、Oracleなど、ほとんどのリレーショナルDBMSでサポートされています。
SAVEPOINT sp1;
UPDATE orders SET status = 'cancelled'
WHERE id = 42;
ROLLBACK TO sp1;
デプロイメントロールバック は、失敗したデプロイメントの後、実行中のアプリケーションを以前のバージョンに戻すことです。これは本番環境にとって重要な機能です。復旧時間(MTTR)はSLAとユーザーエクスペリエンスに直接影響します。最新のプラットフォームは、アーキテクチャと可用性の要件に応じて、いくつかのロールバック戦略を提供しています。
Blue-green は、2つの同一環境(blue:現在のバージョン、green:新しいバージョン)が同時に実行される戦略です。デプロイメント成功後、トラフィックはgreenに切り替わります。新しいバージョンが正しく動作しない場合、トラフィックスイッチはblueに戻ります。ロールバックは即座に実行され、再デプロイメントは不要です — ルーティングを変更するだけです。
Canaryデプロイメント は、トラフィックのごく一部を新しいバージョンに送り、メトリクス(エラー率、応答時間、成功リクエストの割合)を監視します。メトリクスが悪化すると、システムは自動的にcanaryをロールバックし、すべてのトラフィックを安定バージョンに送ります。Kubernetesとサービスメッシュ(Istio、Linkerd)はこの戦略を標準サポートしています。
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 10
strategy:
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
開発者が変更をロールバックする必要がある3つの典型的なシナリオを見てみましょう。各シナリオには、ターミナルでの簡単なコマンドからCI/CDを伴う複数ステップの手順まで、独自のアプローチが必要です。
誤ってバグを含むコミットをmainにプッシュしてしまいました。チームの履歴を失わずに変更をロールバックすることが目標です。git revertを使用して元に戻すコミットを作成し、git pushを実行します。チームメンバー全員がロールバックを確認し、競合なしで作業を続行できます。これが最も安全で透明性の高い方法です。
git checkout main
git pull origin main
git revert HEAD
git push origin main
データベースマイグレーションが失敗し、一部のデータが破損しました。マイグレーションスクリプトでトランザクションロールバックを使用し、既に適用された変更についてはバックアップから復元します。適切に設計されたシステムでは、各マイグレーションはトランザクションでラップされています — エラー時にはDBMSが自動的にロールバックを実行します。
新しいバージョンをデプロイした後、認証が機能していないことに気付きました。blue-greenを使用している場合、ロールバックはルーターを元に戻すだけです。ローリングアップデートの場合 — kubectl rollout undoコマンドで以前のバージョンに戻ります。理想的には、ロールバックプロセスは自動化され、1分以内で完了する必要があります。
よくある質問
Revert は変更を元に戻す新しいコミットを作成し、履歴を保持します。Resetはブランチポインタを後方に移動し、コミットを削除できます。共有ブランチでは、revertのみを使用してください。
コミットがGitのガベージコレクションで収集されていない場合、git reflogを介して復元できます。ただし、ガベージコレクション後は復元が不可能になります。--hardはローカルブランチでのみ使用してください。
Rollback は、書き込み先行ログ(WAL)を使用して現在のトランザクションで行われたすべての変更を元に戻します。DBMSは変更されたすべてのデータページの元の値を復元します。
セーブポイント は、トランザクション内の中間保存ポイントです。トランザクション全体をキャンセルせずに、部分的にロールバックできます。複数のステップを持つ長い操作で便利です。
デプロイメント後にヘルスチェックとメトリクス監視を設定します。エラーしきい値を超えた場合、スクリプトまたはSpinnaker、ArgoCD、GitLab Auto Rollbackなどのツールを介して自動ロールバックをトリガーします。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。