🤖

Railsでブランチを行き来して開発していてマイグレーションに変更がある場合の対応方法

2021/03/07に公開

はじめに

実務で開発をしているとブランチを行き来しなければならない場合はよくあると思います。
その場合、コミットしていないファイルについてはgit stashで対応できますが、マイグレーションに変更がある場合はその対応も必要になるかと思います。
今回はそういった場合にどのように対応すればよいかを書いていきます。

前提

  • mainブランチからトピックブランチにチェックアウトして開発している
  • トピックブランチでマイグレーションを変更し、rails db:migrateを実行している
  • その後別のトピックブランチで作業する必要があり、マイグレーションを戻したい

現在のマイグレーションの状態を確認する

まずは以下のコマンドで現在のマイグレーションの状態を確認しましょう。

rails db:migrate:status

database: sample

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210304000000  xxxxxxx
   up     20210305000000  xxxxxxx
   up     20210306000000  xxxxxxx
   up     20210307000000  xxxxxxx

Statusupであればマイグレーションが実行済み、downであれば未実行です。
一番下のup 20210307000000 xxxxxxxがトピックブランチで変更したマイグレーションだとします。
マイグレーションを戻すには、一番下のup 20210307000000 xxxxxxxdown 20210307000000 xxxxxxxにする必要があります。

マイグレーションを戻す

マイグレーションを戻すには以下のコマンドを実行します。

rails db:rollback

マイグレーションの状態を確認すると、意図した結果が得られているはずです。

rails db:migrate:status

database: hoge

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210304000000  xxxxxxx
   up     20210305000000  xxxxxxx
   up     20210306000000  xxxxxxx
  down    20210307000000  xxxxxxx

また、rails:db:rollbackを実行するとscheme.rbが書き換わるので、その変更を破棄、またはgit stashしてから別のトピックブランチに移動しましょう。

ちなみにSTEP=nでいくつマイグレーションを戻すか指定できます。
以下の例では一番下から3つのマイグレーションがdownになります。

rails db:rollback STEP=3

rails db:migrate:status

database: hoge

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210304000000  xxxxxxx
  down    20210305000000  xxxxxxx
  down    20210306000000  xxxxxxx
  down    20210307000000  xxxxxxx

おわりに

もう一度最初のトピックブランチに戻った時にはrails db:migrateを実行して、マイグレーションを元に戻せばOKです。

Discussion