移行を作成し、rake db:migrate
、これはdb/schema.rbのバージョン番号にぶつかりました。その後、git fetch Origin master
そして、私のチームメンバーからの変更があったことがわかりました。だから私はgit stash
およびgit rebase FETCH_HEAD
、その後にgit stash pop
。これにより、バージョン番号をめぐってdb/schema.rbで競合が発生しました。
Upstream>>>
ActiveRecord::Schema.define(:version => 20110930179257) do
===========
ActiveRecord::Schema.define(:version => 20110930161932) do
<<<Stashed
適切な修正は、バージョン番号をアップストリームよりも高い値に手動でインクリメントすることだと思います。
これは賢明なことですか、それとも悪い知らせですか?
ありがとう、マックス
現在のデータベースに正しいスキーマがある場合、次のことを行う必要があります。
保留中の移行を実行します(ある場合)
rake db:migrate
現在のデータベーススキーマからschema.rb
を上書きします
rake db:schema:dump
そしてコミット
この競合に気付いたときは、単にデータベースを移行します。保留中の移行があるかどうかにかかわらず、競合は修正されます。
この回答 によると、競合が保証されます。ユーザーは手動でマージし、バージョンを2つのうちの高い方に設定する必要があります。
Masterを機能ブランチにマージすると、db/schema.rbの競合がフェイルオーバーされます。
$ git merge --abort
$ git checkout master
$ rake db:drop db:create db:migrate
$ git checkout -- db/schema.rb
$ git checkout my_feature_branch
$ rake db:migrate
$ git add db/schema.rb
$ git commit -m 'Updated schema'
$ git merge master
アップストリームバージョンを受け入れ、通常どおりrake db:migrate
を実行します。
作成した移行(アップストリームバージョン20110930179257
の下)について心配する必要はありません。 ActiveRecordは、schema_migrations
テーブルを使用して、実行されたすべての移行を格納します。移行がリストになく、db/migrate
ディレクトリにある場合、ActiveRecordはそれらを実行します。
最新の移行の実行を定義するのは、実際には次の行であると考えがちです:ActiveRecord::Schema.define(:version => 20110930179257)
、それより下のバージョンの移行は実行されません。幸いにもそうではありません。 Railsは、db/migrate
フォルダーにあり、schema_migrations
テーブルにない移行を実行します。
~/bin/update-schema-rb
:
#!/usr/bin/env bash
git co master
bin/rake db:reset db:seed
git co -
bin/rake db:migrate
最善のアプローチはrake db:drop db:create db:migrate
現在のブランチにのみ存在する移行を使用してスキーマを再生成します。そうすれば、他のブランチからの移行がスキーマファイルに漏れることはなく、後でブランチを頻繁に切り替える場合に頭痛の種になります。
オプションは、追加のみの手動バージョンスクリプトを持つことです。そこで、あなたは衝突を望みます。スキーマは、その上にとどまらないと苦労するものです。一度噛まれると、恥ずかしがり屋になりますが、スキーマとルックアップ情報(顧客タイプのリスト)を追加のみの変更管理スキームで保持しても構いません。