はじめに
マイグレーションを実行したコミットをgit revertした際に事後対応が必要となったため、その対応について記録します。
git revert
後の状態
- マイグレーションファイルが削除済みになる(Vscode上)
- マイグレーションのStatusが「up」でMigration Nameが「****** NO FILE ******」になる
$ rails db:migrate:status
Status Migration ID Migration Name
--------------------------------------------------
up 20240412075830 Remove hoge from fuga
up 20250401071535 ********** NO FILE **********
対応
手順
1. ダミーファイルを作成し、「***** NO FILE *****」と置き換える
2. ダミーファイルのマイグレーションStatusを「down」に変更する
3. ダミーファイルを削除する
手順の解説
1. ダミーファイルを作成し、「***** NO FILE *****」と置き換える
- ダミーファイルを作成
- ファイル名は「**** NO FILE ****」のMigration IDをコピペし、[Migration ID]_[任意の名前].rbとする
- ファイルの中身は空のメソッドなどを書く
$ touch db/migrate/20250401071535_piyo.rb
# 20250401071535_piyo.rb
class Piyo < ActiveRecord::Migration[6.0]
def change
end
end
- 「***** NO FILE *****」とダミーファイルが置き換わっていることを確認
$ rails db:migrate:status
Status Migration ID Migration Name
--------------------------------------------------
up 20240412075830 Remove hoge from fuga
up 20250401071535 Piyo
2. ダミーファイルのマイグレーションStatusを「down」に変更する
- マイグレーションStatusを「down」に変更する
$ rails db:migrate:down VERSION=20250401071535
- 「down」に変更されていることを確認する
$ rails db:migrate:status
Status Migration ID Migration Name
--------------------------------------------------
up 20240412075830 Remove hoge from fuga
down 20250401071535 Piyo
3. ダミーファイルを削除する
- 削除する
$ rm db/migrate/20250401071535_piyo.rb
- ステータスからも削除されていることを確認する
$ rails db:migrate:status
Status Migration ID Migration Name
--------------------------------------------------
up 20240412075830 Remove hoge from fuga
その他
マイグレーションは実行したい場合
-
git revert
したコミットの中にマイグレーションを含む複数の変更があり、マイグレーションは実行したいが、その他の変更はrevertした状態のままにしたい場合を想定 - 上記の対応手順のダミーファイルを元のマイグレーションファイル名と中身で作成する
- 手順3のダミーファイルの削除の代わりに
rails db: migrate
を実行する
git revertを取り消したい場合(適切な手順ではないと思いますが、下記を実行した際の記録です)
- リモートリポジトリのHEADに合わせて巻き戻す
$ git reset --hard origin/[リモートリポジトリ名]
- マイグレーションstatusを確認する
$ rails db:migrate:status
Status Migration ID Migration Name
--------------------------------------------------
up 20240412075830 Remove hoge from fuga
down 20250401071535 Add foreign key constraint to active storage attachments for blob idactive storage
- マイグレーションを実行する
$ rails db:migrate
- マイグレーションstatusが「up」になったことを確認する
$ rails db:migrate:status
Status Migration ID Migration Name
--------------------------------------------------
up 20240412075830 Remove detail date from bill details
up 20250401071535 Add foreign key constraint to active storage attachments for blob idactive storage
おわりに
マイグレーションを含むコミットをリバートすると事後対応が必要になることが分かりました。後先を考えずにリバートを使わないよう気を付けたいと思います。