2011-09-30 28 views
46

マイグレーションを作成しました。rake db:migrateが実行され、db/schema.rbのバージョン番号が変更されました。それから私はgit fetch origin masterをして、私のチームメンバーから変更があったのを見ました。そこで私はgit stashgit rebase FETCH_HEADを行い、その後にgit stash popを続けました。これにより、バージョン番号に対するdb/schema.rbの競合が発生しました。Git操作で作成されたschema.rbの競合の管理

Upstream>>> 
ActiveRecord::Schema.define(:version => 20110930179257) do 
=========== 
ActiveRecord::Schema.define(:version => 20110930161932) do 
<<<Stashed 

適切な修正は、手動でアップストリームよりも高いバージョン番号を手動で増やすことだと思います。

これは賢明なことか悪いニュースですか?

おかげで、 マックス

+1

手動でバージョンをインクリメントし、自分の質問に答えるために番号は必要ではなく、おそらく悪い考えです。私が知ることから必要なのは、アップストリームのバージョン番号だけを受け入れることだけです。 – maxenglander

答えて

81

あなたの現在のデータベースが正しいスキーマを持っている場合は、あなたがすべき:

  • ランの移行(もしあれば)

    rake db:migrate 
    
  • からあなたのschema.rbを上書き保留現在のデータベーススキーマ

    rake db:schema:dump 
    
  • コミット

+0

私の状況でこれが動作するかどうかわかりません。私は上流からの移行を保留中でした。 – maxenglander

+10

あなたが保留中の移行を持っている場合は、 'rake db:schema:dump'を実行してください – Xorlev

+0

これは、リモートのバージョンが高い場合、schema.rbのバージョンに変更を加えずにプル要求を作成しませんか? –

0

オプションは、添加剤だけでマニュアルバージョンスクリプトを持つことです。そこには葛藤があります。スキーマは、あなたがそれの上に保持しない場合は、あなたを苦しめるものです。だから、噛んだら、2回恥ずかしがり屋です。私は、スキーマと参照情報(顧客タイプのリスト)を、相加的な変更管理スキームで保持しても構いません。

6

this answerによれば、競合が保証されます。ユーザーは手動でマージし、2つのうち高い方をバージョンとして設定する必要があります。

16

この競合が発生したとき、私は単にデータベースを移行します。保留中の移行の有無にかかわらず、競合は修正されます。

+0

ベストアンサー、ありがとう – dowi

0

rake db:drop db:create db:migrateを実行して、現在のブランチにのみ存在する移行を使用してスキーマを再生成するのが最善の方法だと思います。そうすることで、他のブランチからの移行がスキーマファイルに漏れず、後で頭痛を与えることがあります。

$ 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 
2

は私の機能ブランチにマスターをマージすることはデシベル/ schema.rbにおける紛争の上に失敗したときに、私は何をすべきかだ

#!/usr/bin/env bash 

git co master 
bin/rake db:reset db:seed 
git co - 
bin/rake db:migrate 
1

~/bin/update-schema-rb:ここ

関連する問題